C++ IAudioSessionNotification,有人有工作代码吗?
现在我已经安装了RC,我正在挑选一些在Windows7测试版中弄乱的实验代码 基本上,我正试图让C++ IAudioSessionNotification,有人有工作代码吗?,c++,windows,com,windows-7,audio,C++,Windows,Com,Windows 7,Audio,现在我已经安装了RC,我正在挑选一些在Windows7测试版中弄乱的实验代码 基本上,我正试图让IAudioSessionManager2和IAudioSessionNotification一起工作,将创建的每个新音频会话通知我的小应用程序 AudioListener(公共)中的笑点代码: 注册我的侦听器的代码: BOOL RegisterMonitor(HWND target) { BOOL success = false; HRESULT res; IMMDevic
IAudioSessionManager2
和IAudioSessionNotification
一起工作,将创建的每个新音频会话通知我的小应用程序
AudioListener
(公共)中的笑点代码:
注册我的侦听器的代码:
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,但从未收到任何通知。我一直在通过启动带有轻微声音效果的小应用程序并触发它们(Soltaire、Minesweaper等)进行测试,确认它们在我期待看到通知时出现在SndVol
中
基本上,有人知道我做错了什么吗 您在您的
注册表监视功能中释放了会话管理器。一旦释放对会话管理器的最后一个引用,它将被释放,您将不再收到会话通知
保持会话管理器对象处于活动状态,它应该可以正常工作。我也遇到过同样的问题,我的解决方案是在调用RegisterSessionNotification()之后添加对GetSessionNumber()的调用。我到底在哪里释放会话管理器?此外,即使我注释掉了所有->Release()/SAFE_Release()代码(像筛子一样泄漏COM对象),我仍然没有收到通知。抱歉,我误读了退出部分-我没有意识到会话管理器只是在故障情况下发布的。+1 Windows音频堆栈上的程序员写了一个答案。不幸的是,问题依然存在。不过,这是拉里帮助随意挥舞的程序员的疯狂道具。如果你能简单描述一下为什么你认为这可以解决这个问题,那将是很有帮助的。
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;
}