Streaming Audio Renderer

Il renderer audio di streaming (SAR) è un sink multimediale che esegue il rendering dell'audio. Ogni istanza della SAR esegue il rendering di un singolo flusso audio. Per eseguire il rendering di più flussi, usare più istanze della SAR.

Per creare la SAR, chiamare una delle funzioni seguenti:

La seconda funzione, che restituisce un oggetto di attivazione, è necessaria se si esegue il contenuto protetto, perché l'oggetto di attivazione deve essere serializzato nel processo protetto. Per cancellare il contenuto, è possibile usare entrambe le funzioni.

Il SAR può ricevere audio non compresso in formato PCM o IEEE a virgola mobile. Se la frequenza di riproduzione è più veloce o più lenta di 1×, il SAR regola automaticamente il passo.

Configurazione del renderer audio

La SAR supporta diversi attributi di configurazione. Il meccanismo per l'impostazione di questi attributi dipende dalla funzione chiamata per creare la SAR. Se si usa la funzione MFCreateAudioRenderer , eseguire le operazioni seguenti:

  1. Creare un nuovo archivio attributi chiamando MFCreateAttributes.
  2. Aggiungere gli attributi all'archivio attributi.
  3. Passare l'archivio attributi alla funzione MFCreateAudioRenderer nel parametro pAudioAttributes .

Se si usa la funzione MFCreateAudioRendererActivate , la funzione restituisce un puntatore all'interfaccia FMAttributes nel parametro ppActivate . Usare questo puntatore per aggiungere gli attributi.

Per un elenco di attributi di configurazione, vedere Attributi del renderer audio.

Selezione del dispositivo endpoint audio

Un dispositivo endpoint audio è un dispositivo hardware che esegue il rendering o acquisisce l'audio. Gli esempi includono altoparlanti, cuffie, microfoni e lettori CD. La SAR usa sempre un dispositivo di rendering audio. Esistono due modi per selezionare il dispositivo.

Il primo approccio consiste nell'enumerare i dispositivi di rendering audio nel sistema usando l'interfaccia IMMDeviceEnumerator . Questa interfaccia è documentata nella documentazione dell'API audio principale.

  1. Creare l'oggetto enumeratore del dispositivo.
  2. Usare l'enumeratore del dispositivo per enumerare i dispositivi di rendering audio. Ogni dispositivo è rappresentato da un puntatore all'interfaccia IMMDevice .
  3. Selezionare un dispositivo in base alle proprietà del dispositivo o alla selezione dell'utente.
  4. Chiamare IMMDevice::GetId per ottenere l'identificatore del dispositivo.
  5. Impostare l'identificatore del dispositivo come valore dell'attributo MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID .

Anziché enumerare i dispositivi, è possibile specificare il dispositivo audio in base al suo ruolo. Un ruolo audio identifica una categoria generale di utilizzo. Ad esempio, il ruolo della console è definito per i giochi e le notifiche di sistema, mentre il ruolo multimediale è definito per musica e film. Ogni ruolo ha un dispositivo di rendering audio assegnato a esso e l'utente può modificare queste assegnazioni. Se si specifica un ruolo del dispositivo, la SAR usa qualsiasi dispositivo audio assegnato per tale ruolo. Per specificare il ruolo del dispositivo, impostare l'attributo MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE .

I due attributi elencati in questa sezione si escludono a vicenda. Se non si impostano nessuno di essi, la SAR usa il dispositivo audio assegnato al ruolo eConsole .

Il codice seguente enumera i dispositivi di rendering audio e assegna il primo dispositivo nell'elenco alla SAR. In questo esempio viene usata la funzione MFCreateAudioRenderer per creare la SAR.

#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);

Per creare l'oggetto di attivazione per la SAR, modificare il codice visualizzato dopo la chiamata a IMMDevice::GetId al seguente:

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);

Selezione della sessione audio

Una sessione audio è un gruppo di flussi audio correlati che un'applicazione può gestire collettivamente. L'applicazione può controllare il livello del volume e disattivare lo stato di ogni sessione. Le sessioni vengono identificate dal GUID. Per specificare la sessione audio per la SAR, usare l'attributo MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID . Se non si imposta questo attributo, la SAR aggiunge la sessione predefinita per tale processo, identificata da GUID_NULL.

Per impostazione predefinita, una sessione audio è specifica del processo, ovvero contiene solo flussi dal processo di chiamata. Per aggiungere una sessione tra processi, impostare l'attributo MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS con il valore MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_CROSSPROCESS.

Dopo aver creato la SAR, usare l'interfaccia IMFAudioPolicy per partecipare alla sessione a un gruppo di sessioni, tutte controllate dallo stesso controllo del volume nel pannello di controllo. È anche possibile usare questa interfaccia per impostare il nome visualizzato e l'icona visualizzata nel controllo volume.

Controllo dei livelli di volume

Per controllare il livello di volume master di tutti i flussi nella sessione audio della SAR, usare l'interfaccia FMSimpleAudioVolume . Per controllare il volume di un singolo flusso o controllare il volume di singoli canali all'interno di un flusso, usare l'interfaccia FMAudioStreamVolume . Entrambe le interfacce vengono ottenute chiamando IMFGetService::GetService. È possibile chiamare GetService direttamente sulla SAR oppure chiamarla nella sessione multimediale. I livelli di volume vengono espressi come valori di attenuazione. Per ogni canale, il livello di attenuazione è il prodotto del volume master e del volume del canale.

Riproduzione di audio/video