0

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

4

1 回答 1

1

如果你想监控音频会话的东西,你应该使用 IAudioSessionManager 接口来检索你的 IAudioSessionControl 对象。会话仅在从非活动状态转换为活动状态时才会在 SndVol 中显示 - 当有人调用 IAudioClient::Start() 时会发生这种情况 - 只要您不调用 IAudioClient::Start 您不应该获得会话滑块。

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

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

于 2009-04-04T20:24:44.290 回答