Завершение цикла SoundPool с помощью onPause () - PullRequest
0 голосов
/ 15 января 2019

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

Моя проблема сейчас заключается в том, как остановить звук, когда активность прекращается.

    class MajorPentatonic : AppCompatActivity() {
        [...]
        private lateinit var mSoundPool: SoundPool
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_chromatic)

    val audioAttributes = AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_GAME)
            .build()

        val mSoundPool = SoundPool.Builder()
            .setMaxStreams(14)
            .setAudioAttributes(audioAttributes)
            .build()

        val cbordun = mSoundPool.load(this, R.raw.cbordun, 1)
        val gbordun = mSoundPool.load(this, R.raw.gbordun, 1)

        fun playC() {
            mSoundPool.play(cbordun, 0.8f, 0.9f, 1, -1, 1f)
            }
        fun playG() {
            mSoundPool.play(gbordun, 0.8f, 0.9f, 1, -1, 1f)
            }

        val delayBordun: CountDownTimer = object: CountDownTimer(30000, 1000) {
            override fun onFinish() {
                playG()
                }
            override fun onTick(p0: Long) {
                // nothing
                }
            }.start()

        playC()
        delayBordun.start()
    }
    override fun onPause() {
        super.onPause()
        mSoundPool.release()
    }
}

Когда я запускаю эту программу, воспроизводится только gbordun. Кроме того, когда я покидаю активность, приложение вылетает, и я получаю сообщение об ошибке, потому что lateinit var mSoundPool не был инициализирован - я думаю, потому что тип SoundPool.Build, а не SoundPool? Если я сделаю тип явным, используя val mSoundPool: SoundPool = SoundPool.Builder, результат останется прежним. Если я изменю значение val mSoundPool = SoundPool.Builder сверху на val xSoundPool = SoundPool.Builder, а затем добавлю значение val mSoundPool: SoundPool = xSoundPool ниже, оно также останется прежним. Создание всего var вместо val также не помогло.

У меня такое ощущение, что есть что-то очевидное, что я скучаю, но я понятия не имею, что ... остановка?

...