2009-05-13 2 views
5

나는 RC를 설치 했으므로 실험 코드를 고르고있다. 지금은 Windows 7 Beta에서 엉망이었다.IAudioSessionNotification, 누구나 작동하는 코드가 있습니까?

기본적으로, 나는 만든 모든 새로운 오디오 세션을 내 작은 응용 프로그램에 알리기 위해 기본적으로 IAudioSessionManager2 & 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; 
} 

코드 내 청취자를 등록 :

뒤통수 때리는 웃긴의 AudioListener (공공 IAudioSessionNotification) 코드

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

어디 정확히 내가 세션 관리자를 확보하고 호출 한 후 GetSessionEnumerator()에 대한 호출을 추가했다? 또한, 모든 -> Release()/SAFE_RELEASE() 코드 (sieve와 같은 COM 객체 유출)를 주석 처리하더라도 알림을받지 못합니다. –

+0

죄송합니다. Exit 부분을 잘못 읽었습니다. 세션 관리자가 실패한 경우에만 릴리스 된 것을 알지 못했습니다. –

+0

+1 Windows Audio 스택의 프로그래머가 답변을 작성했습니다. –

0

내가 같은 문제와 나를 위해 솔루션을 경험 한 것은 RegisterSessionNotification()를

+0

이것이 문제를 해결할 수 있다고 생각하는 이유에 대한 간단한 설명을 추가하면 도움이 될 것입니다. –

관련 문제