Android SDK SoundPoolでSE再生

どうもNDK内に組み込んだopenALさんのSE再生が遅いため、
仕方なしに効果音を鳴らす処理などを外に出しました。
この際、再生に利用してみようと思うのは「SoundPool」クラス。


細かくここで内容を書かなくても参考に出来る偉大な先人様方の
サイトがありますので、今回行った設計思想程度書いておこうかなと。


この「SoundPool」クラスは1つのインスタンスで複数の音声を再生することができ、
また先にメモリにロードしてから再生を行うため遅延が少ないことなどが特徴です。
注意点としては、10秒程度しか再生できないようなのでBGM再生には
向いていない、と言ったところでしょうか。


再生するオーディオファイルは、ローカルファイルからでも読み込み可能ですが
今回はリソース以下に配置して利用しています。
場所は「res/raw」以下です。


ファイルの形式は「ogg」にしておくのが最適かと思います。
というのも、私は最初「WAVE」で再生させてたんですが何故か本来の音よりも
フェード部分が省略されている?ような感触があったんですが
ogg形式だとそれが無かったというか。そんな感じで。


コンストラクタなど詳細な情報は、参考にさせて頂いた
こちらのサイトをご覧ください。
Tech Booster - SoundPoolで効果音を鳴らす
Hacking My Way 〜 itogのhack日記 - SoundPool使用上の注意点



今回は既にOpenALで出力するつもりだったので、そのあたりを全てコメントアウトして
処理の流れから出力したいSEに値する処理が行われた場合は、応じた戻り値を
返させる形としました。 これでも微妙に遅延が発生するから工夫が必要だー。


再生させる音声は6個程度でしたが、音声を鳴らす組み合わせごとの
定数を定義するような面倒な真似はしたくありませんでしたので、
ここはビットシフトを利用したフラグ処理を行います。 私はよくやるんですけどね。


例えば、音声1、音声2、音声3、音声4とあった場合にそれぞれを


音声1 : 1
音声2 : 2
音声3 : 4
音声4 : 8
:


このように定義していきます。
この値が何を表しているかは、ある程度基礎を学んだ人なら簡単に分かると思いますが
そのビットに1が立っていた場合の値です。


そう、つまりはその処理が行われたら該当するビットにORでフラグを立てて行き、
戻り値に対してANDで値を取得すればどのSEを鳴らせばよいか分かる、と言ったところ。
もっと効率いいやり方はありそうな気がしないでも無いけど。 個人的にはこれが好き。
複数の値を判定したい場合などにビット演算はよく使います。