Condividi tramite


Disabilitazione dell'esperienza predefinita di ducking

Un utente può disabilitare l'esperienza predefinita ducking fornita dal sistema utilizzando le opzioni disponibili nella scheda Comunicazioni del pannello di controllo multimediale di Windows, Mmsys.cpl.

Quando viene applicata l'anatratura, viene utilizzato un effetto dissolvenza e dissolvenza per un periodo di 1 secondo. Un'applicazione di gioco potrebbe non volere che il flusso di comunicazione interferisca con l'audio del gioco. Alcune applicazioni multimediali potrebbero scoprire che l'esperienza di riproduzione è in gergo quando la musica si dissolve. Questi tipi di applicazioni possono scegliere di non partecipare all'esperienza di anatraggio.

A livello di codice, un client WASAPI diretto può rifiutare esplicitamente usando la gestione sessione per la sessione audio che fornisce il controllo del volume per i flussi non di comunicazione. Si noti che anche se un client rifiuta esplicitamente l'anatraggio, riceve comunque notifiche di anatraggio dal sistema.

Per rifiutare esplicitamente l'anatraggio, il client deve ottenere un riferimento all'interfaccia IAudioSessionControl2 del gestore sessione. Per rifiutare esplicitamente l'esperienza di anatraggio, seguire questa procedura:

  1. Creare un'istanza dell'enumeratore del dispositivo e usarlo per ottenere un riferimento all'endpoint del dispositivo usato dall'applicazione multimediale per eseguire il rendering del flusso non di comunicazione.
  2. Attivare il gestore di sessioni dall'endpoint del dispositivo e ottenere un riferimento all'interfaccia IAudioSessionManager2 del gestore sessione.
  3. Usando il puntatore IAudioSessionManager2, ottenere un riferimento all'interfaccia IAudioSessionControl del gestore sessione.
  4. Eseguire una query per IAudioSessionControl2 dall'interfaccia IAudioSessionControl.
  5. Chiama IAudioSessionControl2::SetDuckingPreference e passa TRUE o FAL edizione Standard per specificare la preferenza di anatraggio. La preferenza specificata può essere modificata dinamicamente durante la sessione. Si noti che la modifica di rifiuto esplicito non diventa effettiva fino a quando il flusso non viene arrestato e avviato di nuovo.

Il codice seguente illustra come un'applicazione può specificare la preferenza di anatraggio. Il chiamante della funzione deve passare TRUE o FAL edizione Standard nel parametro DuckingOptOutChecked. A seconda del valore passato, il ducking è abilitato o disabilitato tramite 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;
}

Uso di un dispositivo di comunicazione

Esperienza predefinita di anatraggio

Fornire un comportamento personalizzato di anatraggio

Considerazioni sull'implementazione per le notifiche di ducking

Recupero di eventi di anatraggio