I'm trying to use an AVAudioPlayerNode
to play sounds from the Assets.xcassets
asset catalog, but I can't figure out how to do it.
I've been using AVAudioPlayer
, which can be initialized with an NSDataAsset
like this:
let sound = NSDataAsset(name: "beep")!
do {
let player = try AVAudioPlayer(data: sound.data, fileTypeHint: AVFileTypeWAVE)
player.prepareToPlay()
player.play()
} catch {
print("Failed to create AVAudioPlayer")
}
I want to use an AVAudioPlayerNode
instead (for pitch shifting and other reasons). I can create the engine and hook up the node OK:
var engine = AVAudioEngine()
func playSound(named name: String) {
let mixer = engine.mainMixerNode
let playerNode = AVAudioPlayerNode()
engine.attach(playerNode)
engine.connect(playerNode, to: mixer, format: mixer.outputFormat(forBus: 0))
// play the file (this is what I don't know how to do)
}
It looks like the method to use for playing the file is playerNode.scheduleFile()
. It takes an AVAudioFile
, so I thought I'd try to make one. But the initializer for AVAudioFile
wants a URL. As far as I can tell, assets in the asset catalog are not available by URL. I can get the data directly using NSDataAsset
, but there doesn't seem to be any way to use it to populate an AVAudioFile
.
Is it possible to play sounds from the asset catalog with an AVAudioPlayerNode
? And if so, how?