Я пытаюсь воспроизвести звук из фонового потока, используя экземпляр 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 () один раз и заставить все работать нормально.