XAudio2でサウンドの再生

SourceVoiceでの再生

再生するためには先ほどの説明を元に読み込みを行う必要があります。

Waveファイルの読み込み
FILE* file = NULL;
// Waveファイルを開く
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);


これでWaveフォーマットの各チャンクを元に読み込みが行えます。
※特殊なフォーマットのWaveは読み込めません

Waveが読み込めたら後はSourceVoiceを作るだけです。

SourceVoiceの生成
WAVEFORMATEX wfex{};
// 波形フォーマットの設定
memcpy(&wfex, &format.fmt, sizeof(format.fmt));
// 1サンプル辺りのバッファサイズを算出します
wfex.wBitsPerSample = format.fmt.nBlockAlign * 8 / format.fmt.nChannels;

IXAudio2SourceVoice* pSourceVoice = nullptr;
// 波形フォーマットを元にSourceVoiceの生成
if (FAILED(pXAudio->CreateSourceVoice(&pSourceVoice, &wfex))) {
	free(pBuffer);
	return nullptr;
}


SourceVoiceに必要なフォーマットはFormatチャンクに含まれていた情報です。
あとはこれを元に1サンプル辺りのバッファサイズを追加すれば出来上がりです。

SourceVoicceの再生
XAUDIO2_BUFFER buf{};
// 再生する波形データの設定
buf.pAudioData = (BYTE*)pBuffer;
buf.Flags = XAUDIO2_END_OF_STREAM;
buf.AudioBytes = data.size;
// 波形データの再生
sourceVoice->SubmitSourceBuffer(&buf);
sourceVoice->Start();


これで波形データの再生が行えます。
では一連の流れをつなげて関数化してみましょう。

 

1 2 3

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です