Воспроизведение экземпляра AVAudioPlayer из фонового потока иногда не удается - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь воспроизвести звук из фонового потока, используя экземпляр AVAudioPlayer в Swift 5. В большинстве случаев он будет успешным. Но время от времени аудиоплеер не воспроизводит звук.

Кажется, что если дважды вызвать play () или prepareToPlay (), а затем play () подряд, то это как-то решает проблему, но мне это не кажется хорошим решением, так как я беспокоюсь, что это все еще не гарантирует, что он будет успешно играть.

func setUpAudio() {
    AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSession.Category.playback)
    try! AVAudioSession.sharedInstance().setActive(true)
    NotificationCenter.default.addObserver(self, selector: #selector(handleInterruption), name: AVAudioSession.interruptionNotification, object: nil)
}

func startNewAudio() {
    let destinationData = Destinations.getDestinations()
    var audio = destinationData[currentStop]!["audio"] as! String
    if inTransit {
        audio = destinationData[Paths.tourOrder[currentIndex + 1]]!["transit_audio"] as! String
    }
    let sound = NSURL(fileURLWithPath: Bundle.main.path(forResource: audio, ofType: "mp3", inDirectory: "audio")!)
    try! audioPlayer = AVAudioPlayer(contentsOf: sound as URL)
    audioPlayer.delegate = self
    currentTime = 0
    setPlay()
}

func setPlay() {
    paused = false
    pauseButton.setImage(UIImage(named: "pause"), for: .normal)
    pauseButton.isEnabled = true
    audioPlayer.currentTime = currentTime
    DispatchQueue.global(qos: .background).async {
        self.audioPlayer.play()
        print(self.audioPlayer.isPlaying) // returns false sometimes
    }
}

Я вызываю методы в следующем порядке:

setUpAudio()
startNewAudio()
setPlay()

Я не могу понять проблему - я действительно хочу просто вызвать play () один раз и заставить все работать нормально.

1 Ответ

1 голос
/ 01 июня 2019

Нет смысла говорить play в фоновом потоке; воспроизведение звука не блокирует основной поток. Более того, нет оснований полагать, что AVAudioPlayer является потокобезопасным. И ВАШ код, конечно, не является потокобезопасным, так как вы разговариваете с аудиоплеером одновременно из разных потоков. Таким образом, вы используете темы неправильно. Нет смысла обсуждать неправильные результаты поведения. Уберите свой фоновый поток и попробуйте ваш код, делая все правильно. Если проблема остается, мы можем поговорить об этом.

...