Rôles d’appareil pour les applications DirectShow

Notes

L’API MMDevice prend en charge les rôles d’appareil. Toutefois, l’interface utilisateur de Windows Vista n’implémente pas la prise en charge de cette fonctionnalité. La prise en charge de l’interface utilisateur pour les rôles d’appareil peut être implémentée dans une version ultérieure de Windows. Pour plus d’informations, consultez Rôles d’appareil dans Windows Vista.

 

L’API DirectShow ne permet pas à une application de sélectionner l’appareil de point de terminaison audio affecté à un rôle d’appareil particulier. Toutefois, dans Windows Vista, les API audio principales peuvent être utilisées conjointement avec une application DirectShow pour activer la sélection des appareils en fonction du rôle d’appareil. À l’aide des API audio principales, l’application peut :

  • Identifiez l’appareil de point de terminaison audio que l’utilisateur a affecté à un rôle d’appareil particulier.
  • Créez un filtre de rendu audio DirectShow avec une interface IBaseFilter qui encapsule le périphérique de point de terminaison audio.
  • Créez un graphique DirectShow qui intègre le filtre.

Pour plus d’informations sur DirectShow et IBaseFilter, consultez la documentation du Kit de développement logiciel (SDK) Windows.

L’exemple de code suivant montre comment créer un filtre de rendu audio DirectShow qui encapsule l’appareil de point de terminaison de rendu affecté à un rôle d’appareil particulier :

//-----------------------------------------------------------
// Create a DirectShow audio rendering filter that
// encapsulates the audio endpoint device that is currently
// assigned to the specified device role.
//-----------------------------------------------------------
#define EXIT_ON_ERROR(hres)  \
              if (FAILED(hres)) { goto Exit; }
#define SAFE_RELEASE(punk)  \
              if ((punk) != NULL)  \
                { (punk)->Release(); (punk) = NULL; }

// This application's audio session GUID
const GUID guidAudioSessionId = {
    0xb13ff52e, 0xa5cf, 0x4fca,
    {0x9f, 0xc3, 0x42, 0x26, 0x5b, 0x0b, 0x14, 0xfb}
};

HRESULT CreateAudioRenderer(ERole role, IBaseFilter** ppAudioRenderer)
{
    HRESULT hr = S_OK;
    IMMDeviceEnumerator *pEnumerator = NULL;
    IMMDevice *pDevice = NULL;

    if (ppAudioRenderer == NULL)
    {
        return E_POINTER;
    }

    // Activate the IBaseFilter interface on the
    // audio renderer with the specified role.
    hr = CoCreateInstance(CLSID_MMDeviceEnumerator,
                          NULL, CLSCTX_INPROC_SERVER,
                          __uuidof(IMMDeviceEnumerator),
                          (void**)&pEnumerator);
    EXIT_ON_ERROR(hr)

    hr = pEnumerator->GetDefaultAudioEndpoint(eRender, role,
                                              &pDevice);
    EXIT_ON_ERROR(hr)

    DIRECTX_AUDIO_ACTIVATION_PARAMS  daap;
    daap.cbDirectXAudioActivationParams = sizeof(daap);
    daap.guidAudioSession = guidAudioSessionId;
    daap.dwAudioStreamFlags = AUDCLNT_STREAMFLAGS_CROSSPROCESS;

    PROPVARIANT  var;
    PropVariantInit(&var);

    var.vt = VT_BLOB;
    var.blob.cbSize = sizeof(daap);
    var.blob.pBlobData = (BYTE*)&daap;

    hr = pDevice->Activate(__uuidof(IBaseFilter),
                           CLSCTX_ALL, &var,
                           (void**)ppAudioRenderer);
    EXIT_ON_ERROR(hr)

Exit:
    SAFE_RELEASE(pEnumerator);
    SAFE_RELEASE(pDevice);
    return hr;
}

Dans l’exemple de code précédent, la fonction CreateAudioRenderer accepte un rôle d’appareil (eConsole, eMultimedia ou eCommunications) en tant que paramètre d’entrée. Le deuxième paramètre est un pointeur via lequel la fonction écrit l’adresse d’une interface IBaseFilter instance. En outre, l’exemple montre comment utiliser la méthode IMMDevice::Activate pour affecter le flux audio dans le instance IBaseFilter à une session audio interprocessu avec un GUID de session spécifique à l’application (spécifié par la constante guidAudioSessionId). Le troisième paramètre de l’appel Activate pointe vers une structure qui contient le GUID de session et l’indicateur interprocesseur. Si l’utilisateur exécute plusieurs instances de l’application, les flux audio de toutes les instances utilisent le même GUID de session et appartiennent donc à la même session.

L’appelant peut également spécifier NULL comme troisième paramètre de l’appel Activer pour affecter le flux à la session par défaut en tant que session spécifique au processus avec la valeur GUID de session GUID_NULL. Pour plus d’informations, consultez IMMDevice::Activate.

Interopérabilité avec les API audio héritées