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