ios - 在 Swift 2 中创建 MTAudioProcessingTapCallbacks

标签 ios objective-c swift swift2 mediatoolbox

我已经用头撞墙好几个小时了,试图创建一个 MTAudioProcessingTapCallbacks来自MediaToolbox库,使用 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

我收到一条警告:

Cast from UnsafeMutablePointer (aka 'UnsafeMutablePointer<()> to unrelated type RMStreamer always fails)"

所以,我发现 __bridge在某种程度上相当于 takeUnretainedValue()但这种方法似乎在这种情况下不可用。我怀疑我很无知,但是有谁知道是否可以在 Swift 2 中实现这种事情,或者我最好只是学习 Objective-C 并将其用于 MediaToolbox future 的事情?

最佳答案

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

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))

关于ios - 在 Swift 2 中创建 MTAudioProcessingTapCallbacks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33181310/

相关文章:

objective-c - 使用 Objective-C 函数设置整数

ios - 如何截取 pickerViewController 和 UIView 的屏幕截图?

objective-c - 如何在 Apple Swift 中编写应用程序以在 OS X 10.6 等早期 OS X 版本以及最新版本上运行?

ios - iOS:NSProxy无法 Hook 在类本身内部调用的方法

ios - TableView 滚动底层顶栏

ios - iOS 推送通知可以添加多少个操作?

php - 需要帮助从 PHP 的混合源在 Swift 中准备 JSON

ios - NSAttributedString - 获取字体属性

ios - Q :get a view's constrains returns empty array

ios - UIView跟随手指向上滑动类似于iOS中的Control Center