【问题标题】:Create MTAudioProcessingTapCallbacks in Swift 2在 Swift 2 中创建 MTAudioProcessingTapCallbacks
【发布时间】:2015-10-17 00:14:59
【问题描述】:

我花了好几个小时试图从MediaToolbox库中创建一个MTAudioProcessingTapCallbacks,使用Swift 2。我发现this great article在Objective-C中实现, 所以我想我会尝试用 Swift 重写它,以便我能更好地理解它,但目前这证明有点超出我的能力。

主要问题是我找不到将MTAudioProcessingTapGetStorage(tap)(即UnsafeMutablePointer<Void>)的返回值转换为RMStreamer的方法,这似乎是原始实现的一个特性:

RMStreamer *streamer = (__bridge RMStreamer *) MTAudioProcessingTapGetStorage(tap);

如果我以最明显的方式尝试:

var streamer = MTAudioProcessingTapGetStorage(tap) as! RMStreamer

我收到一条警告:

从 UnsafeMutablePointer(又名 'UnsafeMutablePointer 转换为不相关的类型 RMStreamer 总是失败)"

所以,我发现__bridge 在某种程度上等同于takeUnretainedValue(),但在这种情况下,该方法似乎在任何地方都不可用。我怀疑我相当无知,但是有谁知道是否有可能在 Swift 2 中实现这种东西,还是我最好只学习 Objective-C 并将其用于 MediaToolbox 的东西?

【问题讨论】:

  • 嘿山姆!您是如何设法创建实际的点击回调的?我被困在这一点上......例如var callbacks: MTAudioProcessingTapCallbacks ... callbacks.prepare = ???

标签: ios objective-c swift swift2 mediatoolbox


【解决方案1】:

好吧,我最终想出了如何编译这个小块拼图(我还没有在运行时测试它),使用:

let streamer = Unmanaged<RMStreamer>.fromOpaque(COpaquePointer(MTAudioProcessingTapGetStorage(tap))).takeUnretainedValue()

我从 https://stackoverflow.com/a/30788165/73237 发现的所有内容

更新为了使它更易于使用,编写了以下 swift 类,模仿 obj-c 命名法..

class __bridge<T:AnyObject> {
    class func from(p: UnsafeMutablePointer<()>) -> T {
        return Unmanaged<T>.fromOpaque(COpaquePointer(p)).takeUnretainedValue()
    }
}

可以这样调用,例如:

let streamer = __bridge<RMStreamer>.from(MTAudioProcessingTapGetStorage(tap))

【讨论】:

    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多