Глянул - короче, там сплошной головняк.
Формат у .idwav / .idxma примерно такой:
CODE
uint32 magic; // const uint32 SOUND_MAGIC_IDMSA = 0x6D7A7274
int64 timestamp; // 8 bytes (ID_TIME_T)
bool loaded; // 1 byte
int playBegin; // 4 bytes
int playLength; // 4 bytes
idWaveFile::waveFmt_t format; // vary - see "/neo/sound/WaveFile.h"
int num; // 4 bytes
BYTE amplitude[num]; // num bytes
int totalBufferSize; // 4 bytes
int num; // 4 bytes
[num] structs:
int numSamples // 4 bytes
int bufferSize // 4 bytes
BYTE [bufferSize] // bufferSize bytes
См. файлы:
/neo/sound/XAudio2/XA2_SoundSample.cpp
/neo/sound/XAudio2/XA2_SoundSample.h
Например метод:
bool idSoundSample_XAudio2::LoadGeneratedSample( const idStr &filename )
Это загрузка такого файла.
Определённый интерес вызывает там idWaveFile::ReadWaveFormatDirect( format, fileIn ); которая, как я понял, читает format, который, в свою очередь, будет разного размера в зависимости от типа закодированного звука (см. комментарии в XA2_SoundSample.h). И ещё я не понял что такое amplitude и зачем оно нужно. Теоретически, т.к. здесь хранится заголовок waveFmt_t от .WAV, то можно собрать .WAV файл. Практически - как ты видишь звук побит на блоки и с тем же IMA ADPCM всё не так просто.