Реализация связи с аудиомодулем
Звуковой модуль — это отдельная часть логики обработки звука, выполняющая относительно атомарную функцию. Звуковой модуль может находиться в аудиодрайвеоре или в звуковом DSP. Примером звукового модуля может быть обработка звука на основе DSP.
Начиная с Windows 10 выпуска 1703, существуют интерфейсы API и DDIs для поддержки обмена данными из приложений универсальная платформа Windows (UWP) и драйверов устройств в режиме ядра.
В этом разделе содержатся сведения о реализации взаимодействия с аудиомодулем в драйвере устройства ядра.
Сведения о том, как отправлять команды и получать уведомления об изменениях из модулей звуковых устройств с помощью приложения UWP, см. в статье Настройка и запрос модулей звуковых устройств.
Зачем использовать звуковые модули?
Изготовители оборудования обычно объединяют в свою систему приложение конфигурации, которое позволяет клиенту контролировать аспекты этой аудиосистемы и настраивать ее в зависимости от своих предпочтений. Аудиоподсистема может содержать различные компоненты, такие как объекты обработки звука на узле, аппаратная обработка DSP и специализированное оборудование, например интеллектуальный усилиитель (все в дополнение к самому звуковому кодеку). В большинстве случаев эти компоненты создаются и продаются разными поставщиками. Исторически IHV создавали собственные частные API для интеграции друг с другом и отправки информации между отдельными компонентами. Существующие приложения конфигурации WIN32 будут использовать эти частные API.
Универсальная платформа Windows (UWP) предоставляет набор API- интерфейсов, которые позволяют одному приложению работать на широком спектре устройств. UWP также представил новый внешний вид, который стал ожиданиями клиентов для приложений, работающих на Windows 10. Многие изготовители оборудования хотели бы создавать приложения для настройки звука на UWP. Однако основная функция безопасности UWP (песочница AppContainer) предотвращает обмен данными между приложением и другими компонентами в звуковой подсистеме. Это делает закрытые API, ранее используемые приложениями конфигурации, недоступными в UWP.
Начиная с Windows 10, выпуск 1703, API UWP audio Modules позволяет приложениям конфигурации и компонентам пользовательского режима взаимодействовать с модулями на уровне ядра и оборудования, которые можно обнаружить с помощью нового набора свойств KS. Audio IHV и ISV могут создавать приложения и службы, которые могут взаимодействовать со своими аппаратными модулями, используя четко определенный интерфейс, предоставляемый Windows. Дополнительные сведения об API звуковых модулей см. в разделе Пространство имен Windows.Media.Devices.
Определения аудиомодулем
Эти определения относятся к звуковым модулям.
Термин | Определение |
---|---|
Звуковой модуль | Отдельный фрагмент логики обработки звука, выполняющий относительно атомарную функцию. Может находиться в аудиодрайвеоре или в звуковом DSP. Примером звукового модуля может быть объект обработки звука (APO). |
Распространенные определения звука
Эти определения обычно используются при работе со звуковыми драйверами.
Термин | Определение |
---|---|
OEM | Изготовитель оригинального оборудования |
IHV | Независимый поставщик оборудования |
Независимый поставщик программного обеспечения | Независимые поставщики программного обеспечения |
HSA | Приложение поддержки оборудования |
UWP | Универсальная платформа Windows |
APO | Объект обработки звука |
DSP | Цифровая обработка сигналов |
Архитектура
Звуковые модули помещают в действие механизм, поддерживаемый Windows для отправки сообщений между пользовательским режимом и звуковыми компонентами режима ядра. Важное различие заключается в том, что звуковые модули стандартизируют транспортный конвейер. Он не устанавливает протокол связи для этого транспорта и использует поставщики программного обеспечения и IHV для определения протокола. Цель состоит в том, чтобы разрешить существующие сторонние проекты легко переносить на звуковые модули с очень небольшими изменениями.
<Ожидание схемы>
API аудиомодуля предоставляет доступ к модулям с помощью двух разных методов нацеливания: фильтра волн KS и инициализированного контакта (потока) KS. Размещение и доступ к определенным модулям зависят от реализации.
HSA и другие приложения смогут получить доступ только к модулям, доступным через дескриптор фильтра. Отдельные apOs, загруженные в поток, являются единственными объектами, которые будут иметь доступ к целевым аудиомодулю потока.
Дополнительные сведения об API см. в разделе Объекты обработки звука Windows.
Отправка команд
Клиент аудиомодуля может запрашивать и изменять параметры, чтобы отправлять команды в звуковые модули в ядре и аппаратные компоненты в звуковой подсистеме. Структура команд API аудиомодуля определяется слабо и формализует способ обнаружения и идентификации модулей. Однако подробная структура команд должна быть разработана и реализована участвующим поставщиком программного обеспечения и IHV, чтобы установить протокол для отправки сообщений и ожидаемый ответ.
Уведомления модуля для клиентов аудиомодулем
Аудио минипорт также позволяет уведомлять клиентов аудиомодулем и передавать информацию, если клиент подписался на уведомления в определенном модуле. Информация, передаваемая в этих уведомлениях, не определяется API аудиомодуля, а определяется поставщиком программного обеспечения и (или) IHV.
Включение, отключение и общие сведения о топологии
API звуковых модулей определяют, как перечислять и отправлять команды модулям. Однако API не определяют явно, как клиенты аудиомодулов могут включать или отключать определенные модули. Кроме того, он не позволяет клиентам находить сведения о топологии или размещать модули относительно друг друга. IHV и ISV могут определить, требуется ли эта функция, и решить, как ее реализовать.
Рекомендуемый подход — предоставление глобального модуля драйвера. Модуль глобального драйвера будет обрабатывать пользовательские команды для этих запросов, относящихся к топологии.
DDIs аудиомодула
Свойства модуля потоковой передачи ядра
Новый набор свойств KS, идентифицируемый KSPROPSETID_AudioModule, определен для трех свойств, относящихся к звуковым модулям.
Драйвер мини-порта PortCls должен напрямую обрабатывать ответ для каждого свойства, так как вспомогательный интерфейс не предоставляется.
ksmedia.h:
#define STATIC_KSPROPSETID_AudioModule \
0xc034fdb0, 0xff75, 0x47c8, 0xaa, 0x3c, 0xee, 0x46, 0x71, 0x6b, 0x50, 0xc6
DEFINE_GUIDSTRUCT("C034FDB0-FF75-47C8-AA3C-EE46716B50C6", KSPROPSETID_AudioModule);
#define KSPROPSETID_AudioModule DEFINE_GUIDNAMED(KSPROPSETID_AudioModule)
typedef enum {
KSPROPERTY_AUDIOMODULE_DESCRIPTORS = 1,
KSPROPERTY_AUDIOMODULE_COMMAND = 2,
KSPROPERTY_AUDIOMODULE_NOTIFICATION_DEVICE_ID = 3,
} KSPROPERTY_AUDIOMODULE;
Дескрипторы аудиомодулов
Поддержка свойства KSPROPERTY_AUDIOMODULE_DESCRIPTORS определяет, что драйвер учитывает звуковой модуль. Свойство будет запрашиваться через дескриптор фильтра или закрепления, а KSPROPERTY передается в качестве входного буфера для вызова DeviceIoControl. KSAUDIOMODULE_DESCRIPTOR определен для описания каждого модуля в звуковом оборудовании. Массив этих дескрипторов возвращается в ответ на этот запрос.
ksmedia.h:
#define AUDIOMODULE_MAX_NAME_SIZE 128
typedef struct _KSAUDIOMODULE_DESCRIPTOR
{
GUID ClassId;
ULONG InstanceId;
ULONG VersionMajor;
ULONG VersionMinor;
WCHAR Name[AUDIOMODULE_MAX_NAME_SIZE];
} KSAUDIOMODULE_DESCRIPTOR, *PKSAUDIOMODULE_DESCRIPTOR;
Дополнительные сведения см. в разделе KSAUDIOMODULE_DESCRIPTOR.
Команда звукового модуля
Поддержка свойства KSPROPERTY_AUDIOMODULE_COMMAND позволяет клиентам аудиомодуля отправлять пользовательские команды для запроса и задания параметров в звуковых модулях. Свойство может быть отправлено через дескриптор фильтра или закрепления, а KSAUDIOMODULE_PROPERTY передается в качестве входного буфера для вызова DeviceIoControl. При необходимости клиент может отправлять дополнительные сведения непосредственно рядом с KSAUDIOMODULE_PROPERTY во входном буфере для отправки пользовательских команд.
ksmedia.h:
#define AUDIOMODULE_MAX_DATA_SIZE 64000
typedef struct _KSPAUDIOMODULE_PROPERTY
{
KSPROPERTY Property;
GUID ClassId;
ULONG InstanceId;
} KSAUDIOMODULE_PROPERTY, *PKSPAUDIOMODULE_PROPERTY;
Дополнительные сведения см. в разделе KSAUDIOMODULE_PROPERTY.
Идентификатор устройства уведомления звукового модуля
Поддержка KSPROPERTY_AUDIOMODULE_NOTIFICATION_DEVICE_ID необходима, чтобы позволить минипорту передавать уведомления и передавать информацию клиентам аудиомодулем. Время существования этого идентификатора привязано к времени существования звукового устройства, которое предоставляется и активируется в стеке Windows Audio. Свойство может быть отправлено через дескриптор фильтра или закрепления, а KSPROPERTY передается в качестве входного буфера для вызова DeviceIoControl.
Дополнительные сведения см. в разделе KSAUDIOMODULE_PROPERTY.
Вспомогатель PortCls — уведомления аудиомодулем
Добавлен новый интерфейс порта, помогающий разработчикам драйверов отправлять уведомления клиентам аудиомодуля.
PortCls.h:
typedef struct _PCNOTIFICATION_BUFFER
{
UCHAR NotificationBuffer[1];
} PCNOTIFICATION_BUFFER, *PPCNOTIFICATION_BUFFER;
DECLARE_INTERFACE_(IPortClsNotifications,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
STDMETHOD_(NTSTATUS, AllocNotificationBuffer)
( THIS_
_In_ POOL_TYPE PoolType,
_In_ USHORT NumberOfBytes,
_Out_ PPCNOTIFICATION_BUFFER* NotificationBuffer
) PURE;
STDMETHOD_(void, FreeNotificationBuffer)
( THIS_
_In_ PPCNOTIFICATION_BUFFER NotificationBuffer
) PURE;
STDMETHOD_(void, SendNotificationBuffer)
( THIS_
_In_ const GUID* NotificationId,
_In_ PPCNOTIFICATION_BUFFER NotificationBuffer
) PURE;
};
//
// Audio module notification definitions.
//
#define STATIC_KSNOTIFICATIONID_AudioModule \
0x9C2220F0, 0xD9A6, 0x4D5C, 0xA0, 0x36, 0x57, 0x38, 0x57, 0xFD, 0x50, 0xD2
DEFINE_GUIDSTRUCT("9C2220F0-D9A6-4D5C-A036-573857FD50D2", KSNOTIFICATIONID_AudioModule);
#define KSNOTIFICATIONID_AudioModule DEFINE_GUIDNAMED(KSNOTIFICATIONID_AudioModule)
typedef struct _KSAUDIOMODULE_NOTIFICATION {
union {
struct {
GUID DeviceId;
GUID ClassId;
ULONG InstanceId;
ULONG Reserved;
} ProviderId;
LONGLONG Alignment;
};
} KSAUDIOMODULE_NOTIFICATION, *PKSAUDIOMODULE_NOTIFICATION;
Дополнительные сведения см. в разделе:
IPortClsNotifications::AllocNotificationBuffer
IPortClsNotifications::FreeNotificationBuffer
IPortClsNotifications::SendNotificationBuffer
Последовательность вызовов
Мини-порт вызовет порт для создания и отправки уведомления. На этой схеме показана общая последовательность вызовов.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по