Реализация связи с аудиомодулем

Звуковой модуль — это отдельная часть логики обработки звука, выполняющая относительно атомарную функцию. Звуковой модуль может находиться в аудиодрайвеоре или в звуковом 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

IPortClsNotifications::AllocNotificationBuffer

IPortClsNotifications::FreeNotificationBuffer

IPortClsNotifications::SendNotificationBuffer

Последовательность вызовов

Мини-порт вызовет порт для создания и отправки уведомления. На этой схеме показана общая последовательность вызовов.

Схема, показывающая последовательность вызовов для AudioIPortClsNotifications.