禁用默认闪避体验

用户可以使用 Windows 多媒体控制面板 Mmsys.cpl 的“通信”选项卡上的选项禁用系统提供的默认闪避体验

当应用闪避时,会使用淡出和淡入效果并持续 1 秒。 游戏应用程序可能不希望通信流干扰游戏音频。 有些媒体应用程序可能会发现,当音乐淡入淡出时,播放体验会很生硬。 这类应用程序可以选择不参与闪避体验。

直接 WASAPI 客户端能以编程方式通过使用音频会话的会话管理器选择退出,该会话管理器可为非通信流提供音量控件。 请注意,即使客户端选择退出闪避,它仍会收到系统发出的闪避通知。

要选择退出闪避,客户端必须获取会话管理器 IAudioSessionControl2 接口的引用。 要退出闪避体验,请执行以下步骤:

  1. 实例化设备枚举器,并用它获取媒体应用程序用来呈现非通信流的设备终结点的引用。
  2. 从设备终结点激活会话管理器,并获取会话管理器 IAudioSessionManager2 接口的引用。
  3. 通过使用 IAudioSessionManager2 指针,获取会话管理器 IAudioSessionControl 接口的引用。
  4. IAudioSessionControl 接口查询 IAudioSessionControl2
  5. 调用 IAudioSessionControl2::SetDuckingPreference 并传递 TRUEFALSE 以指定闪避首选项。 指定的首选项可在会话期间动态变化。 请注意,在停止并重新启动流之前,退出更改不会生效。

以下代码显示了应用程序如何指定其闪避首选项。 函数的调用方必须在 DuckingOptOutChecked 参数中传递 TRUEFALSE。 根据传递的值,通过 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;
}

使用通信设备

默认闪避体验

提供自定义闪避行为

闪避通知的实施注意事项

获取闪避事件