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?
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. –
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. –
+1 qu'un programmeur de la pile Windows Audio a écrit une réponse. –