2009-05-13 4 views
5

Я подбираю экспериментальный код, с которым я вошел в бета-версию 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, когда я ожидаю увидеть уведомление.

В принципе, кто-нибудь видит, что я делаю неправильно?

ответ

1

Вы освободили менеджера сеанса в своей функции RegisterMonitor. После того, как вы отпустите последнюю ссылку на диспетчер сеансов, она освободится, и вы больше не будете получать уведомления о сеансе.

Сохраняйте объект менеджера сеанса живым, и он должен работать нормально.

+0

Где именно я освободив менеджер сеансов? Кроме того, даже если я прокомментирую весь код -> Release()/SAFE_RELEASE() (утечка COM-объектов, таких как сито), я до сих пор не получаю уведомления. –

+0

Извините, я неправильно понял часть выхода - я не понимал, что диспетчер сеансов был освобожден только в случае сбоя. –

+0

+1 что программист в стеке Windows Audio написал ответ. –

0

я испытал те же проблемы, и решение для меня, чтобы добавить вызов GetSessionEnumerator() после вызова RegisterSessionNotification()

+0

Было бы полезно, если бы вы могли добавить краткое описание того, почему вы думаете, что это может решить проблему. –

Смежные вопросы