MediaPlayerでisLoopingをtrueにするとループ再生できますが、ループ時に音が途切れてしまいます。
別のMediaPlayerのインスタンスを予め用意しておき、1つ目のMediaPlayerのインスタンスの再生が終わった時にそれを再生することで、音が途切れないようにループ再生させることができるようになります。
ソースコード
以下のページのJavaで書かれたソースコードをKotlinに書き換えました。
Not able to achieve Gapless audio looping so far on Android – Stack Overflow
まだ勉強中で基本的な文法がわかっていないので、参考程度にしてください。一応これで動きます。
import android.content.Context import android.media.MediaPlayer import android.util.Log public class LoopMediaPlayer(context: Context, resId: Int) { companion object { var TAG: String = LoopMediaPlayer::class.java.simpleName public fun create(context: Context, resId: Int): LoopMediaPlayer { return LoopMediaPlayer(context, resId) } } private var mContext: Context? = null private var mResId: Int = 0 private var mCounter: Int = 1 private var mCurrentPlayer: MediaPlayer? = null private var mNextPlayer: MediaPlayer? = null init { mContext = context mResId = resId mCurrentPlayer = MediaPlayer.create(mContext, mResId) mCurrentPlayer?.setOnPreparedListener{ it.start() } createNewMediaPlayer() } private fun createNewMediaPlayer() { mNextPlayer = MediaPlayer.create(mContext, mResId) mCurrentPlayer?.setNextMediaPlayer(mNextPlayer) mCurrentPlayer?.setOnCompletionListener{ it.release() mCurrentPlayer = mNextPlayer createNewMediaPlayer() Log.d(TAG, String.format("Loop #%d", ++mCounter)) } } }
呼び出し側。
LoopMediaPlayer.create(context, R.raw.bgm)
Kotlinをある程度身につけたら、ソースコードを見直して書き直します。