Waveファイルの再生関数
再生まで一気に行うPlayWave関数の例です。
IXAudio2SourceVoice* PlayWave(const char* filename)
{
FILE* file = NULL;
if (fopen_s(&file, filename, "rb") != 0) {
return nullptr;
}
// RIFFヘッダーの読み込み
RiffHeader riff;
fread(&riff, sizeof(riff), 1, file);
// Formatチャンクの読み込み
FormatChunk format;
fread(&format, sizeof(format), 1, file);
// Dataチャンクの読み込み
Chunk data;
fread(&data, sizeof(data), 1, file);
// Dataチャンクのデータ部(波形データ)の読み込み
char* pBuffer = (char*)malloc(data.size);
fread(pBuffer, data.size, 1, file);
fclose(file);
WAVEFORMATEX wfex{};
// 波形フォーマットの設定
memcpy(&wfex, &format.fmt, sizeof(format.fmt));
wfex.wBitsPerSample = format.fmt.nBlockAlign * 8 / format.fmt.nChannels;
// 波形フォーマットを元にSourceVoiceの生成
IXAudio2SourceVoice* pSourceVoice = nullptr;
if (FAILED(pXAudio->CreateSourceVoice(&pSourceVoice, &wfex))) {
free(pBuffer);
return nullptr;
}
// 再生する波形データの設定
XAUDIO2_BUFFER buf{};
buf.pAudioData = (BYTE*)pBuffer;
buf.Flags = XAUDIO2_END_OF_STREAM;
buf.AudioBytes = data.size;
// 波形データの再生
pSourceVoice->SubmitSourceBuffer(&buf);
pSourceVoice->Start();
return pSourceVoice;
}
今回の関数では再生まで全て一連の流れにしていますが、もちろん読み込みだけ行って後で再生するといった使い方も可能です。
今回の場合はSourceVoiceを戻り値として返しているので、呼び出し側で止めたい歳にStopを呼ぶ形となります。
削除の方法はMasteringVoiceと同じでDestroyVoiceを呼び出します。
pSourceVoice->DestroyVoice(); pSourceVoice = nullptr;
これでXAudio2を使用した再生は完了です。
Waveファイルのフォーマットさえ分かれば、難しい処理もないので、DirectSoundなどと比べても楽に再生できるようになったんではないでしょうか!