そこで、マルチチャンネル ミキサーとリモート I/O ユニットをセットアップして、オーディオ ファイルから読み取った PCM データの複数のバッファーをミックス/再生しました。ゲームの短いサウンド エフェクトの場合、ファイル全体をメモリ バッファにロードしますExtAudioFileRead()
。
バックグラウンド ミュージックとして、3 分間の圧縮オーディオ ファイルがあるとします。mp3 @ 128 kbps (44,100 Hz ステレオ) としてエンコードされていると仮定すると、1 分あたり約 1 MB、つまり合計 3 MB になります。無圧縮の記憶では、私の記憶が正しければ10倍くらいはあると思います。小さなファイルの場合とまったく同じ方法を使用できます。ExtAudioFileRead()
利用可能な場合は(単一の)ハードウェアデコーダーを使用してデコードを処理すると思いますが、バッファー全体を一度に読み取るのではなく、ディスクから定期的に「ストリーミング」したいと思います。
最初に頭に浮かぶのは、(「拡張されていない」) Audio File Services API の 1 つ下のステップに進み、次AudioFileReadPackets()
のように を使用することです。
2 つのバッファ A と B を準備します。それぞれが 5 秒間のオーディオを保持するのに十分な大きさです。再生中、一方のバッファから読み取りを開始し、最後に到達したらもう一方のバッファに切り替えます (つまり、リング バッファの 2 つの半分を構成します)。
ファイルからオーディオの最初の 5 秒間をバッファー A に読み取ります。
次の 5 秒間のオーディオをファイルからバッファ B に読み込みます。
再生を開始します (バッファー A から)。
再生ヘッドがバッファ B に入ったら、次の 5 秒間のオーディオをバッファ A にロードします。
再生ヘッドが再びバッファ A に入ったら、次の 5 秒間のオーディオをバッファ B にロードします。
#5へ
これは正しいアプローチですか、それとももっと良い方法がありますか?