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


Задержка потока во время записи

Пока поток аудиозаписи находится в состоянии Выполнения, роль драйвера порта WaveRT минимальна. Как показано на следующей схеме, в процессе записи звуковое устройство захватывает звуковые данные и записывает их в циклический буфер. Затем звуковой модуль считывает эти данные из буфера. Это действие не требует вмешательства со стороны драйвера порта. Иными словами, звуковые данные передаются непосредственно между звуковым оборудованием и приложением в пользовательском режиме без каких-либо программных компонентов в режиме ядра.

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

Схема, показывающая позиции записи и чтения в циклическом буфере во время записи звука.

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

Задержка с момента, когда звуковое устройство записывает образец звука в ADC до тех пор, пока клиент не считывает его, — это просто разделение между записью и положением чтения. Это разделение представляет собой сумму следующих источников задержки (помеченных на схеме как A и B):

Задержка A. После записи данных из ADC звуковое устройство сохраняет данные в аппаратном fifo, пока оно не сможет записать данные в циклический буфер.

Задержка Б. После того как звуковое устройство записывает данные в циклический буфер, данные находятся в буфере до тех пор, пока клиент не считывает данные.

Клиент не контролирует задержку A, которая полностью зависит от оборудования. Типичный FIFO может хранить примерно 64 образца из ADC. Тем не менее клиент управляет задержкой B. Слишком большая задержка B приводит к ненужным задержкам в системе, но ее слишком малая вероятность считывания данных слишком рано, прежде чем звуковое устройство будет записано в буфер.

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

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

Клиент (обычно звуковой модуль) может получить сводку о задержках, которые звуковое устройство вносит в задержку потоковой передачи, отправив KSPROPERTY_RTAUDIO_HWLATENCY запрос драйверу порта WaveRT.

После того как клиент определяет объем разделения между позициями записи и чтения, клиент отслеживает изменения в позиции записи, чтобы определить, насколько позиция чтения должна отставать. В операционных системах Windows Server 2008 и более поздних версий клиент отправляет запрос KSPROPERTY_AUDIO_POSITION или KSPROPERTY_RTAUDIO_POSITIONREGISTER свойства для определения позиции записи. Последний метод запроса более эффективен, так как он позволяет клиенту считывать позицию записи напрямую без перехода на подпрограмму режима ядра для получения сведений.