【问题标题】:How to use the CoreAudio API in Swift如何在 Swift 中使用 CoreAudio API
【发布时间】:2014-07-31 10:57:56
【问题描述】:

我正在将我的流式音频引擎迁移到 swift。我发现很难在 swift 中使用 C Audio API。

我对 AudioFileStreamOpen api 有疑问,它需要 2 个 C 函数作为参数。我不知道怎么用这个API swift。

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

【问题讨论】:

    标签: ios c swift core-audio


    【解决方案1】:

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

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

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

    【讨论】:

    • 从 Xcode 6.2 beta 3 开始,这个限制/限制现在是否仍然适用?
    【解决方案2】:

    我对音频 API 了解不多,但是,您应该将 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 UnsafePointer' 替换为 '&self'。但是“self”必须是可以转换为兼容数据类型的东西。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      相关资源
      最近更新 更多