Compartilhar via


Desativando a experiência de ducking padrão

Um usuário pode desabilitar a Experiência de Ducking padrão fornecida pelo sistema usando as opções disponíveis na guia Comunicações do painel de controle multimídia do Windows, Mmsys.cpl.

Quando o ducking é aplicado, um efeito fade-out e fade-in é usado por um período de 1 segundo. Um aplicativo de jogo pode não querer que o fluxo de comunicação interfira no áudio do jogo. Alguns aplicativos de mídia podem achar que a experiência de reprodução é chocante quando a música desaparece novamente. Esses tipos de aplicativos podem optar por não participar da experiência de ducking.

Programaticamente, um cliente WASAPI direto pode desativar usando o gerenciador de sessão para a sessão de áudio que fornece controle de volume para os fluxos de não comunicação. Observe que, mesmo que um cliente opte por não participar, ele ainda recebe notificações de evasão do sistema.

Para desativar o ducking, o cliente deve obter uma referência à interface IAudioSessionControl2 do gerenciador de sessão. Para desativar a experiência de ducking, use as seguintes etapas:

  1. Instancie o enumerador de dispositivos e use-o para obter uma referência ao ponto de extremidade do dispositivo que o aplicativo de mídia está usando para renderizar o fluxo de não comunicação.
  2. Ative o gerenciador de sessão a partir do ponto de extremidade do dispositivo e obtenha uma referência à interface IAudioSessionManager2 do gerenciador de sessão.
  3. Usando o ponteiro IAudioSessionManager2, obtenha uma referência à interface IAudioSessionControl do gerenciador de sessão.
  4. Consulta para o IAudioSessionControl2 da interface IAudioSessionControl.
  5. Chame IAudioSessionControl2::SetDuckingPreference e passe TRUE ou FALSE para especificar a preferência ducking. A preferência especificada pode ser alterada dinamicamente durante a sessão. Observe que a alteração de desativação não terá efeito até que o fluxo seja interrompido e iniciado novamente.

O código a seguir mostra como um aplicativo pode especificar sua preferência de ducking. O chamador da função deve passar TRUE ou FALSE no parâmetro DuckingOptOutCheckd. Dependendo do valor passado, o ducking é habilitado ou desabilitado por meio do 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;
}

Usando um dispositivo de comunicação

Experiência padrão de ducking

Fornecendo um comportamento de ducking personalizado

Considerações de implementação para notificações de evasão

Obtendo eventos de ducking