如何在Swift中使用CoreAudio API

jps*_*asi 2 c core-audio ios swift

我正在将流媒体音频引擎迁移到swift.我发现很难在swift中使用C Audio API.

我有一个AudioFileStreamOpen api的问题,它需要2个C函数作为参数.我不知道如何使用这个API很快.

AudioFileStreamOpen(self as UnsafePointer<()>, propertyProc, packetProc, kAudioFileMP3Type, audioStreamId)
Run Code Online (Sandbox Code Playgroud)

我为此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 {
    .....
}
Run Code Online (Sandbox Code Playgroud)

感谢您在swift中正确定义此C API

编译错误

hot*_*aw2 5

您不能(当前)使用需要来自纯Swift代码的C回调指针的API.根据devforums.apple.com上Swift论坛的回复,目前的beta 4语言实现不支持使用C函数指针调用Swift函数或方法.

更新:从Swift 2.0开始,上述答案已经过时

另一种方法是在Objective C文件中放入一些小的trampoline C回调函数,它可以与Swift互操作,并让这些C函数依次调用一个块或闭包,它可以是Swift代码.使用Swift闭包配置C回调,然后将这些C回调传递给CoreAudio函数.

  • 从Xcode 6.2 beta 3开始,此限制/限制是否仍然适用? (2认同)