【发布时间】:2010-10-17 14:09:56
【问题描述】:
我一直在玩 Vista 的 CoreAudio 东西,尤其是 IAudioSessionEvents,目的是监控默认音频会话是否因加载的代码而导致音量变化。
但是,一旦您安装了 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 代码提出建设性的批评。
【问题讨论】: