Что представляют значения перечисления ERoles в Windows Core Audio API? Являются ли они взаимоисключающими?

Из документа Microsoft API: https://docs.microsoft.com/en-us/windows/win32/api/mmdeviceapi/ne-mmdeviceapi-erole

Перечисление ERole

typedef enum __MIDL___MIDL_itf_mmdeviceapi_0000_0000_0002 {
  eConsole,
  eMultimedia,
  eCommunications,
  ERole_enum_count
} ERole;

определяет список «ролей», которые устройства конечных точек аудио выбирают для воспроизведения

Константы

  • eConsole Игры, звуки системных уведомлений и голосовые команды.
  • eMultimedia Музыка, фильмы, дикторский текст и запись живой музыки.
  • Электронные коммуникации Голосовое общение (разговор с другим человеком).
  • ERole_enum_count Количество элементов в перечислении ERole (не считая члена ERole_enum_count).

Чего я не получаю на странице документа:

  • Если для устройства установлено значение eConsole, будет ли оно полностью исключено из обработки
  • Музыка, фильмы, дикторское сопровождение и запись живой музыки, а также

  • Голосовая связь (разговор с другим человеком)

?

Я не верю, что ответ положительный, потому что аппаратное обеспечение низкого уровня или ОС не будут знать, является ли аудиопоток музыкой или речью без пользовательских тегов. Так что же это ERole тогда? Конфигурация микширования звука, которая «хорошо» (субъективно и статистически) воспроизводится с целевыми типами контента? Настройка задержки? или сочетание двух или более свойств?

ОБНОВЛЕНИЕ

Спасибо за ответ @Roman R.. Теперь больше вопросов, все еще соответствующих названию вопроса:

Док IMMDeviceEnumerator::GetDefaultAudioEndpoint говорит:

HRESULT GetDefaultAudioEndpoint(
  EDataFlow dataFlow,
  ERole     role,
  IMMDevice **ppEndpoint
);

роль

Роль конечного устройства. Вызывающий должен установить для этого параметра одно из следующих значений перечисления ERole:

электронная консоль

Электронная Мультимедиа

Электронные коммуникации

поэтому может быть назначена только «ОДНА» роль; И поскольку ERole_enum_count не является реальным вариантом, как в большинстве пользовательских протоколов enum, как можно убедиться, что «all of the roles» воспроизводится одним устройством, как указано в роли устройств и ваша цитата на этой странице?


person kakyo    schedule 24.09.2019    source источник


Ответы (1)


Роли устройств:

Конкретному устройству рендеринга или захвата может не быть назначено ни одной, одной, некоторым или всем ролям из предыдущей таблицы. В любой момент каждая роль в таблице назначается одному (и только одному) устройству рендеринга и одному (и только одному) устройству захвата. То есть назначение ролей устройствам рендеринга не зависит от назначения ролей устройствам захвата.

Первое предложение выше отвечает на вопрос, являются ли роли взаимоисключающими. Устройства не исключены из обработки ввода-вывода аудио. Вместо этого роли определяют, какое устройство используется для определенных действий в системе с несколькими устройствами. Например, коммуникационное программное обеспечение будет выполнять захват/рендеринг звука с использованием устройств, которым назначена роль eCommunications, в то время как воспроизведение мультимедиа будет осуществляться на другом устройстве.

Автоматическое определение роли устройства:

Рассмотрим сценарий, в котором компьютер имеет устройство рендеринга по умолчанию, динамики, и устройство захвата по умолчанию, микрофон. Пользователь подключает USB-гарнитуру к компьютеру. После установки соответствующих драйверов операционная система пытается определить роль для назначения новому аудиоустройству.

и, например,

...Коммуникационное приложение может улучшить взаимодействие с пользователем, реализовав такие действия, как приглушение, обрабатывая уведомления с конечной точки устройства.

УПД

поэтому может быть назначена только "ОДНА" роль

Неправда, и в документации есть четкое указание на это.

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

Позвольте мне еще раз вытащить это из комментария: «Роли вместо этого помогают вам выбирать между [несколькими] устройствами». Роли не ограничивают использование аудиоустройств приложениями. Они просто помогают выбрать правильное устройство в случае, если система оснащена несколькими устройствами, а также могут быть настройки для конкретных ролей для устройств, например, эхоподавление.

person Roman R.    schedule 24.09.2019
comment
Спасибо за Ваш ответ. Это действительно помогает. Я должен был копнуть глубже в документы. Но, прочитав больше, теперь мой новый вопрос: если в качестве роли для устройства выбрано ERole_enum_count, то устройство будет играть все роли? - person kakyo; 24.09.2019
comment
Во-первых, вы не должны выбирать роли для устройства, то есть вы назначаете их из своего приложения. Вместо этого роли помогают выбирать между [несколькими] устройствами. Во-вторых, ERole_enum_count не является реальным значением, это искусственная запись перечисления, которая помогает при перечислении ролей (обычно широко используется для перечислений). - person Roman R.; 24.09.2019
comment
ой. Но тогда это приводит к новым вопросам. Не могли бы вы увидеть мой обновленный вопрос? - person kakyo; 24.09.2019
comment
Понятно. Таким образом, это одна роль на вызов API. Спасибо! - person kakyo; 24.09.2019
comment
Представьте, что вы разрабатываете коммуникационное приложение с аудиоконтентом. Вы хотите доставить это аудио, вы заходите в API и спрашиваете: какое устройство мне следует использовать, какое лучше подходит для передачи аудиоконтента? Ну вот. Вам все равно, используется ли одно и то же устройство для мультимедиа. Или вам все равно, и тогда вы сделаете еще один вызов API, чтобы узнать это. Когда у вас есть ссылка на устройство, вы просто используете его как обычное устройство, не обращая внимания на назначенные роли. - person Roman R.; 24.09.2019
comment
Имеет смысл. Таким образом, клиент больше фокусируется на задаче, чем на идентификации устройства. - person kakyo; 24.09.2019