Как предотвратить зависание приложения с двумя перекрывающимися AVAudioPlayers? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть два звука (пинг и сигнал тревоги), которые должны воспроизводиться при выполнении соответствующих условий. Оба звука воспроизводятся повторно. Возможно, что оба звука перекрываются друг с другом, поэтому я объявил отдельный AVAudioPlayer для воспроизведения каждого звука (pingPlayer и alarmPlayer).

  1. Тип заморозки: Пинг и будильник воспроизводятся самостоятельно, но когда оба активированы, в начале все приложение зависает.

  2. Тип заморозки: Когда активируется только сигнал тревоги с дополнительными операторами паузы или остановки в коде, приложение также останавливается.

import AVFoundation

private var pingPlayer: AVAudioPlayer?
private var alarmPlayer: AVAudioPlayer?

func playPing() {
        guard let url = Bundle.main.url(forResource: "ping", withExtension: "mp3") else { return }
        do {
            try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
            try AVAudioSession.sharedInstance().setActive(true)
            pingPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
            guard let player = pingPlayer else { return }

            player.play()
        } catch let error {
            print(error.localizedDescription)
        }
    }

alarmPlayer инициализируется в viewDidLoad () Потому что, когда alarmPlayer инициализируется в отдельной функции (например, playPing ()), приложение все равно зависает.

override viewDidLoad() {
//...

    guard let url = Bundle.main.url(forResource: "alarm", withExtension: "mp3") else { return }
        do {
            try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
            try AVAudioSession.sharedInstance().setActive(true)
            alarmPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)

        } catch let error {
            print(error.localizedDescription)
        }
    }

//alarmPlayer is then called after the condition like this: 

alarmPlayer?.prepareToPlay()
alarmPlayer?.play()
  1. Тип заморозки: вызывается после выполнения определенного условия
alarmPlayer?.stop() //or alarmPlayer?.pause()
...