【问题标题】:IAudioSessionNotification, anyone have working code?IAudioSessionNotification,有人有工作代码吗?
【发布时间】:2010-10-25 22:19:35
【问题描述】:

现在我已经安装了 RC,我正在挑选一些我在 Windows 7 Beta 中搞砸的实验性代码。

基本上,我试图让IAudioSessionManager2IAudioSessionNotification 一起工作,以通知我的小应用程序创建的每个新音频会话。

AudioListener(公共IAudioSessionNotification)中的核心代码:

//This is mostly lifted from MSDN
HRESULT STDMETHODCALLTYPE AudioListener::QueryInterface(REFIID riid, void** ppvObject)
{
    if(riid == __uuidof(IUnknown))
    {
        *ppvObject = (IUnknown*)this;
        return S_OK;
    }

    if(riid == __uuidof(IAudioSessionNotification))
    {
        *ppvObject = (IAudioSessionNotification*)this;
        return S_OK;
    }

    *ppvObject = NULL;

    return E_NOINTERFACE;
}

//m_hwnd, and WM_SESSION_CREATED are set to good values
//WM_SESSION_CREATEd via RegisterWindowMessage(...)
HRESULT STDMETHODCALLTYPE AudioListener::OnSessionCreated(IAudioSessionControl *pSession)
{
    PostMessage(m_hwnd, WM_SESSION_CREATED, (WPARAM)pSession, 0);

    return S_OK;
}

注册我的监听器的代码:

BOOL RegisterMonitor(HWND target)
{
    BOOL success = false;

    HRESULT res;
    IMMDevice* pDevice;
    IMMDeviceEnumerator* pEnumerator;

    SESSION_LISTENER = NULL;
    SESSION = NULL;

    res = CoInitialize(NULL);

    if(res != S_OK && res != S_FALSE)
        return false;

    SESSION_LISTENER = new AudioListener(target);

    res = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnumerator);
    if(res != S_OK)  goto Exit;

    res = pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);
    if(res != S_OK)  goto Exit;

    res = pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void**)&SESSION);
    if(res != S_OK)  goto Exit;

    res = SESSION->RegisterSessionNotification(SESSION_LISTENER);
    if(res != S_OK)  goto Exit;

    success = true;

Exit:
    SAFE_RELEASE(pEnumerator);
    SAFE_RELEASE(pDevice);
    if(!success)
    {
        SAFE_RELEASE(SESSION_LISTENER);
        SAFE_RELEASE(SESSION);
    }

    return success;
}

RegisterMonitor(...) 返回 true,但从未收到任何通知。我一直在通过启动带有轻微音效的小应用程序并触发它们(Soltaire、Minesweeper 等)进行测试,确认它们会在我期待看到通知时出现在SndVol

基本上,有没有人看到我做错了什么?

【问题讨论】:

    标签: c++ windows com windows-7 audio


    【解决方案1】:

    我遇到了同样的问题,我的解决方案是在调用 RegisterSessionNotification() 之后添加对 GetSessionEnumerator() 的调用

    【讨论】:

    • 如果您能添加一些简短说明,说明您认为这可能会解决问题的原因,将会很有帮助。
    【解决方案2】:

    您在RegisterMonitor 函数中释放了会话管理器。一旦您释放对会话管理器的最后一个引用,它就会被释放,您将不再收到会话通知。

    保持会话管理器对象处于活动状态,它应该可以正常工作。

    【讨论】:

    • 我在哪里释放会话管理器?此外,即使我注释掉所有 ->Release()/SAFE_RELEASE() 代码(像筛子一样泄漏 COM 对象)我仍然没有收到通知。
    • 对不起,我误读了退出部分 - 我没有意识到会话管理器仅在失败情况下被释放。
    • +1 Windows 音频堆栈上的程序员写了一个答案。
    • 不幸的是,问题仍然存在。不过,向拉里疯狂的道具帮助了随机的编码员。
    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多