Opusを使ったサウンドの読み込み

Opusファイルの再生関数

再生まで一気に行うPlayOpus関数の例です。

IXAudio2SourceVoice* PlayOpus(const char* filename)
{
	int ret;
	//ファイル開く
	OggOpusFile* of = op_open_file(filename, &ret);
	if (of == NULL) {
		return nullptr;
	}
	//波形情報の取得
	const OpusHead* pHead = op_head(of, -1);
	if (!pHead) {
		return nullptr;
	}
	WAVEFORMATEX wfex{};
	//PCMなので固定
	wfex.wFormatTag = WAVE_FORMAT_PCM;
	//チャンネル数(モノラル:1 ステレオ:2)
	wfex.nChannels = pHead->channel_count;
	//サンプリングレート(48000固定)
	wfex.nSamplesPerSec = 48000;
	//サンプル当たりのビット数(8bit:8 16bit:16)
	wfex.wBitsPerSample = 16;
	//ブロックサイズ(16bit ステレオなら 2*2=4)
	wfex.nBlockAlign = wfex.nChannels * wfex.wBitsPerSample / 8;
	//データ速度(秒間当たりのデータ量 channel*sample*bit/8)
	wfex.nAvgBytesPerSec = wfex.nSamplesPerSec * wfex.nBlockAlign;

	// 合計サイズの取得
	ogg_int64_t decodedSize = op_pcm_total(of, -1) * wfex.nBlockAlign;
	//必要なメモリ確保
	char* pDecodedBuf = (char*)malloc(decodedSize);
	char* pBuf = pDecodedBuf;

	int readSize;
	while ((readSize = op_read(of, (opus_int16*)pBuf, 8096, NULL)) > 0) {
		pBuf += readSize * wfex.nBlockAlign;
	}
	op_free(of);

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

	// 再生する波形データの設定
	XAUDIO2_BUFFER buf{};
	buf.pAudioData = (BYTE*)pDecodedBuf;
	buf.Flags = XAUDIO2_END_OF_STREAM;
	buf.AudioBytes = decodedSize;

	// 波形データの再生
	pSourceVoice->SubmitSourceBuffer(&buf);
	pSourceVoice->Start();

	return pSourceVoice;
}

これでOpusの読み込みと再生は完了です。
Opusはストリーミング再生をした際に真価を発揮するフォーマットです。

なので今回はオンメモリ再生となっていますが、将来的にはストリーミング再生についても記載していこうかと思います。

1 2

コメントを残す

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