如何在Swift中使用CoreAudio API

我正在将streamaudio引擎迁移到swift。 我发现很难使用CaudioAPI在迅速。

我有AudioFileStreamOpen API的问题,它需要2 C函数作为参数。 我不知道如何使用这个API是迅速的。

AudioFileStreamOpen(self as UnsafePointer<()>, propertyProc, packetProc, kAudioFileMP3Type, audioStreamId) 

我已经为这个API定义了如下的callback方法。 但是我收到编译错误。

 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代码需要Ccallback指针的API。 根据Swift论坛在devforums.apple.com上的回复,当前的beta 4语言实现不支持使用C函数指针调用Swift函数或方法

更新:上面的答案是从Swift 2.0过时

另一种方法是在一个Objective C文件中join一些小的蹦床Ccallback函数,这个文件可以和Swift互操作,并且让这些C函数依次调用一个可以在Swift代码中的块或闭包。 使用Swift闭包configurationCcallback,然后将这些Ccallback传递给CoreAudio函数。

我不太了解Audio API,但是,您应该用指向Object的指针replaceUnsafePointer。 例如:

 var clientData : AnyObject? var listenerProc : AudioFileStream_PropertyListenerProc = AudioFileStream_PropertyListenerProc.convertFromNilLiteral() var packetsProc : AudioFileStream_PacketsProc = AudioFileStream_PacketsProc.convertFromNilLiteral() var audioFileTypyeId : AudioFileTypeID = 0 AudioFileStreamOpen(&clientData, listenerProc, packetsProc, audioFileTypyeId, &streamId) 

listenerProc,packetsProc或其他variables的初始化代码只是绕过了编译器的错误。

根据您的情况,尝试用'&self'replace'self as UnsafePointer <>'。 然而,“自我”必须是可以转换为兼容数据types的东西。

https://developer.apple.com/library/prerelease/ios/documentation/MusicAudio/Reference/AudioStreamReference/index.html#//apple_ref/c/func/AudioFileStreamOpen