Я занимаюсь разработкой приложения для тренировки слуха / слуха, для которого требуется постоянная фоновая точка бордун / дрон / педаль, чтобы пользователь мог идентифицировать звуки, которые воспроизводятся поверх этого.
Моя проблема сейчас заключается в том, как остановить звук, когда активность прекращается.
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
также не помогло.
У меня такое ощущение, что есть что-то очевидное, что я скучаю, но я понятия не имею, что ... остановка?