现在我已经安装了RC,现在正在试用Windows 7 Beta中的一些实验代码。
基本上,我试图让IAudioSessionManager2
和IAudioSessionNotification
一起工作,通知我的小应用程序创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()