Partager via


Rôles d’appareil pour les applications DirectSound

Note

L’API MMDevice prend en charge les rôles d’appareil. Toutefois, l’interface utilisateur dans 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 DirectSound ne fournit pas de moyen à une application de sélectionner l’appareil de point de terminaison audio que l’utilisateur a affecté à un rôle d’appareil particulier. Toutefois, dans Windows Vista, les API audio principales peuvent être utilisées conjointement avec une application DirectSound pour activer la sélection de l’appareil en fonction du rôle d’appareil. Avec l’aide des API audio principales, l’application peut identifier l’appareil de point de terminaison audio affecté à un rôle particulier, obtenir le GUID de l’appareil DirectSound pour l’appareil de point de terminaison et appeler le DirectSoundCreate ou DirectSoundCaptureCreate fonction pour créer une fonction IDirectSound ou iDirectSoundCapture instance d’interface qui encapsule l’appareil de point de terminaison. Pour plus d’informations sur DirectSound, consultez la documentation du Kit de développement logiciel (SDK) Windows.

L’exemple de code suivant montre comment obtenir le GUID de l’appareil DirectSound pour le rendu ou l’appareil de capture actuellement affecté à un rôle d’appareil particulier :

//-----------------------------------------------------------
// Get the DirectSound or DirectSoundCapture device GUID for
// an audio endpoint device. If flow = eRender, the function
// gets the DirectSound device GUID for the rendering device
// with the specified device role. If flow = eCapture, the
// function gets the DirectSoundCapture device GUID for the
// capture device with the specified device role.
//-----------------------------------------------------------
#define EXIT_ON_ERROR(hr)  \
              if (FAILED(hr)) { goto Exit; }
#define SAFE_RELEASE(punk)  \
              if ((punk) != NULL)  \
                { (punk)->Release(); (punk) = NULL; }

HRESULT GetDirectSoundGuid(EDataFlow flow, ERole role, GUID* pDevGuid)
{
    HRESULT hr = S_OK;
    IMMDeviceEnumerator *pEnumerator = NULL;
    IMMDevice *pDevice = NULL;
    IPropertyStore *pProps = NULL;

    PROPVARIANT var;
    PropVariantInit(&var);

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

    // Get a device enumerator for the audio endpoint
    // devices in the system.
    hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
                          NULL, CLSCTX_INPROC_SERVER,
                          __uuidof(IMMDeviceEnumerator),
                          (void**)&pEnumerator);
    EXIT_ON_ERROR(hr)

    // Get the endpoint device with the specified dataflow
    // direction (eRender or eCapture) and device role.
    hr = pEnumerator->GetDefaultAudioEndpoint(flow, role,
                                              &pDevice);
    EXIT_ON_ERROR(hr)

    hr = pDevice->OpenPropertyStore(STGM_READ, &pProps);
    EXIT_ON_ERROR(hr)

    // Get the DirectSound or DirectSoundCapture device GUID
    // (in WCHAR string format) for the endpoint device.
    hr = pProps->GetValue(PKEY_AudioEndpoint_GUID, &var);
    EXIT_ON_ERROR(hr)

    // Convert the WCHAR string to a GUID structure.
    hr = CLSIDFromString(var.pwszVal, pDevGuid);
    EXIT_ON_ERROR(hr)

Exit:
    PropVariantClear(&var);
    SAFE_RELEASE(pEnumerator);
    SAFE_RELEASE(pDevice);
    SAFE_RELEASE(pProps);
    return hr;
}

Dans l’exemple de code précédent, la fonction GetDirectSoundGuid accepte une direction de flux de données (eRender ou eCapture) et un rôle d’appareil (eConsole, eMultimedia ou eCommunications) comme paramètres d’entrée. Le troisième paramètre est un pointeur par lequel la fonction écrit un GUID d’appareil que l’application peut fournir en tant que paramètre d’entrée à la fonction directSoundCreate ou fonction DirectSoundCaptureCreate.

L’exemple de code précédent obtient le GUID de l’appareil DirectSound par :

  • Création d’un IMMDevice instance d’interface qui représente l’appareil de point de terminaison audio qui a le rôle de flux de données et de périphérique spécifiés.
  • Ouverture du magasin de propriétés de l’appareil de point de terminaison audio.
  • Obtention de la propriété PKEY_AudioEndpoint_GUID à partir du magasin de propriétés. La valeur de propriété est une représentation sous forme de chaîne du GUID de l’appareil DirectSound pour l’appareil de point de terminaison audio.
  • Appel de la fonction CLSIDFromString pour convertir la représentation sous forme de chaîne du GUID de l’appareil en structure GUID. Pour plus d’informations sur CLSIDFromString, consultez la documentation du Kit de développement logiciel (SDK) Windows.

Après avoir obtenu un GUID d’appareil à partir de la fonction GetDirectSoundGuid, l’application peut appeler DirectSoundCreate ou DirectSoundCaptureCreate avec ce GUID pour créer l’appareil de rendu ou de capture DirectSound qui encapsule l’appareil de point de terminaison audio. Lorsque DirectSound crée un appareil de cette façon, il affecte toujours le flux audio de l’appareil à la session par défaut, la session audio spécifique au processus identifiée par la valeur GUID de session GUID_NULL.

Si l’application exige que DirectSound attribue le flux à une session audio inter-processus ou à une session avec un GUID de sessionnull non NULL, il doit appeler la méthode IMMDevice ::Activate pour créer une méthode IDirectSound ou objet IDirectSoundCapture au lieu d’utiliser la technique indiquée dans l’exemple de code précédent. Pour obtenir un exemple de code montrant comment utiliser la méthode Activate pour spécifier une session audio inter-processus ou un GUID de session null nonNULL pour un flux, consultez Rôles d’appareil pour les applications DirectShow. L’exemple de code de cette section montre comment créer un filtre DirectShow, mais, avec des modifications mineures, le code peut être adapté pour créer un appareil DirectSound.

La fonction GetDirectSoundGuid dans l’exemple de code précédent appelle la fonction CoCreateInstance pour créer un énumérateur pour les appareils de point de terminaison audio du système. Sauf si le programme appelant a précédemment appelé la fonction CoInitialize ou Fonction CoInitializeEx pour initialiser la bibliothèque COM, l’appel CoCreateInstance échoue. Pour plus d’informations sur CoCreateInstance, CoInitializeet CoInitializeEx, consultez la documentation du KIT de développement logiciel (SDK) Windows.

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