Compartir a través de


Obtención de eventos de pato

Una aplicación multimedia que quiera proporcionar una experiencia de pato personalizada debe escuchar las notificaciones de eventos cuando se abre o cierra una secuencia de comunicación en el sistema. La implementación personalizada se puede proporcionar mediante MediaFoundation, DirectShow o DirectSound, que usan las API core Audio. Un cliente WASAPI directo también puede invalidar el control predeterminado si sabe cuándo se inicia y finaliza la sesión de comunicación.

Para proporcionar una implementación personalizada, una aplicación multimedia debe obtener notificaciones del sistema cuando se inicia o finaliza una secuencia de comunicación. La aplicación multimedia debe implementar la interfaz IAudioVolumeDuckNotification y registrar la implementación con el sistema de audio. Tras el registro correcto, la aplicación multimedia recibe notificaciones de eventos en forma de devoluciones de llamada a través de los métodos de la interfaz . Para obtener más información, vea Consideraciones de implementación para notificaciones de pato.

Para enviar notificaciones de pato, el sistema de audio debe saber qué sesión de audio está escuchando los eventos de pato. Cada sesión de audio se identifica de forma única con un GUID: identificador de instancia de sesión. El administrador de sesiones permite a una aplicación obtener información sobre la sesión, como el título de la sesión de audio, el estado de representación y el identificador de instancia de sesión. El identificador se puede recuperar mediante la interfaz de control de directivas, IAudioSessionControl2.

En los pasos siguientes se resume el proceso de obtención del identificador de instancia de sesión de la aplicación multimedia:

  1. Cree una instancia del enumerador de dispositivos y úselo para obtener una referencia al punto de conexión del dispositivo que usa la aplicación multimedia para representar la secuencia de no comunicación.
  2. Active el administrador de sesiones desde el punto de conexión del dispositivo y obtenga una referencia a la interfaz IAudioSessionManager2 del administrador de sesiones.
  3. Mediante el puntero IAudioSessionManager2 , obtenga una referencia a la interfaz IAudioSessionControl del administrador de sesiones.
  4. Consulte IAudioSessionControl2 desde la interfaz IAudioSessionControl .
  5. Llame a IAudioSessionControl2::GetSessionInstanceIdentifier y recupere una cadena que contenga el identificador de sesión de la sesión de audio actual.

Para obtener notificaciones de pato sobre las secuencias de comunicación, la aplicación multimedia llama a IAudioSessionManager2::RegisterDuckNotification. La aplicación multimedia proporciona su identificador de instancia de sesión al sistema de audio y un puntero a la implementación de IAudioVolumeDuckNotification . La aplicación ahora puede recibir una notificación de eventos cuando se abre una secuencia en el dispositivo de comunicación. Para dejar de recibir notificaciones, la aplicación multimedia debe llamar a IAudioSessionManager2::UnregisterDuckNotification.

En el código siguiente se muestra cómo una aplicación puede registrarse para obtener notificaciones de pato. La clase CMediaPlayer se define en Consideraciones de implementación para notificaciones de pato. El ejemplo DuckingMediaPlayer implementa esta funcionalidad.

////////////////////////////////////////////////////////////////////
//Description: Registers for duck notifications depending on the 
//             the ducking options specified by the caller.
//Parameters: 
//    If DuckingOptOutChecked is TRUE, the client is registered for
//    to receive ducking notifications; 
//    FALSE, the client's registration is deleted.
////////////////////////////////////////////////////////////////////

HRESULT CMediaPlayer::DuckingOptOut(bool DuckingOptOutChecked)
{
    HRESULT hr = S_OK;

    IMMDeviceEnumerator* pDeviceEnumerator NULL;
    IMMDevice* pEndpoint = NULL;
    IAudioSessionManager2* pSessionManager2 = NULL;
    IAudioSessionControl* pSessionControl = NULL;
    IAudioSessionControl2* pSessionControl2 = NULL;

    LPWSTR sessionId = 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 the 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);
        
    }

    if (SUCCEEDED(hr))
    {
        hr = pSessionControl->QueryInterface(
                               IID_PPV_ARGS(&pSessionControl2));
                
        pSessionControl->Release();
        pSessionControl = NULL;
    }

    // Get the session instance identifier.
    
    if (SUCCEEDED(hr))
    {
        hr = pSessionControl2->GetSessionInstanceIdentifier(
                                 sessionId);
                
        pSessionControl2->Release();
        pSessionControl2 = NULL;
    }

    //  Register for ducking events depending on 
    //  the specified preference.

    if (SUCCEEDED(hr))
    {
        if (DuckingOptOutChecked)
        {
            hr = pSessionManager2->RegisterDuckNotification(
                                    sessionId, this);
        }
        else
        {
            hr = pSessionManager2->UnregisterDuckNotification
                                      (FALSE);
        }
        pSessionManager2->Release();
        pSessionManager2 = NULL;
    }
    return hr;
}

Uso de un dispositivo de comunicación

Experiencia de pato predeterminada

Deshabilitación de la experiencia de pato predeterminada

Proporcionar un comportamiento de pato personalizado

Consideraciones de implementación para las notificaciones de pato