WAV音頻格式由Electronic Arts(電子協會)創建.它基於.IFF(Interchange File Format)對等交換文件格式.允許不同音檔格式通過鑲套技術進行編碼.
上兩編文章『DirectSound』與『DirectSound3D』均從WAV音檔中讀音頻數據.WAV音檔好再於結構簡單無需解壓. 我建議先把所有WAV音檔數據格式統一. 改為『單聲道Mono』(因為你只有一個咪頭)、採樣頻率11025Hz、採樣精度8bit.後再由遊戲引擎載入.
.WAV數據由以下三部份組成:
數據 | 簡序 |
RIFF | .IFF標記 |
FORMAT | 音頻格式 |
DATA | 音頻數據 |
RIFF數據 | 所占空間(BYTE) | 簡序 |
chunkID | 4 | 塊ID,必須為’RIFF’ |
chunkSize | 4 | 塊長度(不包含chunkID[4]和chunkSize所占空間) |
FORMAT數據 | 所占空間(BYTE) | 簡序 |
waveID | 4 | WAVE ID,必須為’WAVE’ |
chunkID | 4 | 塊ID,必須為’fmt ‘ |
chunkSize | 4 | 塊長度(不包含chunkID[4]和chunkSize所占空間) |
wFormatTag | 2 | 壓縮(格式)標誌默認WAVE_FORMAT_PCM脈衝編碼格式 |
wChannels | 2 | 聲道:『單聲道Mono』或『雙聲道Stereo』 |
dwSamplesPerSec | 4 | 採樣頻率(11025Hz,22050Hz,44100Hz) |
dwAvgBytesPerSec | 4 | 每秒播放字節數(SamplesPerSec * BlockAlign) |
wBlockAlign | 2 | 字節對齊,單聲道8bit占1byte.雙聲道16bit占4yte. |
wBitsPerSample | 2 | 每個採樣點位精度.有8bit、16bit、24bit、32bit |
information | 2 | 附加信息(未必有此數據) |
數據塊 | 所占空間(BYTE) | 簡序 |
chunkID | 4 | 塊ID,必須為’data’ |
chunkSize | 4 | 音頻數據長度 |
Data | chunkSize | 音頻數據 |
讀取WAV數據.wav指向文檔數據.size為文檔長度
bool Load_WAV(SOUND3D_PTR sound3D, PBYTE wav, int size){
1.數格塊
RIFF_PTR riff;
WAVE_FORMAT_PTR format;
WAVE_DATA_PTR data;
2.讀取RIFF數據
riff = (RIFF_PTR)wav;
3.判斷是否RIFF
if (riff->id != WAVE_RIFF_ID)
return false; // 返回出錯!
4.讀取WAVE_FORMAT_CHUNK
format = (WAVE_FORMAT_PTR)((PBYTE)wav + sizeof(RIFF));
if (format->waveID != WAVE_ID ||
format->chunkID != WAVE_FMT_ID ||
format->wFormatTag != WAVE_FORMAT_PCM)
return(false); // 返回出錯!
5.讀取數據塊
data = (WAVE_DATA_PTR)((PBYTE)wav + sizeof(RIFF) + (int)format->chunkSize + sizeof(WAVE_CHUNK));
if (data->chunkID != WAVE_DATA_ID)
return(false); // 返回出錯!
6.獲取音頻數據
PBYTE audio = (PBYTE)malloc(data->chunkSize);
memcpy(audio, &data->data, data->chunkSize);
return true;
}