はじめに
SoundPoolを使って音楽を再生する時、
val id = soundPool.load(context, R.raw.hoge1, 1)
soundPool.play(id, 1.0F, 1.0F, 0, 0, 1.0F)
のように、音楽ファイルを読み込んでから再生します。
しかし、以下のようにWarningが出て、音楽が再生されない場合があります。
W/SoundPool: sample 1 not READY
Warningが出てしまう原因は、soundPool.load()
による音楽ファイルの読み込みが完了していないためです。
対策
soundPool.load()
の完了を待つには、soundPool.setOnLoadCompleteListener
を使います。
loadが完了するとこのリスナーが呼ばれる仕組みです。
val id = soundPool.load(context, R.raw.hoge1, 1)
soundPool.setOnLoadCompleteListener { soundPool, sampleId, status ->
// status = 0 でロード成功したことを表す
if (status == 0) {
soundPool.play(sampleId, 1.0F, 1.0F, 0, 0, 1.0F)
}
}
また、複数の音楽ファイルを読み込む場合は個別処理ができます。
「いつでも再生できるよ」とユーザーに通知してあげることもできます。
val firstId = soundPool.load(context, R.raw.hoge1, 1)
val secondId = soundPool.load(context, R.raw.hoge2, 1)
soundPool.setOnLoadCompleteListener { soundPool, sampleId, status ->
if (status == 0) {
when (sampleId) {
firstId -> soundPool.play(sampleId, 1.0F, 1.0F, 0, 0, 1.0F)
secondId -> Toast.makeText(this, "READY secondId", Toast.LENGTH_SHORT)
}
}
}
これで安全に音楽ファイルを再生することができます!