Страницы

Поиск по вопросам

понедельник, 13 апреля 2020 г.

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

#c #windows #winapi #windows_7 #аудио

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

Можете написать пример?
Желательно, чтобы скомпилился  на minGW.  
    


Ответы

Ответ 1



Нашел хороший пример на MSDN: How to Use Wave Audio Volume Control APIs, есть как получение громкости, так и установка. Данный пример дает нужный результат на версиях WIndows ниже Vista. В Windows Vista и 7 были представлены новые API для работы с аудио, для изменения громкости глобально нужно использовать интерфейс IAudioEndpointVolume. Небольшой пример использования есть также в MSDN и на CodeProject:

Ответ 2



Анимированое изменение звука системы Win7 C++ visual studio 10 #include #include #include #pragma comment(lib, "ole32.lib") //extern bool ChangeVolume(double nVolume,bool bScalar) { HRESULT hr=NULL; bool decibels = false; bool scalar = false; double newVolume=nVolume; CoInitialize(NULL); 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; IAudioEndpointVolume *endpointVolume = NULL; hr = defaultDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume); defaultDevice->Release(); defaultDevice = NULL; // ------------------------- float currentVolume = 0; endpointVolume->GetMasterVolumeLevel(¤tVolume); //printf("Current volume in dB is: %f\n", currentVolume); hr = endpointVolume->GetMasterVolumeLevelScalar(¤tVolume); //CString strCur=L""; //strCur.Format(L"%f",currentVolume); //AfxMessageBox(strCur); // printf("Current volume as a scalar is: %f\n", currentVolume); if (bScalar==false) { hr = endpointVolume->SetMasterVolumeLevel((float)newVolume, NULL); } else if (bScalar==true) { hr = endpointVolume->SetMasterVolumeLevelScalar((float)newVolume, NULL); } endpointVolume->Release(); CoUninitialize(); return FALSE; } float i = 0; int main() { float volume = 0; while(1) { i+=0.01; volume = (sin(i)+1)/2; ChangeVolume(volume,1); std::cout< #include #include #pragma comment(lib, "ole32.lib") //extern //Управление звуком class VolumeOS { public: HRESULT hr; bool decibels; bool scalar; double Volume; VolumeOS() { hr=NULL; decibels = false; scalar = false; CoInitialize(NULL); //newVolume=nVolume; } bool VolumeSET(double nVolume,bool bScalar) { double newVolume = nVolume; Volume = newVolume; 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; IAudioEndpointVolume *endpointVolume = NULL; hr = defaultDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume); defaultDevice->Release(); defaultDevice = NULL; // ------------------------- float currentVolume = 0; endpointVolume->GetMasterVolumeLevel(¤tVolume); //printf("Current volume in dB is: %f\n", currentVolume); hr = endpointVolume->GetMasterVolumeLevelScalar(¤tVolume); //CString strCur=L""; //strCur.Format(L"%f",currentVolume); //AfxMessageBox(strCur); // printf("Current volume as a scalar is: %f\n", currentVolume); if (bScalar==false) { hr = endpointVolume->SetMasterVolumeLevel((float)newVolume, NULL); } else if (bScalar==true) { hr = endpointVolume->SetMasterVolumeLevelScalar((float)newVolume, NULL); } endpointVolume->Release(); return FALSE; } ~VolumeOS() { CoUninitialize(); } }; float i = 0; int main() { VolumeOS A; float volume = 0; while(1) { i+=0.01; volume = (sin(i)+1)/2; A.VolumeSET(volume,true); std::cout<

Комментариев нет:

Отправить комментарий