禁用默认闪避体验
用户可以使用 Windows 多媒体控制面板 Mmsys.cpl 的“通信”选项卡上的选项禁用系统提供的默认闪避体验。
当应用闪避时,会使用淡出和淡入效果并持续 1 秒。 游戏应用程序可能不希望通信流干扰游戏音频。 有些媒体应用程序可能会发现,当音乐淡入淡出时,播放体验会很生硬。 这类应用程序可以选择不参与闪避体验。
直接 WASAPI 客户端能以编程方式通过使用音频会话的会话管理器选择退出,该会话管理器可为非通信流提供音量控件。 请注意,即使客户端选择退出闪避,它仍会收到系统发出的闪避通知。
要选择退出闪避,客户端必须获取会话管理器 IAudioSessionControl2 接口的引用。 要退出闪避体验,请执行以下步骤:
- 实例化设备枚举器,并用它获取媒体应用程序用来呈现非通信流的设备终结点的引用。
- 从设备终结点激活会话管理器,并获取会话管理器 IAudioSessionManager2 接口的引用。
- 通过使用 IAudioSessionManager2 指针,获取会话管理器 IAudioSessionControl 接口的引用。
- 从 IAudioSessionControl 接口查询 IAudioSessionControl2。
- 调用 IAudioSessionControl2::SetDuckingPreference 并传递 TRUE 或 FALSE 以指定闪避首选项。 指定的首选项可在会话期间动态变化。 请注意,在停止并重新启动流之前,退出更改不会生效。
以下代码显示了应用程序如何指定其闪避首选项。 函数的调用方必须在 DuckingOptOutChecked 参数中传递 TRUE 或 FALSE。 根据传递的值,通过 IAudioSessionControl2::SetDuckingPreference 启用或禁用闪避功能。
////////////////////////////////////////////////////////////////////
//Description: Specifies the ducking options for the application.
//Parameters:
// If DuckingOptOutChecked is TRUE system ducking is disabled;
// FALSE, system ducking is enabled.
////////////////////////////////////////////////////////////////////
HRESULT DuckingOptOut(bool DuckingOptOutChecked)
{
HRESULT hr = S_OK;
IMMDeviceEnumerator* pDeviceEnumerator NULL;
IMMDevice* pEndpoint = NULL;
IAudioSessionManager2* pSessionManager2 = NULL;
IAudioSessionControl* pSessionControl = NULL;
IAudioSessionControl2* pSessionControl2 = NULL;
// Start with the default endpoint.
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pDeviceEnumerator));
if (SUCCEEDED(hr))
{
hr = pDeviceEnumerator>GetDefaultAudioEndpoint(eRender, eConsole, &pEndpoint);
pDeviceEnumerator>Release();
pDeviceEnumerator = NULL;
}
// Activate session manager.
if (SUCCEEDED(hr))
{
hr = pEndpoint->Activate(__uuidof(IAudioSessionManager2),
CLSCTX_INPROC_SERVER,
NULL,
reinterpret_cast<void **>(&pSessionManager2));
pEndpoint->Release();
pEndpoint = NULL;
}
if (SUCCEEDED(hr))
{
hr = pSessionManager2->GetAudioSessionControl(NULL, 0, &pSessionControl);
pSessionManager2->Release();
pSessionManager2 = NULL;
}
if (SUCCEEDED(hr))
{
hr = pSessionControl->QueryInterface(
__uuidof(IAudioSessionControl2),
(void**)&pSessionControl2);
pSessionControl->Release();
pSessionControl = NULL;
}
// Sync the ducking state with the specified preference.
if (SUCCEEDED(hr))
{
if (DuckingOptOutChecked)
{
hr = pSessionControl2->SetDuckingPreference(TRUE);
}
else
{
hr = pSessionControl2->SetDuckingPreference(FALSE);
}
pSessionControl2->Release();
pSessionControl2 = NULL;
}
return hr;
}
相关主题