AVAudioPlayerNode can't play interleaved AVAudioPCMBuffer

I'm building a streaming app on visionOS that can play sound from audio buffers each frame. The source audio buffer has 2 channels and is in a Float32 interleaved format.

However, when setting up the AVAudioFormat with interleaved to true, the app will crash with a memory issue:

AURemoteIO::IOThread (35): EXC_BAD_ACCESS (code=1, address=0x3)

But if I set AVAudioFormat with interleaved to false, and manually set up the AVAudioPCMBuffer, it can play audio as expected.

Could you please help me fix it? Below is the code snippet.

@Observable
final class MyAudioPlayer {
    private var audioEngine: AVAudioEngine = .init()
    private var audioPlayerNode: AVAudioPlayerNode = .init()
    private var audioFormat: AVAudioFormat?

    

    init() {
        audioEngine.attach(audioPlayerNode)
        audioEngine.connect(audioPlayerNode, to: audioEngine.mainMixerNode, format: nil)

        try? AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
        try? AVAudioSession.sharedInstance().setActive(true)

        audioEngine.prepare()
        try? audioEngine.start()
        audioPlayerNode.play()
    }


    // more code...


    /// This crashes
    private func audioFrameCallback_Interleaved(buf: UnsafeMutablePointer<Float>?, samples: Int) { 
        guard let buf,
        let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 480000, channels: 2, interleaved: true),
        let audioBuffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: AVAudioFrameCount(samples))
        else { return }

        audioBuffer.frameLength = AVAudioFrameCount(samples)

        if let data = audioBuffer.floatChannelData?[0] {
            data.update(from: buf, count: samples * Int(format.channelCount))
        }

        audioPlayerNode.scheduleBuffer(audioBuffer)
    }

    /// This works
    private func audioFrameCallback_Non_Interleaved(buf: UnsafeMutablePointer<Float>?, samples: Int) { 
        guard let buf,
        let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 480000, channels: 2, interleaved: false),
        let audioBuffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: AVAudioFrameCount(samples))
        else { return }

        audioBuffer.frameLength = AVAudioFrameCount(samples)

        if let data = audioBuffer.floatChannelData {
            for channel in 0 ..< Int(format.channelCount) {
                for frame in 0 ..< Int(audioBuffer.frameLength) {
                    data[channel][frame] = buf[frame * Int(format.channelCount) + channel]
                }
            }
        }

        audioPlayerNode.scheduleBuffer(audioBuffer)
    }
}

Typo there, the rate is 48000(aka 48kHz).

AVAudioPlayerNode can't play interleaved AVAudioPCMBuffer
 
 
Q