2009-05-13 5 views
5

Je prends un peu de code expérimental que je jouais dans la version bêta de Windows 7 maintenant que j'ai installé le RC.IAudioSessionNotification, quelqu'un a un code fonctionnel?

Fondamentalement, j'essaye d'obtenir IAudioSessionManager2 & IAudioSessionNotification travaillant ensemble pour informer ma petite application de chaque nouvelle session audio créée.

code Punchline dans 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 enregistrer mon auditeur:

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(...) renvoie true, mais aucune notification ne jamais reçu. J'ai testé en lançant de petites applications avec des effets sonores mineurs et en les déclenchant (Soltaire, Minesweeper, etc.), confirmant qu'elles apparaissent dans SndVol quand je m'attends à recevoir une notification.

Fondamentalement, est-ce que quelqu'un voit ce que je fais mal?

Répondre

1

Vous avez libéré le gestionnaire de session dans votre fonction RegisterMonitor. Une fois que vous avez libéré la dernière référence au gestionnaire de session, celle-ci est libérée et vous ne recevez plus les notifications de session.

Conserver l'objet du gestionnaire de session en vie et cela devrait fonctionner correctement.

+0

Où suis-je exactement libérant ainsi le gestionnaire de session? En outre, même si je commente tout le code -> Release()/SAFE_RELEASE() (objets COM fuyants comme un crible) je ne reçois toujours pas de notifications. –

+0

Désolé, j'ai mal interprété la partie Exit - Je ne me suis pas rendu compte que le gestionnaire de session n'était sorti que sur le cas d'échec. –

+0

+1 qu'un programmeur de la pile Windows Audio a écrit une réponse. –

0

J'ai connu le même problème et la solution pour moi était d'ajouter un appel à GetSessionEnumerator() après avoir appelé RegisterSessionNotification()

+0

Il serait utile que vous puissiez ajouter une brève description de la raison pour laquelle vous pensez que cela pourrait résoudre le problème. –

Questions connexes