如何在Swift中使用CoreAudio API

时间:2014-07-31 10:57:57

标签: ios c swift core-audio

我正在将流媒体音频引擎迁移到swift。我发现很难在swift中使用C Audio 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 {
    .....
}

感谢您在swift

中正确定义此C API

Compilation error

2 个答案:

答案 0 :(得分: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函数。

答案 1 :(得分:2)

我对Audio API了解不多,但是,你应该用指向Object的指针替换UnsafePointer。例如:

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或其他变量的初始化代码只是绕过编译器错误。

根据您的情况,尝试将'self as UnsablePointer&lt;&gt;'替换为'self通过'&amp; self'。但是,“self”必须是可以转换为兼容数据类型的东西。

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