Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
На следующем рисунке показан дескриптор формата данных для звукового потока волны.
Как показано на рисунке, объем дополнительных сведений о формате после структуры KSDATAFORMAT зависит от формата данных.
Аудиосистемы используют дескриптор формата несколькими способами:
Дескриптор формата, как показано на предыдущем рисунке, передается в качестве параметра вызова методу NewStream драйвера miniport (например, см. раздел IMiniportWaveCyclic::NewStream).
Параметр ResultantFormat метода IMiniport::D ataRangeIntersection указывает на буфер, в который метод записывает дескриптор формата, как показано на предыдущем рисунке.
Запрос KSPROPERTY_PIN_DATAINTERSECTION get-property извлекает дескриптор формата, как показано на предыдущем рисунке.
Запрос установки свойства KSPROPERTY_PIN_PROPOSEDATAFORMAT принимает дескриптор формата, как показано на приведённой выше схеме.
Для параметра вызова 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 бит, но WAVEFORMATEXTENSIBLE необходим для адекватного описания форматов с точностью выборки более 16 бит. Вот два примера:
Поток с точностью 24 бита может использовать 32-разрядный размер контейнера для эффективной обработки, но его можно преобразовать для использования 24-разрядного контейнера для повышения эффективности хранения без потери данных.
При обработке потока с 24-разрядными образцами данных устройство отрисовки, которое имеет точность только 20 бит, может использовать дезу для улучшения качества выходного сигнала. Однако для дитеринга требуется дополнительное время обработки, и если исходный поток является точным только до 20 бит, дополнительная обработка не требуется.
В обоих из этих примеров сохранение качества сигнала при правильном компромиссе между обработкой и эффективностью хранения возможно только в том случае, если известно как точность выборки, так и размер контейнера.
Если простой формат можно однозначно охарактеризовать структурой WAVEFORMATEX или WAVEFORMATEXTENSIBLE, звуковой драйвер может выбрать любую структуру для описания формата. Однако звуковые драйверы обычно используют WAVEFORMATEX для указания форматов моно и (двухканалового) стерео pcM с 8-разрядными или 16-разрядными образцами, а некоторые старые приложения могут ожидать, что все звуковые драйверы будут использовать WAVEFORMATEX для указания этих форматов.
Если драйвер поддерживает аудиоформат, который можно однозначно указать как структуру WAVEFORMATEX или структуру WAVEFORMATEXTENSIBLE, драйвер должен распознать формат независимо от того, какие из двух структур клиентское приложение или компонент используют для указания структуры. Например, если звуковое устройство поддерживает 44,1 кГц, 16-разрядный, стереоформатный формат PCM, обработчик свойства минипорта KSPROPERTY_PIN_PROPOSEDATAFORMAT и его реализация метода NewStream должны принимать этот формат независимо от того, указан ли формат как структура WAVEFORMATEX или структура WAVEFORMATEXTENSIBLE.
Чтобы упростить обработку данных формата, драйверы обычно используют структуры WAVEFORMATEXTENSIBLE для внутреннего представления форматов. Для этого подхода может потребоваться преобразование входной структуры WAVEFORMATEX в внутреннее представление WAVEFORMATEXTENSIBLE или преобразование внутреннего представления WAVEFORMATEXTENSIBLE в выходную структуру WAVEFORMATEX.
В WAVEFORMATEXTENSIBLE dwBitsPerSample — это размер контейнера, а wValidBitsPerSample — это количество допустимых битов данных на выборку. Контейнеры всегда выравниваются по байтам в памяти, а размер контейнера должен быть указан в виде нескольких восьми битов.