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?
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. –
Sorry, ich habe den Exit-Teil falsch gelesen - ich habe nicht bemerkt, dass der Session Manager nur im Fehlerfall freigegeben wurde. –
+1, dass ein Programmierer auf dem Windows Audio-Stapel eine Antwort geschrieben hat. –