【问题标题】:Can you prevent SndVol from displaying empty audio session?你能阻止 SndVol 显示空的音频会话吗?
【发布时间】: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 代码提出建设性的批评。

【问题讨论】:

    标签: com windows-7 audio


    【解决方案1】:

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

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

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

    【讨论】:

    • 我肯定不会调用 IAudioClient:Start(),但会话显示在 SndVol 中。我看起来像通过 IAudioSessionControl::RegisterAudioSessionNotification(...) 安装事件处理程序来激活会话。至少在 Windows 7 build 7000 上。
    • IAudioSessionManager2::RegisterSessionNotification() 似乎不起作用。我没有收到任何进程的新会话通知,包括安装进程。您对此有一些了解吗?在 Windows 7 build 7000 上运行。
    • 我不知道为什么它不起作用 - 这与 sndvol 内部使用的机制相同 - 我们只是公开了 API。
    • 我会假设我搞砸了我的使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多