Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйвер порта WavePci обрабатывает буферизацию аудиопотока по-разному от драйвера WaveCyclic.
Если драйвер miniport WavePci предоставляет аппаратное сочетание, DirectSound отправляет IRP в драйвер порта WavePci, содержащий весь поток волн DirectSound в одном циклическом буфере. DirectSound выделяет буфер в виде непрерывного блока виртуальной памяти. Чтобы избежать копирования буфера DirectSound, уровень потокового ядра размещает буфер в виртуальной памяти режима ядра и создает MDL (список дескрипторов памяти), который указывает виртуальные и физические адреса страниц памяти в циклическом буфере. Драйвер порта WavePci секционирует циклический буфер в последовательность кадров распределителя (см. раздел " Распределители KS"). Драйвер минипорта задает предпочтительный размер кадра распределителя, когда его метод IMiniportWavePciStream::GetAllocatorFraming вызывается драйвером портов во время инициализации потока. Однако SysAudio, построитель системных графов, может переопределить настройки драйвера мини-порта для удовлетворения требований других компонентов в графе аудиофильтра.
Драйвер порта WavePci предоставляет циклический буфер драйверу мини-порта в виде последовательности сопоставлений. Сопоставление — это либо весь кадр выделения, либо часть кадра. Если определенный кадр выделения находится полностью в пределах страницы, драйвер порта представляет этот кадр драйверу мини-порта в виде одного сопоставления. Если кадр выделения пересекает одну или несколько границ страниц, драйвер порта делит кадр на границе каждой страницы и представляет его как две или более сессии сопоставления. Каждый вызов IPortWavePciStream::GetMapping дает следующее последовательное сопоставление в последовательности.
В отличие от случая WaveCyclic, где драйвер минипорта имеет мало контроля над количеством миллисекунд данных, буферизуемых на оборудовании, драйвер минипорта WavePci обладает значительным контролем над количеством сопоставлений, открытых в любой момент времени. Число открытых сопоставлений увеличивается на один с каждым вызовом GetMapping и уменьшается на один при каждом вызове ReleaseMapping. (Вызов 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 может игнорировать настройки драйвера минипорта при выборе размера выделения кадров.