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


Структура WAVEFORMATEXTENSIBLE (ksmedia.h)

Структура WAVEFORMATEXTENSIBLE определяет формат аудиоволнового потока.

Синтаксис

typedef struct {
  WAVEFORMATEX Format;
  union {
    WORD wValidBitsPerSample;
    WORD wSamplesPerBlock;
    WORD wReserved;
  } Samples;
  DWORD        dwChannelMask;
  GUID         SubFormat;
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;

Члены

Format

Задает формат волновых данных потока. Этот элемент является структурой типа WAVEFORMATEX. Элементу wFormat waveFORMATEX должно быть присвоено значение WAVE_FORMAT_EXTENSIBLE. Член wBitsPerSample waveFORMATEX определяется однозначно как размер контейнера для каждой выборки. Примеры контейнеров всегда выровнены по байтам, а wBitsPerSample должно быть кратно восьми.

Samples

Samples.wValidBitsPerSample

Указывает точность выборки в битах. Значение этого элемента должно быть меньше или равно размеру контейнера, указанному в разделе Формат. Член wBitsPerSample . Дополнительные сведения см. в разделе "Примечания".

Samples.wSamplesPerBlock

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

Samples.wReserved

Зарезервировано для внутреннего использования операционной системой. Инициализируйте до нуля.

dwChannelMask

Указывает назначение каналов в многоканальном потоке позициям говорящего. Кодировка совпадает с кодировкой, используемой для элемента ActiveSpeakerPositionsструктуры KSAUDIO_CHANNEL_CONFIG . Дополнительные сведения см. в разделе Примечания.

SubFormat

Задает подчиненный формат. Дополнительные сведения см. в разделе Примечания.

Комментарии

WAVEFORMATEXTENSIBLE — это расширенная форма структуры WAVEFORMATEX . WAVEFORMATEX может однозначно описать только подмножество форматов, которые могут быть описаны в WAVEFORMATEXTENSIBLE. WAVEFORMATEXTENSIBLE не подпадает под ограничения WAVEFORMATEX, который не может однозначно указать форматы с более чем двумя каналами или для которых количество допустимых битов на выборку не равно размеру контейнера выборки. Дополнительные сведения см. в разделе Форматы аудиоданных и диапазоны данных.

Часто член wValidBitsPerSample , указывающий точность выборки, содержит то же значение, что и Format. Член wBitsPerSample , указывающий размер контейнера образца. Однако эти значения могут отличаться. Например, если волновые данные получены от 20-разрядного A/D-преобразователя, то wValidBitsPerSample должно иметь значение 20, но Формат. WBitsPerSample может иметь значение 24 или 32. Если значение wValidBitsPerSample меньше , чем Format. wBitsPerSample, допустимые биты (фактические данные PCM) выравниваются по левому краю в контейнере. Неиспользуемые биты в наименее значительной части контейнера должны быть равны нулю.

Примеры контейнеров начинаются и заканчиваются границами байтов и значением Format. wBitsPerSample всегда должен быть кратным восьми. Кроме того, значение wValidBitsPerSample никогда не должно превышать значение Format. wBitsPerSample. Драйверы должны отклонять форматы волн, нарушающие эти правила.

Член dwChannelMask структуры WAVEFORMATEXTENSIBLE содержит маску, указывающую, какие каналы присутствуют в многоканальном потоке. Наименее значимый бит представляет передний левый динамик, следующий бит соответствует переднему правому динамику и т. д. Следующие биты флагов определены в файле заголовка Ksmedia.h.

Положение говорящего Бит флага
SPEAKER_FRONT_LEFT 0x1
SPEAKER_FRONT_RIGHT 0x2
SPEAKER_FRONT_CENTER 0x4
SPEAKER_LOW_FREQUENCY 0x8
SPEAKER_BACK_LEFT 0x10
SPEAKER_BACK_RIGHT 0x20
SPEAKER_FRONT_LEFT_OF_CENTER 0x40
SPEAKER_FRONT_RIGHT_OF_CENTER 0x80
SPEAKER_BACK_CENTER 0x100
SPEAKER_SIDE_LEFT 0x200
SPEAKER_SIDE_RIGHT 0x400
SPEAKER_TOP_CENTER 0x800
SPEAKER_TOP_FRONT_LEFT 0x1000
SPEAKER_TOP_FRONT_CENTER 0x2000
SPEAKER_TOP_FRONT_RIGHT 0x4000
SPEAKER_TOP_BACK_LEFT 0x8000
SPEAKER_TOP_BACK_CENTER 0x10000
SPEAKER_TOP_BACK_RIGHT 0x20000

Каналы, указанные в dwChannelMask , должны присутствовать в порядке, показанном в предыдущей таблице, начиная с верхней части.

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

Второй пример: если параметру nChannels (в элементе Формат ; см. раздел WAVEFORMATEX) задано значение 4, а для dwChannelMask задано значение 0x00000033, звуковые каналы предназначены для воспроизведения на передних левых, передних и правых динамиках. Данные канала должны чередуться в этом порядке в каждом блоке.

Расположения каналов за пределами предопределенных считаются зарезервированными.

Кроме того, маску канала можно указать как одну из следующих констант, которые определены в Ksmedia.h и являются побитовыми сочетаниями ORed предыдущих флагов, представляющих стандартные конфигурации динамиков:

KSAUDIO_SPEAKER_MONO

KSAUDIO_SPEAKER_STEREO

KSAUDIO_SPEAKER_QUAD

KSAUDIO_SPEAKER_SURROUND

KSAUDIO_SPEAKER_5POINT1

KSAUDIO_SPEAKER_7POINT1

KSAUDIO_SPEAKER_DIRECTOUT

Для аппаратного устройства можно задать одну из этих конфигураций динамиков с помощью запроса KSPROPERTY_AUDIO_CHANNEL_CONFIG set-property. Дополнительные сведения о настройке конфигураций динамиков см. в разделе KSAUDIO_CHANNEL_CONFIG.

Как правило, число в nChannels равно количеству битов, заданному в dwChannelMask, но это не обязательно. Если значение nChannels меньше числа битов, заданное в dwChannelMask, дополнительные (наиболее значительные) биты в dwChannelMask игнорируются. Если nChannels превышает число битов, заданное в dwChannelMask, каналы, не имеющие соответствующих бит маски, не назначаются ни одному физическому положению динамика. В любой конфигурации динамиков, отличной от KSAUDIO_SPEAKER_DIRECTOUT, приемник звука, такой как KMixer (см. раздел Драйвер системы KMixer), просто игнорирует эти избыточные каналы и смешивает только каналы с соответствующими битами маски.

KSAUDIO_SPEAKER_DIRECTOUT представляет конфигурацию без динамиков и определяется в Ksmedia.h как ноль. В этой конфигурации звуковое устройство отрисовывает первый канал к первому порту на устройстве, второй — ко второму порту на устройстве и т. д. Это позволяет приложению для разработки звука выводить многоканальные данные напрямую и без изменений на устройство, например цифровой микшер или цифровое звуковое запоминающее устройство (жесткий диск или ADAT). Например, каналы от 0 до 30 могут содержать соответственно барабаны, гитару, бас, голос и т. д. Для такого рода необработанных звуковых данных позиции говорящего бессмысленны, а назначение позиций динамиков входным или выходным потокам может привести к неправильному вмешательству компонента, например KMixer, выполняя нежелательное преобразование формата. Если устройство не может обработать необработанные аудиопотоки, оно должно отклонить запрос на изменение конфигурации динамиков на KSAUDIO_SPEAKER_DIRECTOUT. Дополнительные сведения см. в разделе конфигурация DSSPEAKER_DIRECTOUT speaker.

Дополнительные сведения о конфигурациях с несколькими каналами см. в техническом документе с многоканальными звуковыми данными и файлами WAVE на веб-сайте аудиотехнальных технологий .

Элемент SubFormat содержит GUID, указывающий общий формат данных для волнового потока. Например, этот GUID может указывать, что поток содержит целочисленные данные PCM. Другие члены предоставляют дополнительные сведения, такие как размер выборки и количество каналов. Значение GUID SubFormat аналогично значению 16-разрядного тега формата в элементе wFormatTag структуры WAVEFORMATEX.

До появления WAVEFORMATEXTENSIBLE во втором выпуске Windows 98, WAVEFORMATEX была предпочтительной структурой для указания волновых форматов. В то время поставщикам необходимо было зарегистрировать каждый новый формат волны в корпорации Майкрософт, чтобы можно было назначить официальный тег формата. Список зарегистрированных тегов формата отображается в общедоступном файле заголовка Mmreg.h.

При использовании WAVEFORMATEXTENSIBLE регистрировать форматы больше не требуется. Поставщики могут независимо назначать идентификаторы GUID SubFormat своим новым форматам по мере необходимости. Тем не менее, Корпорация Майкрософт перечисляет некоторые из наиболее популярных идентификаторов GUID SubFormat в общедоступном файле заголовка Ksmedia.h. Перед определением нового GUID SubFormat поставщики должны проверка список констант KSDATAFORMAT_SUBTYPE_Xxx в Ksmedia.h, чтобы узнать, определен ли соответствующий GUID для определенного формата.

Для обеспечения обратной совместимости любой волновой формат, который может быть задан автономной структурой WAVEFORMATEX, также можно определить с помощью структуры WAVEFORMATEXTENSIBLE. Таким образом, каждый тег формата в Mmreg.h имеет соответствующий GUID SubFormat . В следующей таблице показаны некоторые типичные теги формата и соответствующие им guid SubFormat .

Тег format SubFormat GUID
WAVE_FORMAT_PCM KSDATAFORMAT_SUBTYPE_PCM
WAVE_FORMAT_IEEE_FLOAT KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
WAVE_FORMAT_DRM KSDATAFORMAT_SUBTYPE_DRM
WAVE_FORMAT_ALAW KSDATAFORMAT_SUBTYPE_ALAW
WAVE_FORMAT_MULAW KSDATAFORMAT_SUBTYPE_MULAW
WAVE_FORMAT_ADPCM KSDATAFORMAT_SUBTYPE_ADPCM

Дополнительные сведения см. в разделах Converting Between Format Tags and Subformat GUID.

Так как WAVEFORMATEXTENSIBLE является расширенной версией WAVEFORMATEX, она может описывать дополнительные форматы, которые не могут быть описаны только в WAVEFORMATEX. Поставщики могут самостоятельно определять идентификаторы GUID subFormat , чтобы определить собственные форматы, для которых не существует тегов волновых форматов.

Требования

Требование Значение
Заголовок ksmedia.h (включая Mmreg.h, Ksmedia.h, Mmreg.h)

См. также раздел

KSAUDIO_CHANNEL_CONFIG

WAVEFORMATEX