2017-01-26 14 views
1

Я изучаю API Windows Core Audio. Используя этот Rendering a Stream пример, я нахожу, что IAudioClient::GetMixFormat возвращает неоднозначное WAVEFORMATEXTENSIBLE который выглядит следующим образом:Интерпретация WAVEFORMATEXTENSIBLE от IAudioClient :: GetMixFormat

Format 
    wFormatTag   = WAVE_FORMAT_EXTENSIBLE (65534) 
    nChannels   = 2 
    nSamplesPerSec  = 48000 
    nAvgBytesPerSec  = 384000 
    nBlockAlign   = 8 
    wBitsPerSample  = 32 
    cbSize    = 22 
Samples // this is a union 
    wValidBitsPerSample = 32 
    wSamplesPerBlock = 32 
    wReserved   = 32 

С Format.cbSize 22, это вся структура; нет SubFormat GUID, чтобы предоставить дополнительную информацию о образцах. Это кажется странным, потому что тег формата - WAVE_FORMAT_EXTENSIBLE, который, как я думал, означает, что для определения фактического формата вам нужно использовать GUID Subformat.

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

[Код , по-видимому, предназначен для API Apple. Есть другой тег для Core Audio Windows]

ответ

4

22 является размером дополнительных данных, которые следуют данные WAVEFORMATEX:

cbSize

Размер, в байтах дополнительной информации о формате, приложенной до конца структуры WAVEFORMATEX. Эта информация может использоваться форматами, отличными от PCM, для хранения дополнительных атрибутов для wFormatTag. Если никакая дополнительная информация не требуется wFormatTag, этот элемент должен быть установлен в 0. Для форматов WAVE_FORMAT_PCM (и только WAVE_FORMAT_PCM) этот элемент игнорируется. Если эта структура включена в структуру WAVEFORMATEXTENSIBLE, это значение должно быть не менее 22.

Если посмотреть на определение WAVEFORMATEXTENSIBLE, он начинается с WAVEFORMATEX и затем содержит дополнительные данные после него:

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

То есть минимум 22 байт после данных WAVEFORMATEX.

Поле SubFormat содержит требуемое значение формата.

+0

D'oh! Спасибо за разъяснения. –

 Смежные вопросы

  • Нет связанных вопросов^_^