Звук гудка, воспроизводимый в oop, прекращается через некоторое время как для SoundPool, так и для MediaPlayer. - PullRequest
4 голосов
/ 19 апреля 2020

Я пытаюсь воспроизводить короткий .mp3 звук (звуковой сигнал) непрерывно, 100 раз в минуту. Он воспроизводится примерно 30-45 раз правильно (больше на новых устройствах), затем останавливается на некоторое время (~ 30 секунд), а затем воспроизводится снова (только ~ 10 раз).

Я пробовал оба SoundPool (playBeepSound1) и MediaPlayer (playBeepSound2), поэтому, возможно, я неправильно использую Handler.

    private val delay: Float = 60.0F / 100.0F * 1000.0F // 100 times per minute

    private var handler: Handler? = null
    private var soundPool: SoundPool? = null
    private var mediaPlayer: MediaPlayer? = null

    override fun onResume() {
        super.onResume()
        startBeeping()
    }

    private fun startBeeping() {
        handler = Handler()
        handler?.postDelayed(object : Runnable {
            override fun run() {
                handler?.postDelayed(this, delay.toLong())
                playBeepSound1() // SoundPool
//                playBeepSound2() // MediaPlayer
            }
        }, delay.toLong())
    }

    private fun playBeepSound1() {
        val attributes = AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_GAME)
            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
            .build()

        soundPool = SoundPool.Builder()
            .setAudioAttributes(attributes)
            .build()

        soundPool?.setOnLoadCompleteListener { soundPool, soundId, _ ->
            soundPool.play(soundId, 1.0f, 1.0f, 0, 0, 1.0f);
        }
        soundPool?.load(baseContext, R.raw.beep_sound, 1)
    }

    private fun playBeepSound2() {
        mediaPlayer = MediaPlayer.create(this, R.raw.beep_sound)
        mediaPlayer?.start()
    }

    override fun onPause() {
        super.onPause()
        stopBeeping()
    }

    private fun stopBeeping() {
        handler?.removeCallbacks(this)
        handler = null

        soundPool?.release()
        soundPool = null

        mediaPlayer?.release()
        mediaPlayer = null
    }

Любые идеи о том, как можно воспроизвести короткий звук в al oop?

Обновление:

Я тестировал его на разных устройствах с разными версиями ОС (Android 6, Android 9, тоже эмуляторы) и результат практически одинаковый. Единственная разница - это время, после которого он перестает издавать звуковые сигналы.

Файл mp3 имеет размер 5 КБ.

1 Ответ

0 голосов
/ 02 мая 2020

Я не знаю kotlin, но я бы так и поступил в Java с MediaPlayer.

MediaPlayer player=MediaPlayer.create(MainActivity.this,R.raw.beep_sound);
for(int i=0;i<45;i++){
    //the for loop will make it run 45 times
    player.start();
    //wait for 600 milliseconds because it's 100 times a minute
    Thread.sleep(600);
}
//stop for 30 seconds
Thread.sleep(30000);
//then this time play 10 times only
for(int i=0;i<10;i++){
    player.start();
    Thread.sleep(600);
}
...