Я успешно использовал AVAudioPlayerNode
для воспроизведения стерео и моно файлов. Я хотел бы использовать файлы с 3+ каналами (файлы объемного звучания) и иметь возможность направлять звук нелинейным способом. Например, я мог бы назначить файловый канал 0 выходному каналу 2, а файловый канал 4 — выходному каналу 1.
Количество выходов аудиоинтерфейса будет неизвестно (2-40), поэтому мне нужно разрешить пользователю направлять звук по своему усмотрению. И решение в WWDC 2015 507 состоит в том, чтобы пользователь изменение маршрутизации в Audio Midi Setup не является жизнеспособным решением.
Есть только одна возможность, о которой я могу думать (и я открыт для других): создание одного проигрывателя на канал и загрузка каждого из буферов только на один канал похоже на этот пост. Но даже по постерам есть проблемы.
Итак, я ищу способ скопировать каждый канал файла в AudioBuffer, например:
let file = try AVAudioFile(forReading: audioURL)
let fullBuffer = AVAudioPCMBuffer(pcmFormat: file.processingFormat,
frameCapacity: AVAudioFrameCount(file.length))
try file.read(into: fullBuffer)
// channel 0
let buffer0 = AVAudioPCMBuffer(pcmFormat: file.processingFormat,
frameCapacity: AVAudioFrameCount(file.length))
// this doesn't work, unable to get fullBuffer channel and copy
// error on subscripting mBuffers
buffer0.audioBufferList.pointee.mBuffers.mData = fullBuffer.audioBufferList.pointee.mBuffers[0].mData
// repeat above buffer code for each channel from the fullBuffer