Я подбираю экспериментальный код, с которым я вошел в бета-версию Windows 7 теперь, когда я установил RC.IAudioSessionNotification, у кого есть рабочий код?
В основном, я пытаюсь получить IAudioSessionManager2
& IAudioSessionNotification
, работая вместе, чтобы сообщить моему маленькому приложению каждого нового сеанса аудио.
код Изюминка в AudioListener
(общественного 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;
}
Код регистрации мой слушатель:
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(...)
возвращает истину, но не уведомления когда-либо получал. Я тестировал, запуская небольшие приложения с незначительными звуковыми эффектами и запуская их (Soltaire, Minesweeper и т. Д.), Подтверждая, что они отображаются в SndVol
, когда я ожидаю увидеть уведомление.
В принципе, кто-нибудь видит, что я делаю неправильно?
Где именно я освободив менеджер сеансов? Кроме того, даже если я прокомментирую весь код -> Release()/SAFE_RELEASE() (утечка COM-объектов, таких как сито), я до сих пор не получаю уведомления. –
Извините, я неправильно понял часть выхода - я не понимал, что диспетчер сеансов был освобожден только в случае сбоя. –
+1 что программист в стеке Windows Audio написал ответ. –