Freigeben über


Abrufen von Duckingereignissen

Eine Medienanwendung, die ein individuelles Ducking bieten möchte, muss auf die Ereignisbenachrichtigungen lauschen, wenn ein Kommunikationsstream im System geöffnet oder geschlossen wird. Die benutzerdefinierte Implementierung kann mithilfe von MediaFoundation, DirectShow oder DirectSound bereitgestellt werden, die die Core Audio-APIs verwenden. Ein direkter WASAPI-Client kann auch die Standardbehandlung außer Kraft setzen, wenn er weiß, wann die Kommunikationssitzung beginnt und endet.

Um eine benutzerdefinierte Implementierung bereitzustellen, muss eine Medienanwendung Benachrichtigungen vom System erhalten, wenn eine Kommunikationsanwendung einen Kommunikationsdatenstrom startet oder beendet. Die Medienanwendung muss die IAudioVolumeDuckNotification-Schnittstelle implementieren und die Implementierung beim Audiosystem registrieren. Nach erfolgreicher Registrierung empfängt die Medienanwendung Ereignisbenachrichtigungen in Form von Rückrufen über die Methoden in der Schnittstelle. Weitere Informationen finden Sie unter Implementierungsüberlegungen für Ducking-Benachrichtigungen.

Zum Senden von Duckingbenachrichtigungen muss das Audiosystem wissen, welche Audiositzung für die Duckingereignisse lauscht. Jede Audiositzung wird eindeutig mit einer GUID – Sitzungs-instance-Bezeichners – identifiziert. Der Sitzungs-Manager ermöglicht es einer Anwendung, Informationen zur Sitzung abzurufen, z. B. titel der Audiositzung, den Renderingzustand und die Sitzung instance Bezeichner. Der Bezeichner kann mithilfe der Richtliniensteuerungsschnittstelle IAudioSessionControl2 abgerufen werden.

Die folgenden Schritte fassen den Prozess zum Abrufen der Sitzung instance Bezeichners der Medienanwendung zusammen:

  1. Instanziieren Sie den Geräteenumerator, und verwenden Sie ihn, um einen Verweis auf den Endpunkt des Geräts abzurufen, das die Medienanwendung zum Rendern des Nicht-Kommunikationsdatenstroms verwendet.
  2. Aktivieren Sie den Sitzungs-Manager über den Geräteendpunkt, und rufen Sie einen Verweis auf die IAudioSessionManager2-Schnittstelle des Sitzungs-Managers ab.
  3. Rufen Sie mithilfe des Zeigers IAudioSessionManager2 einen Verweis auf die IAudioSessionControl-Schnittstelle des Sitzungs-Managers ab.
  4. Abfragen von IAudioSessionControl2 über die IAudioSessionControl-Schnittstelle .
  5. Rufen Sie IAudioSessionControl2::GetSessionInstanceIdentifier auf, und rufen Sie eine Zeichenfolge ab, die den Sitzungsbezeichner für die aktuelle Audiositzung enthält.

Um Duckingbenachrichtigungen zu Kommunikationsströmen zu erhalten, ruft die Medienanwendung IAudioSessionManager2::RegisterDuckNotification auf. Die Medienanwendung stellt ihren Sitzungs-instance-Bezeichner für das Audiosystem und einen Zeiger auf die IAudioVolumeDuckNotification-Implementierung bereit. Die Anwendung kann jetzt Ereignisbenachrichtigungen empfangen, wenn ein Stream auf dem Kommunikationsgerät geöffnet wurde. Um keine Benachrichtigung mehr zu erhalten, muss die Medienanwendung IAudioSessionManager2::UnregisterDuckNotification aufrufen.

Der folgende Code zeigt, wie sich eine Anwendung registrieren kann, um Duckingbenachrichtigungen zu erhalten. Die CMediaPlayer-Klasse ist in Implementierungsüberlegungen für Duckingbenachrichtigungen definiert. Das DuckingMediaPlayer-Beispiel implementiert diese Funktionalität.

////////////////////////////////////////////////////////////////////
//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;
}

Verwenden eines Kommunikationsgeräts

Standard-Ducking-Erfahrung

Deaktivieren der standardbeendigen Benutzeroberfläche

Bereitstellen eines benutzerdefinierten Duckingverhaltens

Implementierungsüberlegungen für Duckingbenachrichtigungen