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


Задержка WavePci

Драйвер порта WavePci обрабатывает буферизацию аудиопотока по-разному от драйвера WaveCyclic.

Если драйвер miniport WavePci предоставляет аппаратное сочетание, DirectSound отправляет IRP в драйвер порта WavePci, содержащий весь поток волн DirectSound в одном циклическом буфере. DirectSound выделяет буфер в виде непрерывного блока виртуальной памяти. Чтобы избежать копирования буфера DirectSound, уровень потоковой передачи ядра сопоставляет буфер в виртуальную память в режиме ядра и создает MDL (список дескрипторов памяти), указывающий как виртуальные, так и физические адреса страниц памяти в циклическом буфере. Драйвер порта WavePci секционирует циклический буфер в последовательность кадров распределителя (см . раздел "Распределители KS"). Драйвер минипорта задает предпочтительный размер кадра распределителя, когда его метод IMiniportWavePciStream::GetAllocatorFraming вызывается драйвером портов во время инициализации потока. Однако SysAudio, построитель системных графов, может переопределить настройки драйвера мини-порта для удовлетворения требований других компонентов в графе аудиофильтра.

Драйвер порта WavePci предоставляет циклический буфер драйверу мини-порта в виде последовательности сопоставлений. Сопоставление — это либо весь кадр выделения, либо часть кадра. Если определенный кадр выделения находится полностью в пределах страницы, драйвер порта представляет этот кадр драйверу мини-порта в виде одного сопоставления. Если рамка выделения перестраивает одну или несколько границ страниц, драйвер портов разбивает кадр на каждой границе страницы и представляет его как два или более сопоставлений. Каждый вызов IPortWavePciStream::GetMapping дает следующее последовательное сопоставление в последовательности.

В отличие от случая WaveCyclic, где драйвер минипорта имеет мало контроля над количеством миллисекундах данных, буферизируемых на оборудовании, драйвер miniport WavePci имеет значительный контроль над количеством сопоставлений, открытых в любое время. Число открытых сопоставлений увеличивается на один с каждым вызовом GetMapping и уменьшается на один при каждом вызове ReleaseMapping. (A Вызов GetMapping может завершиться ошибкой, конечно, поэтому драйвер имеет меньше общего контроля над количеством сопоставлений.) Управляя числом открытых сопоставлений и отслеживая совокупный размер сопоставлений, минипорт-драйвер может определить (в пределах допустимости, зависящей от размера сопоставления) количество миллисекунд буферизации, доступных оборудованию. Драйвер минипорта WavePci должен запрашивать достаточно сопоставлений страниц, чтобы снизить вероятность голода до приемлемых уровней.

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

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

Например, для устройства с четырьмя каналами и размером 16-разрядного образца требуется размер аудиокадров в восемь байтов. Целое число аудиокадров точно помещается на страницу (или любой другой размер кадра выделения, который составляет несколько восьми байтов). Однако в случае потока 5,1 канала с 16-разрядными образцами размер аудиокадры составляет 12 байтов, а поток, превышающий размер одной страницы, обязательно содержит звуковые кадры, границы страницы. (Цифры в Фильтры волн иллюстрируют эту проблему.) Оборудование, которое не может обрабатывать произвольные выравнивания байтов и произвольные сопоставления длины байтов, должно зависеть от драйвера для выполнения промежуточной копии, которая снижает производительность.

Пример драйвера адаптера Ac97 в комплекте драйверов Microsoft Windows (WDK) реализует метод GetAllocatorFraming. Минипорт-драйвер использует этот метод для передачи предпочитаемого размера выделения кадров. В Windows 2000 и Windows Me драйвер портов вызывает этот метод только в том случае, если системный драйвер Splitter (Splitter.sys) создается над выходным закреплением. В Windows XP и более поздних версиях драйвер портов также вызывает этот метод для входных потоков. Помните, что SysAudio может игнорировать настройки драйвера минипорта при выборе размера выделения кадров.