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

/




今回は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?


関連記事


非同期 & ネットワーク処理
* はじめてRetrofitを使ってみる (Android Kotlin)
* 非同期処理でCoroutine(コルーチン)を使ってみる (Android Kotlin)
* OkHttpでHTTP通信 (Android Kotlin)
* スレッド処理 (Android Kotlin)

View & レイアウト
* リサイクラービューを使ってリスト表示 (Android Kotlin)
* 角丸表現 (Android Kotlin)
* onSaveInstanceStateで画面回転時の状態の保存と復元 (Android Kotlin)
* ListViewを簡単なモデルで理解しよう (Android Kotlin)
* バネアニメーション (Android Kotlin)
* startActivityForResultを使ってみる (Android Kotlin)
* ActivityとFragmentの連携を理解する (Android Kotlin)
* DataBinding機能を使ってみる (Android Kotlin)
* タッチイベントのフック (Android Kotlin)
* DialogFragmentを使ったダイアログの表示 (Android Kotlin)

サウンド
* これってSoundPoolのバグ?(Android Kotlin)
* SoundPoolを使ってゲームの効果音を再生する (Android Kotlin)

データ & オブジェクト
* Kotlinでオブジェクト(object)の動作確認
*
データクラスとタプル (Android Kotlin)
* Null安全、ぬるぽバイバイ (Android Kotlin)