我一直在玩Vista 的CoreAudio 东西,特别是IAudionSessionEvents,目的是监控默认音频会话,以了解加载代码引起的音量变化。
但是,一旦您安装了 IAudioSessionEvents 侦听器,SndVol 就会列出该程序以及所有相关的音量控制。大部分时间都没有加载实际播放任何内容的代码,这不太理想。
基本上,有什么方法可以监控默认音频会话而不导致 SndVol 列出它?
首选 Vista 的解决方案,但依赖于 Windows 7 中提供的新 api 的东西总比没有好。
Larry Osterman 指出了在 Windows 7 中添加的 ISessionManager2 和 IAudioSessionNotification 接口。但是,我从未收到新会话的通知。有人知道 Windows 7 build 7000 下这个 API 的问题或问题吗?
注册 IAudioSessionNotifications 的代码,省略了很多错误检查代码*:
BOOL success = false;
HRESULT hr;
IMMDeviceEnumerator *pEnumerator = NULL;
IMMDevice *pDevice = NULL;
IAudioSessionManager2* pManager = NULL;
IClassFactory* pFactory = NULL;
hr = CoInitialize(NULL);
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnumerator);
hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);
pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void**)&pManager);
listener = NULL;
hr = CoGetClassObject(CLSID_CustomFactory, CLSCTX_ALL, NULL, __uuidof(IClassFactory), (void**)&pFactory);
hr = pFactory->CreateInstance(NULL, __uuidof(IAudioSessionNotification), (void**)&listener);
hr = pManager->RegisterSessionNotification(listener);
*虽然不是这个问题的目的,但欢迎对我的 COM 代码提出建设性的批评。