Разработка драйвера miniport WaveRT

В этом разделе представлены вопросы, связанные с программным обеспечением и оборудованием, которые необходимо учитывать при разработке собственного драйвера для мини-порта WaveRT.

Корпорация Майкрософт разработала набор рекомендаций по проектированию оборудования для универсальной аудиоархитектуры (UAA), а рекомендации включают функции, которые мы рекомендуем для звукового устройства WaveRT. Руководящие принципы UAA тесно основаны на спецификации high definition (HD) Audio, разработанной Intel.

Windows Vista и более поздние операционные системы Windows предоставляют драйвер hd audio для звуковых устройств, совместимых с UAA. Таким образом, если звуковое устройство совместимо с UAA, вам не нужно разрабатывать собственный драйвер для мини-порта WaveRT. Но для звуковых устройств, которые имеют некоторые собственные аппаратные функции, не относящиеся к UAA, необходимо разработать собственный драйвер miniport WaveRT для поддержки собственных функций.

Чтобы помочь вам в разработке собственного драйвера для мини-порта WaveRT, рекомендуется сначала ознакомиться с примером драйвера адаптера, а затем изучить функции UAA, поддерживающие WaveRT.

Пример драйвера адаптера

Сведения о примере драйвера см. в разделе Примеры аудиодрайверов.

Функции, удобные для WaveRT

После просмотра примера драйвера адаптера и начала разработки драйвера miniport WaveRT необходимо убедиться, что он поддерживает следующие программные и аппаратные функции. В результате создаваемый вами драйвер мини-порта становится совместимым с системным драйвером порта WaveRT и режимом работы звукового модуля Windows Vista.

  • Низкая задержка оборудования. Драйвер miniport WaveRT должен обеспечить полнофункционарную реализацию метода IMiniportWaveRTStream::GetHWLatency . Этот метод необходим для поддержки свойства KSPROPERTY_RTAUDIO_HWLATENCY .

  • Прерывания FIFO. Драйвер miniport WaveRT должен автоматически создавать прерывания при превышении и недостаточном выполнении FIFO. Эта функция позволяет обнаруживать сбои в аудиопотоке при выполнении тестов на звуковом устройстве и драйвере программного обеспечения. Без аппаратной поддержки (другими словами, прерываний FIFO) не существует удобного и надежного метода получения сведений о сбое.

  • Scatter-Gather DMA и буферного цикла. Если драйвер мини-порта поддерживает контроллер DMA с возможностями точечного сбора, он позволяет перемещать данные в циклический буфер и из него без вмешательства драйвера мини-порта.

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

    Обратите внимание, что драйвер порта WaveRT поддерживает существующие конструкции оборудования, которые не могут выполнять точечные передачи и собирать данные или автоматические циклы буфера.

    Если звуковое устройство не имеет возможности точечного сбора, драйвер miniport WaveRT должен сначала выделить циклические буферы, состоящие из страниц, физически смежных в памяти. Затем драйвер мини-порта использует вспомогательные функции в драйвере порта WaveRT для выполнения передачи данных и автоматического цикла буфера. Недостаток заключается в том, что по мере того как непагментарный пул памяти системы становится все более фрагментирован, запрос на выделение большого блока непрерывной физической памяти, скорее всего, завершится сбоем. Фрагментация памяти не влияет на устройство с точечным сбором.

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

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

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

    В идеале регистры позиций должны указывать положение в буфере образцов, которые в настоящее время перемещаются через цифровые аналоговые и аналого-цифровые преобразователи (DAC и АЦП) звукового устройства.

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

    После получения считывания из этого типа регистра позиций клиент может оценить текущую позицию выборок, которые перемещаются через ДАК или АЦП, путем добавления или вычитания задержки через кодек. Клиент получает задержку кодека из запроса свойства KSPROPERTY_RTAUDIO_HWLATENCY . По этой причине драйвер miniport WaveRT должен точно сообщать о задержке кодека, когда драйвер порта вызывает метод IMiniportWaveRTStream::GetHardwareLatency в ответ на этот тип запроса свойства.

    Обратите внимание, что драйвер порта WaveRT поддерживает существующие конструкции оборудования, в которым отсутствуют регистры позиций. Для устройства с этим ограничением драйвер miniport WaveRT должен завершать вызовы метода IMiniportWaveRTStream::GetPositionRegister , возвращая код ошибки STATUS_NOT_SUPPORTED , который приводит к сбою драйвера порта KSPROPERTY_RTAUDIO_POSITIONREGISTER запросам свойств. В этом случае клиенты должны получить текущую позицию с помощью свойства KSPROPERTY_AUDIO_POSITION , которое влечет за собой накладные расходы при переходе между пользовательским режимом и режимом ядра для каждого считывания позиции.

  • Регистрация часов. Регистр часов — это необязательная, но полезная аппаратная функция для аудиоустройства, совместимого с WaveRT. Звуковые приложения могут использовать регистры часов для синхронизации аудиопотоков на двух или более независимых звуковых устройствах с отдельными и несинхронизированными аппаратными часами. Без регистров часов приложение не может обнаружить и компенсировать смещение между аппаратными часами.

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

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

  • Объекты обработки звука. Хорошо спроектированный драйвер miniport WaveRT никогда не должен касаться звуковых данных в циклическом буфере звукового устройства. Оборудование должно быть разработано таким образом, чтобы звуковые данные передаются непосредственно между клиентом и звуковым оборудованием без вмешательства программного обеспечения аудиодрайвера.

Api-интерфейсы доступны для использования только с аудиопотоками общего режима. Для потоков в монопольном режиме приложения обмениваются данными непосредственно с аппаратными устройствами WaveRT через циклические буферы, и никакие другие компоненты не могут касаться данных в буферах.

Дополнительные сведения см. в разделе Объекты обработки звука Windows.