Udostępnij za pośrednictwem


Role urządzeń dla aplikacji DirectSound

Nuta

Interfejs API mmdevice obsługuje role urządzeń. Jednak interfejs użytkownika w systemie Windows Vista nie implementuje obsługi tej funkcji. Obsługa interfejsu użytkownika dla ról urządzeń może zostać zaimplementowana w przyszłej wersji systemu Windows. Aby uzyskać więcej informacji, zobacz Role urządzeń w systemie Windows Vista.

 

Interfejs API DirectSound nie zapewnia aplikacji możliwości wybrania urządzenia punktu końcowego audio , które użytkownik przypisał do określonej roli urządzenia . Jednak w systemie Windows Vista podstawowe interfejsy API audio mogą być używane w połączeniu z aplikacją DirectSound, aby umożliwić wybór urządzenia na podstawie roli urządzenia. Za pomocą podstawowych interfejsów API audio, aplikacja może zidentyfikować urządzenie punktu końcowego audio przypisane do określonej roli, uzyskać identyfikator GUID urządzenia DirectSound dla urządzenia punktu końcowego i wywołać DirectSoundCreate lub DirectSoundCaptureCreate funkcji, aby utworzyć IDirectSound lub IDirectSoundCapture wystąpienie interfejsu, które hermetyzuje urządzenie punktu końcowego. Aby uzyskać więcej informacji na temat zestawu DirectSound, zobacz dokumentację zestawu Windows SDK.

W poniższym przykładzie kodu pokazano, jak uzyskać identyfikator GUID urządzenia DirectSound na potrzeby renderowania lub przechwytywania urządzenia, które jest obecnie przypisane do określonej roli urządzenia:

//-----------------------------------------------------------
// 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;
}

W poprzednim przykładzie kodu funkcja GetDirectSoundGuid akceptuje kierunek przepływu danych (eRender lub eCapture) i rolę urządzenia (eConsole, eMultimedia lub eCommunications) jako parametry wejściowe. Trzeci parametr jest wskaźnikiem, za pomocą którego funkcja zapisuje identyfikator GUID urządzenia, który aplikacja może podać jako parametr wejściowy do funkcji DirectSoundCreate lub DirectSoundCaptureCreate.

Powyższy przykład kodu uzyskuje identyfikator GUID urządzenia DirectSound przez:

  • Tworzenie wystąpienia interfejsu IMMDevice, które reprezentuje urządzenie punktu końcowego audio z określonym kierunkiem przepływu danych i rolą urządzenia.
  • Otwieranie magazynu właściwości urządzenia punktu końcowego audio.
  • Pobieranie właściwości PKEY_AudioEndpoint_GUID z magazynu właściwości. Wartość właściwości to ciąg reprezentujący identyfikator GUID urządzenia DirectSound dla urządzenia punktu końcowego audio.
  • Wywołanie funkcji CLSIDFromString w celu przekonwertowania reprezentacji ciągu identyfikatora GUID urządzenia na strukturę identyfikatora GUID. Aby uzyskać więcej informacji na temat CLSIDFromString, zobacz dokumentację zestawu Windows SDK.

Po uzyskaniu identyfikatora GUID urządzenia z funkcji GetDirectSoundGuid aplikacja może wywołać DirectSoundCreate lub DirectSoundCaptureUtwórz za pomocą tego identyfikatora GUID w celu utworzenia renderowania lub przechwytywania directsound urządzenia, które hermetyzuje urządzenie punktu końcowego audio. Gdy directSound tworzy urządzenie w ten sposób, zawsze przypisuje strumień audio urządzenia do sesji domyślnej — sesji audio specyficznej dla procesu, która jest identyfikowana przez wartość identyfikatora GUID sesji GUID_NULL.

Jeśli aplikacja wymaga, aby directSound przypisał strumień do sesji audio między procesami lub do sesji z identyfikatorem GUID sesjinull null, powinien wywołać IMMDevice::Activate metodę, aby utworzyć IDirectSound lub IDirectSoundCapture obiektu zamiast używać techniki pokazanej w poprzednim przykładzie kodu. Przykładowy kod pokazujący sposób użycia metody Activate w celu określenia sesji audio między procesami lub identyfikatora GUID sesjinull null dla strumienia, zobacz Role urządzeń dla aplikacji DirectShow. Przykładowy kod w tej sekcji pokazuje, jak utworzyć filtr DirectShow, ale przy drobnych modyfikacjach kod można dostosować do tworzenia urządzenia DirectSound.

Funkcja GetDirectSoundGuid w poprzednim przykładzie kodu wywołuje funkcję CoCreateInstance w celu utworzenia modułu wyliczającego dla urządzeń punktu końcowego audio w systemie. Jeśli program wywołujący wcześniej nie nazwał CoInitialize lub coInitializeEx funkcji inicjowania biblioteki COM, wywołanie CoCreateInstance zakończy się niepowodzeniem. Aby uzyskać więcej informacji na temat CoCreateInstance, CoInitializei CoInitializeEx, zobacz dokumentację zestawu Windows SDK.

współdziałanie ze starszymi interfejsami API audio