如何将每个节目/音频会话的音量级别设置为0到100的标量?
如您所见,在下面的代码中,我找到了GetPeakValue函数,但它返回的值如0.0812654或0.021352.
我确信这些值是标量中从1.0到0.0的每个音频会话的音量.但我想要的是音量限制,你可以在windows音频混音器中设置,例如,而不是当前级别.因此,如果我将程序音量设置为50%,我想要一个像0.5的值.
在第二个函数(getVolume)中,您将看到我已经在0-100标量中获得了主卷,但是端点设备已经具有标量级别的函数.所以我至少需要相同的函数或计算,以便为每个音频会话获得这样的标量.
voID getSessions() { CoInitialize(NulL); IMMDeviceEnumerator *pDeviceEnumerator = NulL; IMMDevice *pDevice = NulL; IAudioSessionManager2 *pAudioSessionManager2 = NulL; IAudioSessionEnumerator *pAudioSessionEnumerator = NulL; CoCreateInstance(__uuIDof(MMDeviceEnumerator),NulL,CLSCTX_INPROC_SERVER,__uuIDof(IMMDeviceEnumerator),(LPVOID *)&pDeviceEnumerator); pDeviceEnumerator->GetDefaultAudioEndpoint(eRender,eConsole,&pDevice); pDevice->Activate(__uuIDof(IAudioSessionManager2),CLSCTX_ALL,(voID **) &pAudioSessionManager2); pAudioSessionManager2->GetSessionEnumerator(&pAudioSessionEnumerator); int nSessionCount; pAudioSessionEnumerator->GetCount(&nSessionCount); std::cout << "Session Count: " << nSessionCount << std::endl; while (true) { for (int nSessionIndex = 0; nSessionIndex < nSessionCount; nSessionIndex++) { IAudioSessionControl *pSessionControl = NulL; if (Failed(pAudioSessionEnumerator->GetSession(nSessionIndex,&pSessionControl))) continue; IAudioMeterinformation *pAudioMeterinformation = NulL; pSessionControl->queryInterface(&pAudioMeterinformation); float fPeak = NulL; pAudioMeterinformation->GetPeakValue(&fPeak); std::cout << "fPeak Value: " << fPeak << std::endl; } std::cout << "\n\n"; Sleep(1000); } CoUninitialize();}double getVolume() { float currentVolume = 0; CoInitialize(NulL); IMMDeviceEnumerator *deviceEnumerator = NulL; CoCreateInstance(__uuIDof(MMDeviceEnumerator),(LPVOID *)&deviceEnumerator); IMMDevice *defaultDevice = NulL; deviceEnumerator->GetDefaultAudioEndpoint(eRender,&defaultDevice); deviceEnumerator->Release(); deviceEnumerator = NulL; IAudioEndpointVolume *endpointVolume = NulL; defaultDevice->Activate(__uuIDof(IAudioEndpointVolume),(LPVOID *)&endpointVolume); defaultDevice->Release(); defaultDevice = NulL; float fLevel; endpointVolume->GetMasterVolumeLevel(&fLevel); qDeBUG() << "FLevel: "; qDeBUG() << fLevel; endpointVolume->GetMasterVolumeLevelScalar(¤tVolume); endpointVolume->Release(); CoUninitialize(); return (double)(currentVolume * 100);}解决方法 好的,我找到了解决问题的方法!
我不得不在SessionControl上调用queryInterface来访问ISimpleAudioVolume,您可以在其中使用GetMasterVolume和SetMasterVolume函数.它是0-1标量,但你可以将它乘以100得到0-100标量.如果系统的主音量为50%,如果程序音量也为50%,则输出为1,因此输出基于系统的主音量!
感谢您的每一条评论和帮助!
这里的工作代码:
voID getSessions() { CoInitialize(NulL); IMMDeviceEnumerator *pDeviceEnumerator; IMMDevice *pDevice; IAudioSessionManager2 *pAudioSessionManager2; IAudioSessionEnumerator *pAudioSessionEnumerator; CoCreateInstance(__uuIDof(MMDeviceEnumerator),(voID **) &pAudioSessionManager2); pAudioSessionManager2->GetSessionEnumerator(&pAudioSessionEnumerator); int nSessionCount; pAudioSessionEnumerator->GetCount(&nSessionCount); while (true) { for (int nSessionIndex = 0; nSessionIndex < nSessionCount; nSessionIndex++) { IAudioSessionControl *pSessionControl; if (Failed(pAudioSessionEnumerator->GetSession(nSessionIndex,&pSessionControl))) continue; ISimpleAudioVolume *pSimpleAudioVolume; pSessionControl->queryInterface(&pSimpleAudioVolume); float fLevel; pSimpleAudioVolume->GetMasterVolume(&fLevel); std::cout << "fLevel Value: " << fLevel << std::endl; } Sleep(1000); } CoUninitialize();}总结
以上是内存溢出为你收集整理的c – 如何将系统音量级别设置为从0到100的标量?全部内容,希望文章能够帮你解决c – 如何将系统音量级别设置为从0到100的标量?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)