Расширяемые дескрипторы Wave-Format
На следующем рисунке показан дескриптор формата данных для звукового потока волн.
Как показано на рисунке, объем дополнительных сведений о формате, следующих за структурой KSDATAFORMAT , зависит от формата данных.
Аудиосистемы используют этот тип дескриптора формата несколькими способами:
Дескриптор формата, как показано на предыдущем рисунке, передается в качестве параметра вызова в метод NewStream драйвера мини-порта (например, см. раздел IMiniportWaveCyclic::NewStream).
Параметр ResultantFormat метода IMiniport::D ataRangeIntersection указывает на буфер, в который метод записывает дескриптор формата, как показано на предыдущем рисунке.
Запрос KSPROPERTY_PIN_DATAINTERSECTION get-property получает дескриптор формата, как показано на предыдущем рисунке.
Запрос KSPROPERTY_PIN_PROPOSEDATAFORMAT set-property принимает дескриптор формата, как показано на предыдущем рисунке.
Аналогичный формат используется для параметра вызова Connect функции KsCreatePin. Этот параметр указывает на структуру KSPIN_CONNECT в начале буфера, который также содержит дескриптор формата. Дескриптор формата, который сразу же следует за структурой KSPIN_CONNECT, начинается со структуры KSDATAFORMAT, как показано на предыдущем рисунке.
Сведения о формате, следующие за структурой KSDATAFORMAT, должны быть структурой WAVEFORMATEXTENSIBLE . WAVEFORMATEXTENSIBLE — это расширенная версия WAVEFORMATEX, которая может описывать более широкий диапазон форматов, чем WAVEFORMATEX.
ФУНКЦИЯ WAVEFORMAT устарела и не поддерживается аудиосистемой WDM в любой версии Microsoft Windows. Структура PCMWAVEFORMAT — это расширенная версия WAVEFORMAT, которая также устарела.
Четыре структуры волнового формата — WAVEFORMAT, PCMWAVEFORMAT, WAVEFORMATEX и WAVEFORMATEXTENSIBLE — начинаются с того же пяти элементов, начиная с wFormatTag. На предыдущем рисунке показаны эти четыре структуры, наложенные друг на друга, чтобы выделить идентичные части структур.
ФУНКЦИЯ WAVEFORMATEXTENSIBLE расширяет возможности WAVEFORMATEX, добавляя три элемента, начиная с Samples.wValidBitsPerSample. (Примеры — это объединение, другой член которого wValidSamplesPerBlock используется вместо wValidBitsPerSample для некоторых сжатых форматов.) Элемент wFormatTag , который следует за концом структуры KSDATAFORMAT в буфере, указывает, какой тип сведений о формате следует за KSDATAFORMAT.
В отличие от WAVEFORMATEX, WAVEFORMATEXTENSIBLE может выполнять следующие действия:
Укажите количество битов на выборку отдельно от размера контейнера образца. Например, 20-разрядный образец может храниться в трехбайтовом контейнере с левой стороны. Функция WAVEFORMATEX, которая не отличает количество битов данных на выборку от размера контейнера выборки, не может однозначно описать такой формат.
Назначение определенных расположений динамиков аудиоканалам в многоканальных потоках. WAVEFORMATEX не имеет этой возможности и может адекватно поддерживать только моно- и (двухканалные) стереопотоки.
Устаревшее использование WAVEFORMATEX
Любой формат, описанный в WAVEFORMATEX, также может быть описан с помощью ФУНКЦИИ WAVEFORMATEXTENSIBLE. Сведения о преобразовании структуры WAVEFORMATEX в формат WAVEFORMATEXTENSIBLE см. в разделе Преобразование между тегами форматирования и идентификаторами GUID подчиненного формата.
WAVEFORMATEX достаточно для описания форматов с размерами выборки 8 или 16 бит, но для адекватного описания форматов с точностью выборки более 16 бит требуется WAVEFORMATEXTENSIBLE. Вот два примера.
Поток с точностью выборки 24 бита может использовать размер 32-разрядного контейнера для эффективной обработки, но может быть преобразован в 24-разрядный контейнер для повышения эффективности хранения без потери данных.
При обработке потока с 24-разрядными образцами данных устройство отрисовки, обеспечивающее только 20 битов точности, может использовать смещение для повышения точности выходного сигнала. Однако для этого требуется дополнительное время обработки, и если исходный поток с точностью составляет всего 20 бит, дополнительная обработка не требуется.
В обоих примерах сохранение качества сигнала при правильном компромиссе между эффективностью обработки и хранения возможно только в том случае, если известны как точность выборки, так и размер контейнера.
Если простой формат можно однозначно описать структурой WAVEFORMATEX или WAVEFORMATEXTENSIBLE, драйвер звука может выбрать любой из этих структур для описания формата. Однако аудиодрайверы обычно используют WAVEFORMATEX для указания моно- и (двухканалового) стереоформатов PCM с 8-разрядными или 16-разрядными примерами, а некоторые старые приложения могут ожидать, что все аудиодрайверы будут использовать WAVEFORMATEX для указания этих форматов.
Если драйвер поддерживает аудиоформат, который можно однозначно указать как структуру WAVEFORMATEX или WAVEFORMATEXTENSIBLE, драйвер должен распознавать формат независимо от того, какую из двух структур использует клиентское приложение или компонент для указания структуры. Например, если звуковое устройство поддерживает 44,1 кГц, 16-разрядный стереоформат PCM, обработчик свойств KSPROPERTY_PIN_PROPOSEDATAFORMAT драйвера miniport и его реализация метода NewStream должны принимать этот формат независимо от того, указан ли формат как структура WAVEFORMATEX или WAVEFORMATEXTENSIBLE.
Чтобы упростить обработку данных формата, драйверы обычно используют структуры WAVEFORMATEXTENSIBLE для внутреннего представления форматов. Этот подход может потребовать преобразования входной структуры WAVEFORMATEX во внутреннее представление WAVEFORMATEXTENSIBLE или преобразования внутреннего представления WAVEFORMATEXTENSIBLE в выходную структуру WAVEFORMATEX.
В WAVEFORMATEXTENSIBLE dwBitsPerSample — это размер контейнера, а wValidBitsPerSample — количество допустимых бит данных на выборку. Контейнеры всегда выравниваются по байтам в памяти, и размер контейнера должен быть кратным восьми битам.