XAudio2でサウンドの再生

サウンドの再生

前回の記事で『XAudio2の初期化』を行いました。

次はサウンドの再生部分を作っていきたいと思います。
XAudio2で個々のサウンドを制御するのはソースボイス(SourceVoice)が行います。

 

ソースボイスの作成

XAudio2の初期化と同じくソースボイスも作成は簡単です。
ただし、ソースボイスでサウンドを再生するには別途波形データの情報が必要となります。

どちらかと言えばこちらで苦労することが多くなってきます。

今回、先ずはソースボイスの初期化から順番に説明していきます。

SourceVoiceの作成
  1. IXAudio2SourceVoice* pSourceVoice = nullptr;
  2. // wfexは後述する波形データのフォーマット情報となります
  3. pXAudio->CreateSourceVoice(&pSourceVoice, &wfex);


これだけで作成できます。
ただ、サウンドデータのフォーマット(wfex)が分からなければ作成ができません。

ソースボイスを作成するには前提としてサウンドデータのフォーマットを知っておく必要があります。
しかし、フォーマットと言ってもサウンドには定まったフォーマットがある訳ではありません。

なので事前にサウンドデータを読み込んでのフォーマットを取得しておく必要があります。

 

Waveファイルの読み込み

次はWave(.wav)ファイルを使った形で説明していきます。
今回は基本的なファイルフォーマットにのみ対応した例外無視の実装をしていきます。

Waveを読むために、先ずは各情報を読み取るための構造体を用意します。

  1. // チャンクデータの基本構造
  2. struct Chunk
  3. {
  4. char id[4]; // チャンク毎のID
  5. int32_t size; // チャンクサイズ
  6. };
  7.  
  8. // RIFFヘッダー
  9. struct RiffHeader
  10. {
  11. Chunk chunk; // "RIFF"
  12. char type[4]; // "WAVE"
  13. };
  14.  
  15. // FMTチャンク
  16. struct FormatChunk
  17. {
  18. Chunk chunk; // "fmt "
  19. WAVEFORMAT fmt; // 波形フォーマット
  20. };


こんな感じです。
この3つがあれば簡単にWAVEが読み込めてしまいます。

WaveファイルはChunkと呼ばれる形式で管理されています。
Chunkの基本フォーマットは下記です。

id チャンクの識別子として4文字
size データ部のサイズ
データ部 各チャンク毎のデータ

Waveこのフォーマットで並べられたデータとなっています。

先ず先頭にRIFFチャンク

id “RIFF”
size データ部のサイズ
データ部 チャンクデータ一覧

このようにRIFFチャンクは全体のチャンクを内包したチャンクとなります。
sizeにはidとsizeの8バイトを除いたファイルサイズが入っています。

次にFormatチャンクです。
波形のフォーマットが格納されています。

id “fmt “
size データ部のサイズ
WAVEFORMAT 波形のフォーマット

この部分を元にSourceVoiceで再生するフォーマットを取得します。

最後にDataチャンクです。
ここに本体となる波形データが格納されています。

id “data”
size データ部のサイズ
data 波形データ

この波形データをSourceVoiceに流し込むことで音が鳴るようになります。

ではこれらを読み込んで再生する処理を見ていきましょう。

 

1 2 3

コメントを残す

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