Sto raccogliendo un codice sperimentale con cui avevo problemi con Windows 7 Beta ora che ho installato RC.IAudioSessionNotification, qualcuno ha un codice funzionante?
Fondamentalmente, sto cercando di ottenere IAudioSessionManager2
& IAudioSessionNotification
lavorare insieme per informare la mia piccola app di ogni nuova sessione audio creata.
codice Punchline in AudioListener
(pubblico 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;
}
Codice registrare il mio ascoltatore:
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(...)
restituisce vero, ma non le notifiche vengono mai ricevuti. Ho provato testando piccole app con lievi effetti sonori e attivandoli (Soltaire, Minesweeper, ecc.), Confermando che compaiono in SndVol
quando mi aspetto di vedere una notifica.
Fondamentalmente, qualcuno vede cosa sto facendo male?
Dove esattamente sono io liberando il gestore di sessione? Inoltre, anche se commento tutto il codice -> Release()/SAFE_RELEASE() (che perde oggetti COM come un setaccio) continuo a non ricevere notifiche. –
Scusate, ho interpretato erroneamente la parte Exit - Non mi ero reso conto che il gestore di sessione è stato rilasciato solo nel caso di errore. –
+1 che un programmatore nello stack Audio di Windows ha scritto una risposta. –