IAudioSessionNotification,任何人都有工作代码?

时间:2009-05-13 16:30:04

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

我正在安装一些实验代码,因为我安装了RC,因此我在Windows 7 Beta中搞砸了。

基本上,我正试图获得IAudioSessionManager2& IAudioSessionNotification一起工作,通知我的小应用程序创建的每个新音频会话。

AudioListener中的Punchline代码(公开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时我希望看到通知。

基本上,有人看到我做错了吗?

2 个答案:

答案 0 :(得分:1)

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

保持会话管理器对象存活,它应该可以正常工作。

答案 1 :(得分:0)

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