Этот формат наиболее распространён в системе windows. В большинстве это связано с тем, что его структура очень удобна для использования в API функциях. А самое главное это то, что данные в файле могут находиться как в сжатом, так и несжатом виде. Это даёт возможность его использования на все случаи жизни.
Помимо звуковых данных, ты можешь засунуть сюда всё, что угодно. Примером может быть любая информация о создателях файла или графические картинки. Короче гворя, WAV формат универсален.
Единственный "недостаток", файл не может быть более 4Гб. Слово "недостаток" я взял в кавычки, потому что этого размера тебе будет достаточно для записи трёх часов музыки в отличном качестве и без сжатия. Я не думаю, что у тебя будут такие громадные файлы.
Данный формат относится к разряду RIFF (Resource Interchange File Formats). Чтобы ты понимал, к этому разряду относится также и знаменитый видеоформат AVI.
Теперь переходим к структуре. В WAV файле может храниться один или несколько блоков данных. Каждый блок может содержать ещё несколько блоков. Так получается дерево звуковых данных. Каждый блок имеет свой заголовок. Заголовок состоит из:
Идентификатор фрагмента (4 байта).
Размер звуковых данных (4 байта).
Идентификатор может содержать значения: RIFF, DATA, .TXT и т.д. В статьях о программировании звука нас будут интересовать только блоки RIFF и data. Теперь посмотрим на структуру WAV файла, с которым мы будем работать при программировании звука:
4 байта - идентификатор файла. В нашем случае всегда RIFF.
4 байта - размер данных.
8 байт - снова идентификатор. Первые 7 байт равны WAVE fmt. Последний в основном пробел.
wFormatTag - Формат звуковых данных. Мы будем использовать в основном WAVE_FORMAT_PCM.
nChannels - Количество каналов (1- моно, 2 - стерео).
nSamplesPerSec - Частота дискретизации (возможны значения 8000, 11025. 22050 и 44100).
nAvgBytesPerSec - Количество байт в секунду. Для WAVE_FORMAT_PCM это является результатом nSamplesPerSec* nBlockAlign.
nBlockAlign - Выравнивание блока. Для WAVE_FORMAT_PCM равен wBitsPerSample/8* nChannels
wBitsPerSample -Количество бит в одной выборке. Для WAVE_FORMAT_PCM может быть 8 или 16.
cbSize - Размер дополнительной информации, которая располагается после структуры. Если ничего нет, то должен быть 0.
Если ты читал первую статью про программирование звука в моём журнале, то наверно уже заметил, что для воспроизведения звуковых данных нам нужна точно такая же структура. Это очень упрощает нашу прогу. Достаточно прочитать WAVEFORMATEX и звуковые данные и отправить всё это драйверу. Никаких преобразований делать не надо.
Всё. Осталось только воспользоваться полученными знаниями. Удачного тебе саунда.