WisdomSoft - for your serial experiences.

7.3 ストリーミング再生

XACT でウェーブバンクをストリーミングに設定することで、再生する部分を逐次読み取りながら再生できます。通常、再生時間が長くサイズが大きくなる BGM などに対して設定します。

7.3.1 読みながら再生する

デフォルトの設定では、ウェーブバンクに登録した音声データは、全てメモリに読み込まれてから再生されます。短い効果音などの再生には適していますが、BGM などの数十 MB を超える大きな音楽データをメモリに読み込むことは避けなければなりません。メモリの使用領域が圧迫されると、頻繁にガベージコレクションが発生する要因となり、パフォーマンスにも影響を及ぼす可能性があります。

BGM などの大きな音声データは、必要な部分を読み込みながら再生するストリーミングに設定します。XACT 上で BGM を格納するウェーブバンクを選択し、「Type」グループパネル内にある「Streaming」ボタンを押してください。デフォルトでは、メモリに読み込んで再生する In Memory にチェックされていますが、Streaming に切り替えることでストリーミング再生が可能となります。

図1 ストリーミング設定
図1 ストリーミング設定

ウェーブバンクがストリーミング再生の設定になっている場合、次の WaveBank クラスのコンストラクタからインスタンスを生成する必要があります。

WaveBank クラスのコンストラクタ
public WaveBank (
         AudioEngine audioEngine,
         string streamingWaveBankFilename,
         int offset,
         short packetsize
)

audioEngine パラメータには、関連付けるオーディオエンジンを指定します。streamingWaveBankFilename パラメータには、読み込む Streaming 型のウェーブバンクのパスを指定します。ここまでは、In Memory のウェーブバンクと変わりません。続く offset パラメータにデータファイル内のオフセットを指定しますが、通常は 0 で問題ありません。packetsize パラメータには、読み込みに使用するパケットサイズを指定します。

オフセットやパケットサイズは、どちらも DVD セクタ単位が使われます。よって 1 セクタあたり 2048 バイトを表します。パケットサイズが小さければ、わずかな遅延でサウンドが途切れてしまいます。一方でパケットサイズが大きすぎるとメモリを消費するので、適切な容量に調整してください。通常は、DVD に最適な 16 の倍数を指定します。

また、ストリーミング再生を行うウェーブバンクを再生する前に、必ずウェーブバンクの作成に使用した AudioEngine オブジェクトの Update() メソッドを 1 度呼び出し、再生の準備を行う必要があります。これが行われていない場合、キューを再生しようとしたときに例外が発生します。

コード1 (Win, Xbox 360)
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;

public class Test : Game
{
    public static void Main(string[] args)
    {
        using (Game game = new Test()) game.Run();
    }

    private AudioEngine audio;
    private WaveBank wave;
    private SoundBank sound;

    protected override void Initialize()
    {
        audio = new AudioEngine("Content/TestAudio.xgs");
        wave = new WaveBank(audio, "Content/TestWave.xwb", 0, 16);
        sound = new SoundBank(audio, "Content/TestSound.xsb");

        audio.Update();
        sound.PlayCue("Test");

        base.Initialize();
    }

    protected override void Update(GameTime gameTime)
    {
        audio.Update();
        base.Update(gameTime);
    }
}

コード1は、Streaming 型のウェーブバンクを読み込み、ストリーミング方式でサウンドを再生します。データサイズの大きい BGM などのデータを再生するために必要になるでしょう。