XAudio2でサウンドの再生

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などと比べても楽に再生できるようになったんではないでしょうか!

1 2 3

コメントを残す

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