AVAudioPlayer вызывает сбой приложения - PullRequest
0 голосов
/ 18 мая 2018

Я работаю над приложением, которое получает целое число каждые 200 мс и воспроизводит тон для размера целого числа, равномерно распределенного в течение следующего интервала 200 мс.Звук работает нормально, но приложение вылетает в совершенно случайное время.Первоначально я проводил тестирование на iPod (5-го поколения), и он зависал где-то между 1 и 10 минутами, давая мне сообщение об ошибке

"EXC_BREAKPOINT (EXC_ARM_BREAKPOINT, subcode = 0xdefe)"

До того, как я получил EXC_BAD_ACCESS, но после перемещения определения игрока на AppDelegate среди других попыток исправлений, сообщение теперь является точкой останова ARM.Я также попробовал свой iPhone 6S +, и он работал более 15 минут без сбоев.

Плеер определен в ViewController (как предложено в другом посте здесь) следующим образом:

var audioPlayer: AVAudioPlayer!

Вот код в классе контроллера представления, который работает для воспроизведения тона:

//called for every beep
@objc func playSound() {
    toneCount += 1
    if toneCount >= totalTones{
        if toneTimer != nil {
            toneTimer?.invalidate()
            toneTimer = nil
        }
    }
    do{
        guard let url = Bundle.main.url(forResource: "geiger", withExtension: "mp3") else { return }
        audioPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)
        audioPlayer.play()
    }catch{
        print("failed")
    }

}

Это выводится на консоль, когда происходит сбой:

"[AVAudioPlayer performSelector:withObject:]: message sent to deallocated instance 0x1886b590"

В кадре стека (не уверен, что это правильный термин, но кадр слева от вывода консоли) выводится переменная игрока, показывающая, что она равна (AVAudioPlayer)?и внутри переменной player находится "ObjectiveC.NSObject", которая сама по себе пуста

Действительно, я не очень уверен, что еще можно попробовать, поскольку я пытался сделать игрока слабой переменной, но тогда тон не воспроизводится.Я попытался определить его в контроллере представления.Меня также озадачивает, почему на iphone 6S + не происходит сбой и почему это происходит совершенно случайно, когда происходит сбой.

Я также пытался создать одноэлементный класс в отдельном файле, напримерэто:

let tone = soundtest()

class soundtest {
    func playTone() {
        do{
            print("played Sound")
            guard let url = Bundle.main.url(forResource: "geiger", withExtension: "mp3") else { return }
            let audioPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)
            audioPlayer.play()
        }catch{
            print("failed")
        }
    }
}

попытка воспроизведения звука звучит так:

tone.playTone()

и теперь звук не воспроизводится

1 Ответ

0 голосов
/ 25 мая 2018

Скорее всего, происходит сбой, потому что audioPlayer был выпущен до конца звука.Чтобы предотвратить это, как вы написали в комментарии, вы можете проверить, воспроизводит ли плеер звук, прежде чем звонить playSound.Или сохраните каждый player в массив, а затем отпустите, когда закончится звук.

...