Representador de audio de streaming

El representador de audio de streaming (SAR) es un receptor multimedia que representa el audio. Cada instancia del SAR representa una sola secuencia de audio. Para representar varias secuencias, use varias instancias del SAR.

Para crear el SAR, llame a cualquiera de las funciones siguientes:

La segunda función, que devuelve un objeto de activación, es necesaria si está reproduciendo contenido protegido, ya que el objeto de activación debe serializarse en el proceso protegido. Para obtener contenido no cifrado, puede usar cualquiera de las funciones.

El SAR puede recibir audio sin comprimir en formato de punto flotante PCM o IEEE. Si la velocidad de reproducción es más rápida o más lenta que 1×, la SAR ajusta automáticamente el tono.

Configuración del representador de audio

El SAR admite varios atributos de configuración. El mecanismo para establecer estos atributos depende de la función a la que llame para crear la SAR. Si usa la función MFCreateAudioRenderer , haga lo siguiente:

  1. Cree un almacén de atributos mediante una llamada a MFCreateAttributes.
  2. Agregue los atributos al almacén de atributos.
  3. Pase el almacén de atributos a la función MFCreateAudioRenderer en el parámetro pAudioAttributes .

Si usa la función MFCreateAudioRendererActivate , la función devuelve un puntero a la interfaz IMFAttributes en el parámetro ppActivate . Use este puntero para agregar los atributos.

Para obtener una lista de los atributos de configuración, consulte Atributos del representador de audio.

Selección del dispositivo de punto de conexión de audio

Un dispositivo de punto de conexión de audio es un dispositivo de hardware que representa o captura audio. Entre los ejemplos se incluyen altavoces, auriculares, micrófonos y reproductores de CD. El SAR siempre usa un dispositivo de representación de audio. Hay dos maneras de seleccionar el dispositivo.

El primer enfoque consiste en enumerar los dispositivos de representación de audio en el sistema mediante la interfaz IMMDeviceEnumerator . Esta interfaz se documenta en la documentación básica de la API de audio.

  1. Cree el objeto del enumerador de dispositivos.
  2. Use el enumerador de dispositivos para enumerar los dispositivos de representación de audio. Cada dispositivo se representa mediante un puntero a la interfaz IMMDevice .
  3. Seleccione un dispositivo, en función de las propiedades del dispositivo o la selección del usuario.
  4. Llame a IMMDevice::GetId para obtener el identificador del dispositivo.
  5. Establezca el identificador de dispositivo como el valor del atributo MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID .

En lugar de enumerar los dispositivos, puede especificar el dispositivo de audio por su rol. Un rol de audio identifica una categoría general de uso. Por ejemplo, el rol de consola se define para juegos y notificaciones del sistema, mientras que el rol multimedia se define para música y películas. Cada rol tiene asignado un dispositivo de representación de audio y el usuario puede cambiar estas asignaciones. Si especifica un rol de dispositivo, el SAR usa cualquier dispositivo de audio que se haya asignado para ese rol. Para especificar el rol de dispositivo, establezca el atributo MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE .

Los dos atributos enumerados en esta sección son mutuamente excluyentes. Si no establece ninguno de ellos, el SAR usa el dispositivo de audio asignado al rol eConsole .

El código siguiente enumera los dispositivos de representación de audio y asigna el primer dispositivo de la lista a la SAR. En este ejemplo se usa la función MFCreateAudioRenderer para crear el 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);

Para crear el objeto de activación para el SAR, cambie el código que aparece después de la llamada a IMMDevice::GetId por lo siguiente:

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

Selección de la sesión de audio

Una sesión de audio es un grupo de secuencias de audio relacionadas que una aplicación puede administrar colectivamente. La aplicación puede controlar el nivel de volumen y silenciar el estado de cada sesión. Las sesiones se identifican mediante GUID. Para especificar la sesión de audio para el SAR, use el atributo MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID . Si no establece este atributo, la SAR combina la sesión predeterminada para ese proceso, identificada por GUID_NULL.

De forma predeterminada, una sesión de audio es específica del proceso, lo que significa que solo contiene secuencias del proceso de llamada. Para combinar una sesión entre procesos, establezca el atributo MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS con el valor MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_CROSSPROCESS.

Después de crear la SAR, usa la interfaz IMFAudioPolicy para unir la sesión a un grupo de sesiones, todos los cuales están controlados por el mismo control de volumen en el panel de control. También puede usar esta interfaz para establecer el nombre para mostrar y el icono que aparece en el control de volumen.

Controlar los niveles de volumen

Para controlar el nivel de volumen maestro de todas las secuencias de la sesión de audio de la SAR, use la interfaz IMFSimpleAudioVolume . Para controlar el volumen de una secuencia individual o para controlar el volumen de canales individuales dentro de una secuencia, use la interfaz IMFAudioStreamVolume . Ambas interfaces se obtienen mediante una llamada a IMFGetService::GetService. Puede llamar a GetService directamente en el SAR o llamarlo en la sesión multimedia. Los niveles de volumen se expresan como valores de atenuación. Para cada canal, el nivel de atenuación es el producto del volumen maestro y el volumen del canal.

Reproducción de audio y vídeo