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


Пересечение данных

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

Например, в Windows Server 2003, Windows XP, Windows 2000 и Windows Me/98 системный драйвер SysAudio использует метод пересечения данных для создания графа аудиофильтра путем подключения пар фильтров, поддерживающих совместимые форматы звуковых данных.

Фабрика пинов задает набор форматов, которые каждый пин поддерживает в виде массива диапазонов данных, где каждый диапазон данных является структурой типа KSDATARANGE_AUDIO. Диапазон данных задает общий тип формата, который может быть KSDATAFORMAT_WAVEFORMATEX или KSDATAFORMAT_DSOUND. Кроме того, диапазон данных задает диапазон значений для каждого из следующих параметров:

  • Биты на выборку

  • Частота выборки

  • Количество каналов

Структура KSDATARANGE_AUDIO задает минимальные и максимальные значения для диапазонов битов на выборку и частоту выборки, но только максимальное для диапазона каналов. Минимальное число каналов неявно одно.

Задача согласования общего формата данных для двух контактов состоит в нахождении двух диапазонов данных — одного от каждого контакта, которые пересекаются друг с другом. Пара диапазонов данных пересекается, если:

  • Они поддерживают тот же общий формат волны (KSDATAFORMAT_WAVEFORMATEX или KSDATAFORMAT_DSOUND).

  • Диапазоны разрядов на выборку перекрываются.

  • Их диапазоны частот выборки перекрываются.

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

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

  • Число бит на выборку выбирается из области, в которой перекрываются два диапазона бит на выборку.

  • Частота выборки выбирается из области, в которой перекрываются два диапазона частот выборки.

  • Количество каналов выбирается из региона, в котором перекрываются два диапазона каналов.

Например, при согласовании общего формата приемного пина драйвера аудио и исходного пина другого фильтра (как правило, системного драйвера KMixer), SysAudio сначала получает массив диапазонов данных исходного пина. Затем SysAudio отправляет запрос KSPROPERTY_PIN_DATAINTERSECTION на пин приемника и включает массив диапазонов данных источника с этим запросом. Уровень потоковой передачи ядра принимает запрос и вызывает обработчик пересечения данных драйвера порта итеративно один раз для каждого последовательного элемента в массиве диапазона данных исходного пина, начиная с первого элемента, пока обработчик не найдет пересечение данных.

При каждом вызове, который SysAudio делает обработчику пересечения данных драйвера порта, обработчик сначала получает массив диапазонов данных приемного контакта от мини-драйвера. Затем он перебирает массив, начиная с первого элемента, пока не удастся найти пересечение между диапазонами данных сигнальной ножки ("sink-pin") и текущей сигнальной ножки источника ("source-pin"). Обработчик выбирает формат, который является общим для всех пересекающихся областей, и передает этот формат вызывающей стороне.

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

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

  • В внешнем цикле слой потоковой передачи ядра выполняет итерацию по последовательным элементам в массиве диапазона данных исходного пина, начиная с первого элемента массива.

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

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