2009-05-13 4 views
5

Ich erhalte einen experimentellen Code, mit dem ich in der Windows 7 Beta rumgespielt habe, jetzt wo ich den RC installiert habe.IAudioSessionNotification, hat jemand Arbeitscode?

Grundsätzlich versuche ich IAudioSessionManager2 & IAudioSessionNotification zusammenarbeiten, um meine kleine App über jede neue Audio-Session zu informieren.

Punchline Code in AudioListener (public 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; 
} 

-Code meine Zuhörer registriert:

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(...) gibt true zurück, aber keine Benachrichtigungen jemals erhalten. Ich habe getestet, indem ich kleine Apps mit kleinen Soundeffekten gestartet und sie ausgelöst habe (Soltaire, Minesweeper, etc.) und bestätigt habe, dass sie in SndVol erscheinen, wenn ich eine Benachrichtigung erwarte.

Grundsätzlich sieht jemand, was ich falsch mache?

Antwort

1

Sie haben den Session Manager in Ihrer RegisterMonitor Funktion freigegeben. Sobald Sie den letzten Verweis auf den Sitzungsmanager freigeben, wird dieser freigegeben und Sie erhalten keine Sitzungsbenachrichtigungen mehr.

Halten Sie das Session Manager-Objekt am Leben und es sollte gut funktionieren.

+0

Wo genau ich die Session-Manager befreit bin hinzufügen? Auch wenn ich alle -> Release()/SAFE_RELEASE() - Code (COM-Objekte wie ein Sieb leaking) auskommentieren ich immer noch keine Benachrichtigungen erhalten. –

+0

Sorry, ich habe den Exit-Teil falsch gelesen - ich habe nicht bemerkt, dass der Session Manager nur im Fehlerfall freigegeben wurde. –

+0

+1, dass ein Programmierer auf dem Windows Audio-Stapel eine Antwort geschrieben hat. –

0

ich das gleiche Problem und die Lösung für mich erlebt habe, war ein Aufruf an GetSessionEnumerator() nach dem Aufruf RegisterSessionNotification()

+0

Es wäre hilfreich, wenn Sie eine kurze Beschreibung hinzufügen könnten, warum Sie glauben, dass dies das Problem lösen könnte. –