Şimdi RC'yi kurduğum Windows 7 Beta'da uğraştığım bazı deneysel kodları alıyorum.IAudioSessionNotification, herkes çalışma kodu var mı?
Temelde, oluşturulan her yeni ses oturumun benim küçük app bilgilendirmek için birlikte çalışan IAudioSessionManager2
& IAudioSessionNotification
almaya çalışıyorum.
//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;
}
Kod benim dinleyici kaydederek:
Punchline AudioListener
(kamu IAudioSessionNotification
) kod
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(...)
döner doğrudur, ancak hiçbir bildirimler şimdiye alınır. Küçük ses efektleri ile küçük uygulamalar başlatarak ve onları (Soltaire, Mayın Tarlası, vb.) Tetikleyerek test ettim, bir bildirim görmeyi beklediğimde SndVol
görüntülendiklerini doğrulayarak.
Temel olarak, yanlış yaptığım şeyi gören var mı?
Tam olarak nereye ben oturum yöneticisi azat ediyorum çağrıldıktan sonra GetSessionEnumerator() çağrısı eklemek oldu? Ayrıca, tüm -> Release()/SAFE_RELEASE() kodunu (elek gibi COM nesnelerini sızdırıyor) açıklamam olsa bile hala bildirim almıyorum. –
Üzgünüz, Çıkış bölümünü yanlış anlıyorum - oturum yöneticisinin yalnızca arıza durumunda serbest bırakıldığını anlayamadım. –
+1, Windows Ses yığındaki bir programlayıcının yanıt yazdığını. –