undermuz
@undermuz
Full-Stack Developer

Как правильно регулировать уровень громкости?

У меня получилось использовать только через winmm.dll, но в windows 10 звук регулируется только у приложения, а мне нужно регулировать общий уровень громкости.

[DllImport("winmm.dll")]
 public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);
...
waveOutSetVolume(IntPtr.Zero, NewVolumeAllChannels);


По описанию этой функции она принимает указатель на устройство вывода, но как его получить ?

так же пробовал через NAudio, но он отказался работать на windows 10. + перепробовал почти все способы на stackoverflow
  • Вопрос задан
  • 1243 просмотра
Пригласить эксперта
Ответы на вопрос 1
Nipheris
@Nipheris Куратор тега C#
Спасибо за суммон.
В Висте и выше архитектура аудио подсистемы была переработана, поэтому современным API считается WASAPI, а WINMM считается устаревшим.
Можно разобрать следующий пример: blogs.msdn.com/b/larryosterman/archive/2007/03/06/...

Необходимые хедеры:
#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>


Запустим COM:
CoInitializeEx(NULL, COINIT_MULTITHREADED);

Создадим перечислитель устройств:
IMMDeviceEnumerator *deviceEnumerator = NULL;
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator);


Вытащим дефолтовый девайс:
IMMDevice *defaultDevice = NULL;
hr = deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &defaultDevice);
deviceEnumerator->Release();
deviceEnumerator = NULL;


Получим интерфейс для работы с громкостью (этот интерфейс полезен именно для работы с master-громкостью устройства):
IAudioEndpointVolume *endpointVolume = NULL;
hr = defaultDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);
defaultDevice->Release();
defaultDevice = NULL;


Получим предыдущее значение громкости:
float currentVolume = 0;
endpointVolume->GetMasterVolumeLevel(&currentVolume);


Установим новое значение громкости:
hr = endpointVolume->SetMasterVolumeLevel((float)newVolume, NULL);


P.S. Не сразу обратил внимание, что у вас C#, постараюсь скорректировать ответ вечером.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы