我一直在玩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代码进行建设性批评。
答案 0 :(得分:1)
如果要监视音频会话内容,则应使用IAudioSessionManager接口检索IAudioSessionControl对象。会话只在SndVol中显示,当它从非活动状态转换为活动状态时 - 当有人调用IAudioClient :: Start()时会发生 - 只要你不调用IAudioClient :: Start你不应该得到一个会话滑块。
在Windows 7中,有一组新的API(IAudioSessionManager2)允许您监听会话创建和销毁。
对于Windows 7,还有AUDCLNT_SESSIONFLAGS_HIDE标志(此文档尚未更新,但它位于标题中)