Convertisseur audio de diffusion en continu

Le convertisseur audio de streaming (SAR) est un récepteur multimédia qui restitue l’audio. Chaque instance du sar restitue un seul flux audio. Pour afficher plusieurs flux, utilisez plusieurs instances du sar.

Pour créer le sar, appelez l’une des fonctions suivantes :

La deuxième fonction, qui retourne un objet d’activation, est requise si vous lisez du contenu protégé, car l’objet d’activation doit être sérialisé dans le processus protégé. Pour effacer le contenu, vous pouvez utiliser l’une ou l’autre des fonctions.

Le sar peut recevoir du contenu audio non compressé au format PCM ou IEEE à virgule flottante. Si la vitesse de lecture est plus rapide ou plus lente que 1×, le sar ajuste automatiquement la hauteur.

Configuration du renderer audio

Le sar prend en charge plusieurs attributs de configuration. Le mécanisme de définition de ces attributs dépend de la fonction que vous appelez pour créer le sar. Si vous utilisez la fonction MFCreateAudioRenderer , procédez comme suit :

  1. Créez un magasin d’attributs en appelant MFCreateAttributes.
  2. Ajoutez les attributs au magasin d’attributs.
  3. Transmettez le magasin d’attributs à la fonction MFCreateAudioRenderer dans le paramètre pAudioAttributes .

Si vous utilisez la fonction MFCreateAudioRendererActivate , la fonction retourne un pointeur vers l’interface IMFAttributes dans le paramètre ppActivate . Utilisez ce pointeur pour ajouter les attributs.

Pour obtenir la liste des attributs de configuration, consultez Attributs du renderer audio.

Sélection de l’appareil de point de terminaison audio

Un périphérique de point de terminaison audio est un périphérique matériel qui affiche ou capture l’audio. Par exemple, les haut-parleurs, les casques, les microphones et les lecteurs CD. Le sar utilise toujours un périphérique de rendu audio. Il existe deux façons de sélectionner l’appareil.

La première approche consiste à énumérer les périphériques de rendu audio sur le système, à l’aide de l’interface IMMDeviceEnumerator . Cette interface est documentée dans la documentation principale de l’API audio.

  1. Créez l’objet énumérateur d’appareil.
  2. Utilisez l’énumérateur d’appareil pour énumérer les périphériques de rendu audio. Chaque appareil est représenté par un pointeur vers l’interface IMMDevice .
  3. Sélectionnez un appareil, en fonction des propriétés de l’appareil ou de la sélection de l’utilisateur.
  4. Appelez IMMDevice::GetId pour obtenir l’identificateur de l’appareil.
  5. Définissez l’identificateur de l’appareil comme valeur de l’attribut MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID .

Au lieu d’énumérer les appareils, vous pouvez spécifier l’appareil audio par son rôle. Un rôle audio identifie une catégorie générale d’utilisation. Par exemple, le rôle console est défini pour les jeux et les notifications système, tandis que le rôle multimédia est défini pour la musique et les films. Chaque rôle dispose d’un périphérique de rendu audio qui lui est attribué, et l’utilisateur peut modifier ces affectations. Si vous spécifiez un rôle d’appareil, le sar utilise l’appareil audio affecté à ce rôle. Pour spécifier le rôle d’appareil, définissez l’attribut MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE .

Les deux attributs répertoriés dans cette section s’excluent mutuellement. Si vous ne définissez pas l’un d’eux, le sar utilise le périphérique audio affecté au rôle eConsole .

Le code suivant énumère les périphériques de rendu audio et affecte le premier appareil de la liste au sar. Cet exemple utilise la fonction MFCreateAudioRenderer pour créer le 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);

Pour créer l’objet d’activation pour le sar, modifiez le code qui apparaît après l’appel à IMMDevice::GetId en procédant comme suit :

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

Sélection de la session audio

Une session audio est un groupe de flux audio connexes qu’une application peut gérer collectivement. L’application peut contrôler le niveau du volume et désactiver l’état de chaque session. Les sessions sont identifiées par GUID. Pour spécifier la session audio pour le sar, utilisez l’attribut MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID . Si vous ne définissez pas cet attribut, le sar rejoint la session par défaut de ce processus, identifiée par GUID_NULL.

Par défaut, une session audio est spécifique au processus, ce qui signifie qu’elle contient uniquement des flux provenant du processus appelant. Pour joindre une session interprocesseur, définissez l’attribut MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS avec la valeur MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_CROSSPROCESS.

Après avoir créé le sar, vous utilisez l’interface IMFAudioPolicy pour joindre la session à un groupe de sessions, tous contrôlés par le même contrôle de volume dans le panneau de configuration. Vous pouvez également utiliser cette interface pour définir le nom d’affichage et l’icône qui apparaissent dans le contrôle de volume.

Contrôle des niveaux de volume

Pour contrôler le niveau de volume principal de tous les flux de la session audio du SAR, utilisez l’interface IMFSimpleAudioVolume . Pour contrôler le volume d’un flux individuel ou contrôler le volume de canaux individuels au sein d’un flux, utilisez l’interface IMFAudioStreamVolume . Les deux interfaces sont obtenues en appelant IMFGetService::GetService. Vous pouvez appeler GetService directement sur le service SAR ou l’appeler sur la session multimédia. Les niveaux de volume sont exprimés sous forme de valeurs d’atténuation. Pour chaque canal, le niveau d’atténuation est le produit du volume principal et du volume du canal.

Lecture audio/vidéo