gpt4 book ai didi

c++ - IAudioSessionNotification,有人有工作代码吗?

转载 作者:可可西里 更新时间:2023-11-01 13:48:15 25 4
gpt4 key购买 nike

现在我已经安装了 RC,我正在收集一些我在 Windows 7 Beta 中弄乱的实验代码。

基本上,我正在尝试让 IAudioSessionManager2IAudioSessionNotification 一起工作,以通知我的小应用程序创建的每个新 Audio Session 。

AudioListener 中的妙语代码(公共(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,但从未收到任何通知。我一直在通过启动带有轻微音效的小应用程序并触发它们(Soltaire、Minesweeper 等)来进行测试,确认它们在我期望看到通知时出现在 SndVol 中。

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

最佳答案

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

让 session 管理器对象保持事件状态,它应该可以正常工作。

关于c++ - IAudioSessionNotification,有人有工作代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/858974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com