RGSS2を知る(40)

Audioモジュールについて。
RGSS2では普通、ツクール添付のRPGモジュールを使って音を鳴らす。
俺が作っているのはRGSS2組み込みライブラリの互換であって、RPGモジュールには縁が無いので、組み込みライブラリのメソッドでの動作を確認した。

loop do
  Input.update
  Audio.bgm_play("a.ogg") if Input.trigger?(Input::C)
  Audio.bgs_play("b.ogg") if Input.trigger?(Input::B)
  Audio.me_play("c.ogg") if Input.trigger?(Input::A)
  Audio.se_play("d.ogg") if Input.trigger?(Input::L)
  Graphics.update
end

bgmは同時には1つしか鳴らず、自動でループする。少しコードを書き換えて、bgmを複数鳴らそうとすると勝手に前のが中断されて切り替わる。これはたとえばoggとmidなどの組み合わせでもそうなる。
bgsはbgmと似たような感じだが、midは再生できなかった。
meを再生するとbgmが一時停止されてmeが再生され、それが終わってからbgmがフェードインして復活する。bgsに影響は無い。me再生中にbgmを切り替えると、meが終わってから新しいbgmが始めから再生される。この場合フェードインは無い。
seはいくらでも複数同時再生可能だ。
ところで、midファイルを再生した時の音がDXRubyと全然違う。
RTPにDLSファイルを含めているか、もしくはDirectMusic8のエフェクトをかけてあると思われる。


音の指定がファイル名であることから、再生の完了で自動的にバッファを解放状態にしてやらなければならない。
OggVorbisのストリーミング再生でも別スレッドで管理する必要があるから、本格的にマルチスレッドプログラミングが必要だ。っていうかそもそもウィンドウメッセージを別スレッドで管理しないゲームライブラリというのが手抜きなのだ。
FreeRGSSではとりあえずDXRubyのSoundクラスを持っていってごまかそうかと思っていたのだが、まあ、なかなか一筋縄ではいかない。
内部でSoundオブジェクトを保持して、Graphics.update内で再生が終わったオブジェクトを解放していく、というのはアリかもしれない。
いずれにせよ、このレベルの音再生を再現するのはやっぱり大変そうだ。