Поделиться через


Роли устройств для приложений DirectSound

Примечание.

API MMDevice поддерживает роли устройств. Однако пользовательский интерфейс в Windows Vista не реализует поддержку этой функции. Поддержка пользовательского интерфейса для ролей устройств может быть реализована в будущей версии Windows. Дополнительные сведения см. в статье "Роли устройств" в Windows Vista.

 

API DirectSound не предоставляет средства для приложения, чтобы выбрать устройство аудио конечной точки, которое пользователь назначил определенной роли устройства. Однако в Windows Vista основные API аудио можно использовать вместе с приложением DirectSound для включения выбора устройств на основе роли устройства. С помощью основных API аудио, приложение может определить устройство аудио конечной точки, назначенное определенной роли, получить GUID устройства DirectSound для устройства конечной точки и вызвать функцию DirectSoundCreate или DirectSoundCaptureCreate, чтобы создать экземпляр интерфейса IDirectSound или IDirectSoundCapture, который инкапсулирует устройство конечной точки. Дополнительные сведения о DirectSound см. в документации по пакету SDK для Windows.

В следующем примере кода показано, как получить GUID устройства DirectSound для отрисовки или записи устройства, которое в настоящее время назначено определенной роли устройства:

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

В приведенном выше примере кода функция GetDirectSoundGuid принимает направление потока данных (eRender или eCapture) и роль устройства (eConsole, eMultimedia или eCommunications) в качестве входных параметров. Третий параметр — это указатель, с помощью которого функция записывает GUID устройства, который приложение может предоставить в качестве входного параметра функции DirectSoundCreate или DirectSoundCaptureCreate .

В предыдущем примере кода показано, как получить GUID устройства DirectSound, выполнив указанные ниже действия.

  • Создание экземпляра интерфейса IMMDevice, представляющего устройство аудио конечной точки, которое имеет указанное направление потока данных и роль устройства.
  • Открытие хранилища свойств устройства аудио конечной точки.
  • Получение свойства PKEY_AudioEndpoint_GUID из хранилища свойств. Значение свойства представляет строковое представление GUID устройства DirectSound для устройства аудио конечной точки.
  • Вызов функции CLSIDFromString для преобразования строкового представления GUID устройства в структуру GUID GUID устройства. Дополнительные сведения о CLSIDFromString см. в документации по пакету SDK для Windows.

Получив GUID устройства из функции GetDirectSoundGuid, приложение может вызвать DirectSoundCreate или DirectSoundCaptureCreate с помощью этого GUID, чтобы создать устройство отрисовки Или записи DirectSound, которое инкапсулирует устройство аудио конечной точки. Когда DirectSound создает устройство таким образом, он всегда назначает звуковой поток устройства сеансу по умолчанию — сеанс аудио, определенный процессом, который определяется значением GUID сеанса сеанса GUID_NULL.

Если приложению требуется DirectSound для назначения потока межпроцессному звуковому сеансу или сеансу с GUID сеанса, отличного от NULL, следует вызвать метод IMMDevice::Activate, чтобы создать объект IDirectSound или IDirectSoundCapture вместо использования метода, показанного в предыдущем примере кода. Пример кода, в котором показано, как использовать метод Активации для указания межпроцессного звукового сеанса или GUID сеанса, отличного от NULL для потока, см. в разделе "Роли устройства для приложений DirectShow". В примере кода в этом разделе показано, как создать фильтр DirectShow, но при незначительных изменениях код можно адаптировать для создания устройства DirectSound.

Функция GetDirectSoundGuid в предыдущем примере кода вызывает функцию CoCreateInstance для создания перечислителя для устройств аудио конечной точки в системе. Если ранее вызываемая программа не вызывала функцию CoInitialize или CoInitializeEx для инициализации библиотеки COM, вызов CoCreateInstance завершится ошибкой. Дополнительные сведения о CoCreateInstance, CoInitialize и CoInitializeEx см. в документации по пакету SDK для Windows.

Взаимодействие с устаревшими API аудио