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();
これで波形データの再生が行えます。
では一連の流れをつなげて関数化してみましょう。