Share via


Rôles d’appareil pour les applications DirectSound

Notes

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 permet pas à une application de sélectionner le périphérique 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 des appareils en fonction du rôle d’appareil. À 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 la fonction DirectSoundCreate ou DirectSoundCaptureCreate pour créer une interface IDirectSound ou IDirectSoundCapture instance 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 d’appareil DirectSound pour l’appareil de rendu ou 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 DirectSoundCaptureCreate .

L’exemple de code précédent obtient le GUID d’appareil DirectSound en :

  • Création d’une interface IMMDevice instance qui représente le périphérique de point de terminaison audio qui a la direction de flux de données et le rôle d’appareil spécifiés.
  • Ouverture du magasin de propriétés du périphérique de point de terminaison audio.
  • Obtention de la propriété PKEY_AudioEndpoint_GUID à partir du magasin de propriétés. La valeur de la 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 d’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 le périphérique 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 affecte le flux à une session audio inter-processus ou à une session avec un GUID de session non NULL , elle doit appeler la méthode IMMDevice::Activate pour créer un objet IDirectSound ou IDirectSoundCapture au lieu d’utiliser la technique indiquée dans l’exemple de code précédent. Pour obtenir un exemple de code qui montre comment utiliser la méthode Activate pour spécifier une session audio inter-processus ou un GUID de session non NULL 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 dans le système. À moins que le programme appelant ait précédemment appelé la fonction CoInitialize ou CoInitializeEx pour initialiser la bibliothèque COM, l’appel CoCreateInstance échoue. Pour plus d’informations sur CoCreateInstance, CoInitialize et CoInitializeEx, consultez la documentation du Kit de développement logiciel (SDK) Windows.

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