ここからは音声の再生処理について説明します。
一般的に音声データと言えばWAVファイルを使用しますが、
単純にWAVファイルを再生するだけならWindowsの関数のPlaySoundで出来ます。
ただしこのPlaySoundにはいろいろと致命的な問題があるため、
ここではDirectSoundを使ったサウンド再生を行うことにします。
ちなみにPlaySoundの欠点としてはまず複数のサウンドを同時に再生することが出来ません。
そして何より再生を行う時のタイミングの問題があります。
音ゲーでは常に瞬間的に音を出す必要がありますが、毎回WAVファイルをロードしてから再生を行う、
という手順を踏むPlaySoundでは瞬間的に音を出すことは出来ません。
これらをすべて解消してくれるのがDirectSoundで、遅延も少なく複数のサウンドを同時に再生することも出来るので、
音ゲーにはもってこいのサウンドAPIであると言えます。
なお、最近のWindowsではDirectSoundもあまり使われなくなってきているようです。
DirectSoundの代わりとしてはXAudioやWASAPIといったサウンドAPIがあり、
それぞれ現代の用途に合わせて設計された新しいAPIですが、逆に新しいためWinXPでは使用出来ないといった制限があります。
ということでここではまだDirectSoundを使用することにして、ここからは音を再生するまでの基礎知識を説明します。
※WASAPIについてはこちらとこちらに記事があるので、興味がある人は確認してください
DirectSoundはDirectXに含まれるサウンド関係のライブラリです。
ライブラリとはそれを使用するユーザーが分かりやすいような関数をまとめたものなので、
比較的容易にDirectSoundを使ってサウンドを鳴らすことが可能です。
DirectSoundには以下の機能があります。
DirectSoundはサウンドバッファと呼ばれるメモリ領域にはじめからサウンドデータをセットしておき、
再生する際にはそこから自動的にデータを取り出して、さらに既に再生しているサウンドがあれば
それらとミキシング処理されて実際に音が鳴ります。
サウンドバッファは複数作成することが出来るため、例えばたくさんのWAVファイルを読み込ませておき、
ゲーム中ではそれらを個別に再生や停止することでそれぞれのサウンドを同時に鳴すことが出来ます。
ミキシング処理はDirectSound対応のサウンドカードを利用している場合、
ハードウェアで行われるためCPUをまったく使用しなくて済みます。
しかし、もしハードウェアが対応していない場合でも自動的にソフトウェア(CPU)処理で行われるため、
ハードウェアが対応しているかどうかはプログラマーは特に意識する必要はありません。
ちなみにストリーミング再生とは、例えば巨大なWAVファイルを鳴らしたい場合、
サウンドバッファに全データをロードするのに時間がかかるため、全データをロードせずに
再生が必要な分だけをリアルタイムにロードしながら再生を行う方法です。
なお、ストリーミングを行うには結構複雑な処理を行う必要があったりと、
いろいろと問題があるためここではストリーミングは扱っていません。
ということで次からはDirectSoundの使い方を説明します。
※実はDirectSoundのストリーム再生をハードウェアで行う場合、
そもそもまともにストリーミング出来るドライバを見たことが無いため、
実質ストリーミング再生はソフトウェアでのみしか動作しないことになります