Streaming-Audiorenderer

Der Streamingaudiorenderer (SAR) ist eine Mediensenke, die Audio rendert. Jede instance der SAR rendert einen einzelnen Audiodatenstrom. Verwenden Sie mehrere Instanzen der SAR, um mehrere Streams zu rendern.

Um die SAR zu erstellen, rufen Sie eine der folgenden Funktionen auf:

Die zweite Funktion, die ein Aktivierungsobjekt zurückgibt, ist erforderlich, wenn Sie geschützte Inhalte wiedergeben, da das Aktivierungsobjekt in den geschützten Prozess serialisiert werden muss. Für klare Inhalte können Sie beide Funktionen verwenden.

Die SAR kann unkomprimierte Audiodaten entweder im PCM- oder IEEE-Gleitkommaformat empfangen. Wenn die Wiedergaberate schneller oder langsamer als 1× ist, passt die SAR automatisch die Tonhöhe an.

Konfigurieren des Audiorenderers

Die SAR unterstützt mehrere Konfigurationsattribute. Der Mechanismus zum Festlegen dieser Attribute hängt davon ab, welche Funktion Sie zum Erstellen der SAR aufrufen. Wenn Sie die MFCreateAudioRenderer-Funktion verwenden, gehen Sie wie folgt vor:

  1. Erstellen Sie einen neuen Attributspeicher, indem Sie MFCreateAttributes aufrufen.
  2. Fügen Sie die Attribute dem Attributspeicher hinzu.
  3. Übergeben Sie den Attributspeicher an die MFCreateAudioRenderer-Funktion im pAudioAttributes-Parameter .

Wenn Sie die MFCreateAudioRendererActivate-Funktion verwenden, gibt die Funktion einen Zeiger auf die IMFAttributes-Schnittstelle im parameter ppActivate zurück . Verwenden Sie diesen Zeiger, um die Attribute hinzuzufügen.

Eine Liste der Konfigurationsattribute finden Sie unter Attribute des Audiorenderers.

Auswählen des Audioendpunktgeräts

Ein Audioendpunktgerät ist ein Hardwaregerät, das Audio rendert oder erfasst. Beispiele hierfür sind Lautsprecher, Kopfhörer, Mikrofone und CD-Player. Die SAR verwendet immer ein Audiorenderinggerät. Es gibt zwei Möglichkeiten, das Gerät auszuwählen.

Der erste Ansatz besteht darin, die Audiorenderinggeräte auf dem System mithilfe der IMMDeviceEnumerator-Schnittstelle aufzulisten. Diese Schnittstelle ist in der Hauptdokumentation der Audio-API dokumentiert.

  1. Erstellen Sie das Geräteenumeratorobjekt.
  2. Verwenden Sie den Geräteenumerator, um Audiorenderinggeräte aufzulisten. Jedes Gerät wird durch einen Zeiger auf die IMMDevice-Schnittstelle dargestellt.
  3. Wählen Sie ein Gerät basierend auf den Geräteeigenschaften oder der Auswahl des Benutzers aus.
  4. Rufen Sie IMMDevice::GetId auf, um den Gerätebezeichner abzurufen.
  5. Legen Sie den Gerätebezeichner als Wert des attributs MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID fest.

Anstatt Geräte aufzuzählen, können Sie das Audiogerät anhand seiner Rolle angeben. Eine Audiorolle identifiziert eine allgemeine Kategorie der Verwendung. Beispielsweise ist die Konsolenrolle für Spiele und Systembenachrichtigungen definiert, während die Multimediarolle für Musik und Filme definiert ist. Jeder Rolle ist ein Audiorenderinggerät zugewiesen, und der Benutzer kann diese Zuweisungen ändern. Wenn Sie eine Geräterolle angeben, verwendet die SAR jedes Audiogerät, das dieser Rolle zugewiesen wurde. Um die Geräterolle anzugeben, legen Sie das attribut MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE fest.

Die beiden in diesem Abschnitt aufgeführten Attribute schließen sich gegenseitig aus. Wenn Sie keines dieser Optionen festlegen, verwendet die SAR das Audiogerät, das der Rolle "eConsole " zugewiesen ist.

Der folgende Code listet die Audiorenderinggeräte auf und weist das erste Gerät in der Liste der SAR zu. In diesem Beispiel wird die MFCreateAudioRenderer-Funktion verwendet, um die SAR zu erstellen.

