Partager via


Convertisseur audio de diffusion en continu

Le renderer audio de streaming (SAR) est un récepteur multimédia qui restitue l’audio. Chaque instance du SAR affiche 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 jouez 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 un audio non compressé au format PCM ou IEEE à virgule flottante. Si le taux de lecture est plus rapide ou plus lent 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 de renderer audio.

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

Un appareil de point de terminaison audio est un appareil 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 appareil de rendu audio. Il existe deux façons de sélectionner l’appareil.

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

  1. Créez l’objet énumérateur d’appareil.
  2. Utilisez l’énumérateur d’appareil pour énumérer les appareils 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 de 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 tout appareil audio affecté pour 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 ou l’autre d’entre eux, le SAR utilise l’appareil audio affecté au rôle eConsole.

Le code suivant énumère les appareils 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, remplacez le code qui apparaît après l’appel à IMMDevice ::GetId 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 de 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 joint la session par défaut pour 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 du processus appelant. Pour joindre une session inter-processus, 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, toutes contrôlées 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 s’affichent dans le contrôle de volume.

Contrôle des niveaux de volume

Pour contrôler le niveau de volume maître 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 maître et du volume du canal.

de lecture audio/vidéo