C++ IAudioSessionNotification,有人有工作代码吗?

C++ IAudioSessionNotification,有人有工作代码吗?,c++,windows,com,windows-7,audio,C++,Windows,Com,Windows 7,Audio,现在我已经安装了RC,我正在挑选一些在Windows7测试版中弄乱的实验代码 基本上,我正试图让IAudioSessionManager2和IAudioSessionNotification一起工作,将创建的每个新音频会话通知我的小应用程序 AudioListener(公共)中的笑点代码: 注册我的侦听器的代码: BOOL RegisterMonitor(HWND target) { BOOL success = false; HRESULT res; IMMDevic

现在我已经安装了RC,我正在挑选一些在Windows7测试版中弄乱的实验代码

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

AudioListener
(公共)中的笑点代码:

注册我的侦听器的代码:

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、Minesweaper等)进行测试,确认它们在我期待看到通知时出现在
SndVol


基本上,有人知道我做错了什么吗

您在您的
注册表监视功能中释放了会话管理器。一旦释放对会话管理器的最后一个引用,它将被释放,您将不再收到会话通知


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

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

我到底在哪里释放会话管理器?此外,即使我注释掉了所有->Release()/SAFE_Release()代码(像筛子一样泄漏COM对象),我仍然没有收到通知。抱歉,我误读了退出部分-我没有意识到会话管理器只是在故障情况下发布的。+1 Windows音频堆栈上的程序员写了一个答案。不幸的是,问题依然存在。不过,这是拉里帮助随意挥舞的程序员的疯狂道具。如果你能简单描述一下为什么你认为这可以解决这个问题,那将是很有帮助的。
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;
}