Позвольте MediaPlayer автоматически выбрать случайный файл после завершения - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу создать что-то вроде звукового пейзажа.Для этого у меня есть сервис, в котором созданы три экземпляра MediaPlayer.По завершении они должны выбрать новый файл для воспроизведения, воспроизвести этот файл и повторить этот процесс.

Следующий код воспроизводит файлы только из .create(), но, похоже, больше ничего не делает.Во время выполнения печатаются «selectstarted» и «playstarted», поэтому я могу только догадываться, что ошибка где-то в функции selectBordun() или play(), но я понятия не имею, где.

Обратите вниманиечто я сократил код для удобства чтения.Каждый раз, когда упоминается mPlayer, у меня есть один и тот же код еще два раза, только с mPlayer2 и mPlayer3.Но основной принцип должен быть одинаковым только с одним экземпляром.

open class BordunService : Service() {

private lateinit var mPlayer: MediaPlayer

override fun onCreate() {
    mPlayer = MediaPlayer.create(this, R.raw.fping)
}

override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {

    if (intent.hasExtra("Play")) {
                    playBordun()
                }
}

private fun playBordun() {
        fun playMPlayer() {

            mPlayer.setOnCompletionListener(object: MediaPlayer.OnCompletionListener  {
                override fun onCompletion(p0: MediaPlayer?) {
                    println("completem")
                    selectBordun(mPlayer)
                }
            })

             mPlayer.setOnPreparedListener(object:MediaPlayer.OnPreparedListener {
                override fun onPrepared(p0: MediaPlayer?) {
                    println("preparedm")
                    mPlayer.start()
                }
            })
        }

        GlobalScope.launch {
            playMPlayer()
        }
    }

fun selectBordun(player: MediaPlayer) {
    println("selectstarted")
    player.reset()
    val randomGenerator = Random()
    val bordunInt = randomGenerator.nextInt(3) + 1
    when (bordunInt) {
        1 -> {
            val afd = this.getResources().openRawResourceFd(R.raw.cping)
            afd.close()
            player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength())
//                player.prepareAsync()
            play(player)
        }
        2 -> {
            val afd = this.getResources().openRawResourceFd(R.raw.ebping)
            afd.close()
            player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength())
//              player.prepareAsync()
            play(player)
        }
        3 -> {
            val afd = this.getResources().openRawResourceFd(R.raw.gping)
            afd.close()
            player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength())
//            player.prepareAsync()
            play(player)
        }
    }
}

fun play(player: MediaPlayer) {
   println("playstarted")
   player.setOnPreparedListener(object:MediaPlayer.OnPreparedListener {
        override fun onPrepared(p0: MediaPlayer?) {
            println("preparedplayer")
            player.start()
        }
    })


    player.setOnCompletionListener(object: MediaPlayer.OnCompletionListener  {
        override fun onCompletion(p0: MediaPlayer?) {
            println("completeplayer")
            selectBordun(player)
        }
    })

}

}

1 Ответ

0 голосов
/ 27 февраля 2019

Хорошо, я решил эту проблему, используя еще один шаблонный код, выпуская и заново создавая каждый экземпляр MediaPlayer со своей собственной функцией, поэтому мне не пришлось устанавливать новый источник данных.

...