Как получить доступ к нескольким буферам в UnsafePointer <AudioBufferList>(не изменяемый) - PullRequest
0 голосов
/ 22 марта 2020

Я пытался использовать новый AVAudioSinkNode в Core Audio. Это передает audioBufferList, который имеет тип UnsafePointer<AudioBufferList> к закрытию, обрабатывающему аудио.

Реализация AudioBufferList в Swift такова, что вы не можете обращаться к нескольким буферам, если их несколько. Apple предоставила оболочку для изменяемой версии UnsafeMutablePointer<AudioBufferList>, которая называется UnsafeMutableAudioBufferListPointer и обеспечивает доступ к нескольким буферам.

Но я не могу найти подходящую обертку, которую можно было бы использовать с неизменяемым UnsafePointer<AudioBufferList> ....

let sinkNode = AVAudioSinkNode() { (timestamp, frames, audioBufferList) -> OSStatus in
    // audioBufferList is UnsafePointer<AudioBufferList>
    // how to access multiple buffers in audioBufferList?
}

Заранее спасибо!

1 Ответ

1 голос
/ 23 марта 2020

Чтобы получить доступ к каждому AudioBuffer в AudioBufferList в Swift, вы можете выбрать два способа:

  • Выполнить некоторые операции с указателями самостоятельно и рассчитать каждый адрес AudioBuffer.
  • Используйте UnsafeMutableAudioBufferListPointer принудительно.

Если вы могли найти правильный пример кода до того, как UnsafeMutableAudioBufferListPointer был введен в Swift, первым вариантом может быть ваш вариант, но на данный момент трудно найдите один.


Чтобы использовать UnsafeMutableAudioBufferListPointer принудительно, вам может потребоваться преобразовать UnsafePointer<AudioBufferList> в UnsafeMutablePointer<AudioBufferList>, что не так уж сложно:

            let audioBufferListPtr = UnsafeMutableAudioBufferListPointer(UnsafeMutablePointer(mutating: audioBufferList))

Я вам верю знать, как получить доступ к буферам, как только вы получите UnsafeMutableAudioBufferListPointer.

Внимание: Даже если преобразование типов из UnsafePointer<AudioBufferList> в UnsafeMutablePointer<AudioBufferList> выполняется легко, фактическая область проходит через audioBufferList не является изменчивым Вам может потребоваться дополнительная осторожность, чтобы не мутировать такой регион.

...