#include <mmdeviceapi.h>

HRESULT hr = S_OK;

IMMDeviceEnumerator *pEnum = NULL;      // Audio device enumerator.
IMMDeviceCollection *pDevices = NULL;   // Audio device collection.
IMMDevice *pDevice = NULL;              // An audio device.
IMFAttributes *pAttributes = NULL;      // Attribute store.
IMFMediaSink *pSink = NULL;             // Streaming audio renderer (SAR)

LPWSTR wstrID = NULL;                   // Device ID.

// Create the device enumerator.
hr = CoCreateInstance(
    __uuidof(MMDeviceEnumerator), 
    NULL,
    CLSCTX_ALL, 
    __uuidof(IMMDeviceEnumerator), 
    (void**)&pEnum
    );

// Enumerate the rendering devices.
if (SUCCEEDED(hr))
{
    hr = pEnum->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pDevices);
}

// Get ID of the first device in the list.
if (SUCCEEDED(hr))
{
    hr = pDevices->Item(0, &pDevice);
}

if (SUCCEEDED(hr))
{
    hr = pDevice->GetId(&wstrID);
}

// Create an attribute store and set the device ID attribute.
if (SUCCEEDED(hr))
{
    hr = MFCreateAttributes(&pAttributes, 2);
}

if (SUCCEEDED(hr))
{
    hr = pAttributes->SetString(
        MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID, 
        wstrID
        );
}

// Create the audio renderer.
if (SUCCEEDED(hr))
{
    hr = MFCreateAudioRenderer(pAttributes, &pSink);    
}

SAFE_RELEASE(pEnum);
SAFE_RELEASE(pDevices);
SAFE_RELEASE(pDevice); 
SAFE_RELEASE(pAttributes);
CoTaskMemFree(wstrID);

Um das Aktivierungsobjekt für die SAR zu erstellen, ändern Sie den Code, der nach dem Aufruf von IMMDevice::GetId angezeigt wird, wie folgt:

IMFActivate *pActivate = NULL;          // Activation object.

if (SUCCEEDED(hr))
{
    hr = MFCreateAudioRendererActivate(&pActivate);    
}

if (SUCCEEDED(hr))
{
    hr = pActivate->SetString(
        MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID, 
        wstrID
        );
}

SAFE_RELEASE(pActivate);

Auswählen der Audiositzung

Eine Audiositzung ist eine Gruppe verwandter Audiostreams, die von einer Anwendung gemeinsam verwaltet werden können. Die Anwendung kann die Lautstärke und den Stummschaltungszustand jeder Sitzung steuern. Sitzungen werden durch GUID identifiziert. Verwenden Sie zum Angeben der Audiositzung für die SAR das Attribut MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID . Wenn Sie dieses Attribut nicht festlegen, verknüpft die SAR die Standardsitzung für diesen Prozess, die durch GUID_NULL identifiziert wird.

Standardmäßig ist eine Audiositzung prozessspezifisch, d. h. sie enthält nur Streams aus dem aufrufenden Prozess. Um einer prozessübergreifenden Sitzung beizutreten, legen Sie das attribut MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS mit dem Wert MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_CROSSPROCESS fest.

Nachdem Sie die SAR erstellt haben, verwenden Sie die IMFAudioPolicy-Schnittstelle , um die Sitzung mit einer Gruppe von Sitzungen zu verbinden, die alle über dasselbe Lautstärkesteuerelement in der Systemsteuerung gesteuert werden. Sie können diese Schnittstelle auch verwenden, um den Anzeigenamen und das Symbol festzulegen, die im Lautstärkeregler angezeigt werden.

Steuern der Lautstärke

Verwenden Sie die IMFSimpleAudioVolume-Schnittstelle, um die Master Lautstärke aller Streams in der Audiositzung der SAR zu steuern. Verwenden Sie die IMFAudioStreamVolume-Schnittstelle , um die Lautstärke eines einzelnen Datenstroms oder die Lautstärke einzelner Kanäle innerhalb eines Datenstroms zu steuern. Beide Schnittstellen werden durch Aufrufen von IMFGetService::GetService abgerufen. Sie können GetService direkt auf der SAR oder in der Mediensitzung aufrufen. Lautstärkestufen werden als Dämpfungswerte ausgedrückt. Für jeden Kanal ist die Dämpfungsebene das Produkt des master Volume und des Kanalvolumes.

Audio-/Videowiedergabe