IAudioSessionNotification,任何人都有工作代码?

现在我已经安装了RC,现在正在试用Windows 7 Beta中的一些实验代码。

基本上,我试图让IAudioSessionManager2IAudioSessionNotification一起工作,通知我的小应用程序创build的每个新的audio会话。

AudioListener Punchline代码(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; } 

代码注册我的监听器:

 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(...)返回true,但是没有收到任何通知。 我一直在testing一些小的声音效果并触发它们(Soltaire,Minesweeper等),确认它们出现在SndVol当我期待看到通知。

基本上,有没有人看到我在做什么错了?

您在RegisterMonitor函数中释放了会话管理器。 一旦释放会话管理器的最后一个引用,它将被释放,您将不再接收会话通知。

保持会话管理器对象活着,它应该工作得很好。

我遇到了同样的问题,我的解决方案是调用RegisterSessionNotification()后添加一个调用GetSessionEnumerator()