SoundPoolを使ってゲームの効果音を再生する【Android/Kotlin】




SoundPoolを使ってゲームの効果音を再生する


今回のAndroidサンプルプロジェクトでは、SoundPoolを使ってサウンド再生をやってみた。
図のように2つのボタンを設置して、クリックしたときに効果音が鳴るだけのシンプルなプログラムである。








サウンドファイルはres/rawへ配置する





図のようにresrawディレクトリを作り、そこに用意したサウンドファイルを配置する。
コード内からファイルを参照するにはR.raw.drumrollのような形でアクセスが可能だ。

参考: リソースの提供




SoundPoolをシングルトンで管理する



複数Activityをまたがった時にサウンドが途切れないようにしたいので、次のようにシングルトンで実装してみた。




LOLLIPOP以降はBuilderで生成する



LOLLIPOP以前と以降ではSoundPoolの生成方法が違うので注意が必要だ。LOLLIPOP以降ではコンストラクタが使えなくなっておりBuilderで生成することになっている。次のようにSDKのバージョンを比較して条件分岐することになる。



参考: Play sound using soundpool example




同時に複数のサウンドを鳴らしたい



maxStreamsに1以上の数を指定してあげることで、その数分だけ同時再生が可能になる。maxStreamsを大きくすればそれだけ処理に負荷がかかるので、必要以上に値を大きくすべきではないだろう。


参考: Playing multiple SoundPool at the same time





音楽ファイルはsoundIDで管理する



SoundPoolloadメソッドで音声データをロードするとint型のsoundIDが返ってくる。このsoundIDplayメソッドで再生するときに必要になるのでメンバ変数に保存しておく。



companion objectsoundIDのメンバ変数を定義すると、Activityから次のような形で呼び出せるので便利だ。







Soundクラスの全容



以上の内容で作ったSoundクラスの全容を載せておく。




MainActivityからサウンド再生する



最後にMainActivityからSoundクラスのインスタンスを生成してサウンドを鳴らしてみよう。



SoundPool生成のタイミングの問題で、初回のみ再生出来ない現象があるのでSound.getInstance(this)に一度触れて事前に初期化している。

この問題はこちらでも議論になっているので参考に。

Why does my SoundPool sound not play the first time on Android?





これってSoundPoolのバグ?


ところでSoundPoolを鳴らしていると、そのうち鳴らなくなったりする現象を発見した。
その時コンソールには次のようなエラーが。

E/AudioTrack: AudioFlinger could not create track, status: -12
E/SoundPool: Error creating AudioTrack


ググってみるとこちらの記事が該当するようだ。

» android - AudioFlinger could not create track, status: -12; Error creating AudioTrack - Stack Overflow


記事とは違ってシングルトンの場合だと、どうしたら良いのやら。一定時間または一定回数鳴らしたら強制的にインスタンスを再生成するとか?

AudioTrackはシングルトンにした方が安定することがわかった。

また、wavからoggファイルへ変換したところSoundPoolの不安定さがなくなった。


10個ほどサウンドファイルの容量を比較。なんとoggはwavの1/10程度まで圧縮されている。効果音なので音質も問題ない感じだ。これは良い!
212K    ./ogg
2.3M    ./wav

ちなみにwavからoggへ変換するにはffmpegで可能である。

Kotlinプログラミング

Kotlinは、Javaとの相互運用を可能にし、Android OSでGoogleがフルサポートする静的型プログラミング言語です。この言語は、Javaだけでは十全ではない(Javaだけでは実装に手間がかかりすぎる)、軽量かつ豊かな表現形式や、他言語ではすでに実装されている最新の機能を盛り込んでいます。

KindleAmazon

基本からしっかり身につくAndroidアプリ開発入門

圧倒的な多数のユーザーが使っているヤフーのアプリ。その制作の最前線にいる黒帯エンジニアが、ユーザーが使いやすいアプリの大切な基本をしっかりと解説します。

KindleAmazon


あなたにおすすめ