我正在将我的流媒体音频引擎迁移到 swift。我发现很难快速使用 C 音频 API。
我在使用 AudioFileStreamOpen api 时遇到问题,它需要 2 个 C 函数作为参数。我不知道如何快速使用此 API。
AudioFileStreamOpen(self as UnsafePointer<()>, propertyProc, packetProc, kAudioFileMP3Type, audioStreamId)
我已经为这个 API 定义了如下回调方法。但是我遇到了编译错误。
func propertyProc(inClientData: UnsafePointer<()>,inFileStreamId: AudioFileStreamID,inPropertyId: AudioFileStreamPropertyID,ioFlags: UnsafePointer<UInt32>) -> Void {
.....
}
func packetProc(inClientData: UnsafePointer<()>,inNumberOfBytes: UInt32,inNumberOfPackets: UInt32, ConstUnsafePointer<()>, inPacketDescriptions: UnsafePointer<AudioStreamPacketDescription>) -> Void {
.....
}
感谢任何帮助快速正确定义此 C API
最佳答案
您不能(目前)使用需要来自纯 Swift 代码的 C 回调指针的 API。根据 devforums.apple.com Swift 论坛中的回复,当前的 beta 4 语言实现不支持使用 C 函数指针调用 Swift 函数或方法
更新:以上答案自 Swift 2.0 起已过时
一种替代方法是将一些小的 trampoline C 回调函数放在一个 Objective C 文件中,它可以与 Swift 互操作,并让这些 C 函数依次调用可以在 Swift 代码中的 block 或闭包。使用 Swift 闭包配置 C 回调,然后将这些 C 回调传递给 CoreAudio 函数。
关于ios - 如何在 Swift 中使用 CoreAudio API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25057161/