I'd like to move some operations involving AVAudioPlayer - and possibly AVAudioEngine, although that's less important - off the main thread using a serial dispatch queue or similar mechanism. Here's a simple self-contained example of what I'm talking about:
import AVFoundation
import UIKit
class ViewController: UIViewController {
let player = try! AVAudioPlayer(
contentsOf: Bundle.main.resourceURL!.appendingPathComponent("audio.m4a")
)
let queue = DispatchQueue(label: "", qos: .userInteractive)
override func touchesBegan(_ touches: Set, with event: UIEvent?) {
queue.async {
if self.player.isPlaying {
self.player.stop()
self.player.currentTime = 0.0
} else {
self.player.play()
}
}
}
}
In this example, an AVAudioPlayer instance is created on the main thread, and then subsequent operations are performed on other threads using a serial queue.
Is it safe to use AVAudioPlayer, or related tools like AVAudioEngine, in this way? Again, all operations on these objects would be serial, never concurrent.