Программирование - вопрос/ответ



         

Программирование - часть 27


Основной элемент RIFF файла — т.н. чанк (chunk), имеющий структуру

typedef struct
{
DWORD ckID; // Идентификатор чанка, служит для опознания чанка
DWORD ckSize; // Размер чанка (без ckID & cdSize) в байтах
BYTE ckData[ckSize];// Данные
} CK;

Основные типы чанков имеют идентификаторы «RIFF» и «LIST» и могут состоять из вложенных чанков (субчанков).

Мы рассмотрим наиболее простой случай WAVE файла, состоящего из одного лишь RIFF-чанка, содержащего WAVE-форму (WAVE-form). Честно говоря, я ни разу не видел wave файла, содержащего более одного WAVE-чанка, поэтому мы рассмотрим именно файл с одним-единственным WAVE-чанком.

WAVE-форма
WAVE-форма наиболее простой категории — PCM (см. ниже) имеет следующий вид:
<WAVE-форма> = 'WAVE' + <fmt-чанк> + <data-чанк> , где
'WAVE' — просто сигнатура WAVE-формы
<fmt-чанк> — чанк с информацией о звуковом сигнале
<data-чанк> — чанк с собственно сигналом
<fmt-чанк> = 'fmt ' + <ckSize> + <WaveFormat> + <fmt-specific> , где
'fmt ' — сигнатура fmt-чанка
<ckSize> — его размер
<WaveFormat> — структура WaveFormat(mmsystem.h), описанная ниже
<fmt-specific> — структура с дополнительной информацией о формате, имеет переменную длину и зависит от wFormatCategory (см. ниже). В случае с PCM удобно пользоваться структурой WaveFormatEx (mmsystem.h), объединяющей в себе WaveFormat и два поля из fmt-s

pecific. Документация по Win32 SDK утверждает, что WaveFormatEx будет работать для ВСЕХ не-PCM форматов, что идет вразрез с утверждением MM Programmer`s Reference о переменной длине fmt-specific. Так что вопрос с не-PCM форматами мне пока не ясен.

<data-чанк> = 'data' + <ckSize> + <собственно сигнал> , где 'data' — сигнатура data-чанка
<ckSize> — его размер
<собственно сигнал> — последовательность байт, описывающая сигнал (см. Формат данных PCM)
WaveFormat
Структура WaveFormat имеет вид:
typedef struct
{
WORD wFormatTag; // Категория формата
WORD nChannels; // Число каналов



Содержание  Назад  Вперед