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


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

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

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

Задержка потока во время воспроизведения имеет два источника main, обозначенных на следующей схеме как A и B.

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

На предыдущей схеме позиция записи — это расположение после последней выборки, записанной клиентом в буфер. Позиция воспроизведения — это пример, который звуковое устройство в настоящее время воспроизводит через динамик.

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

Задержка A. После того как звуковое устройство считывает данные из буфера, данные находятся в аппаратном буфере "первый вход, первый выход" (FIFO) до тех пор, пока звуковое устройство не будет часы передачи данных через цифровой аналоговый преобразователь (DAC).

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

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

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

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

Клиент может получить сводку о задержках, влияющих на задержку потока, отправив KSPROPERTY_RTAUDIO_HWLATENCY запрос в драйвер порта WaveRT.

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

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