你能阻止SndVol显示空音频会话吗?

时间:2009-04-04 19:44:18

标签: com windows-7 audio

我一直在玩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代码进行建设性批评。

1 个答案:

答案 0 :(得分:1)

如果要监视音频会话内容,则应使用IAudioSessionManager接口检索IAudioSessionControl对象。会话只在SndVol中显示,当它从非活动状态转换为活动状态时 - 当有人调用IAudioClient :: Start()时会发生 - 只要你不调用IAudioClient :: Start你不应该得到一个会话滑块。

在Windows 7中,有一组新的API(IAudioSessionManager2)允许您监听会话创建和销毁。

对于Windows 7,还有AUDCLNT_SESSIONFLAGS_HIDE标志(此文档尚未更新,但它位于标题中)