在Swift 2中创建MTAudioProcessingTapCallbacks

时间:2015-10-17 00:15:00

标签: ios objective-c swift swift2 mediatoolbox

我使用Swift 2试图从MTAudioProcessingTapCallbacks库中创建MediaToolbox几个小时,一直在墙上敲我的头。我找到了this great article Objective-C中的一个实现,所以我想我会尝试在Swift中重新编写它,这样我就能更好地理解它,但是现在证明它有点超出我的范围。

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

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

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

var streamer = MTAudioProcessingTapGetStorage(tap) as! RMStreamer

我收到警告说:

  

从UnsafeMutablePointer投射(又名&#39; UnsafeMutablePointer&lt;()&gt;到不相关的类型RMStreamer总是失败)&#34;

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

1 个答案:

答案 0 :(得分:2)

好吧,我最终想出了如何获得这个难题编译的小部分(我还没有在运行时测试它),使用:

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

我从https://stackoverflow.com/a/30788165/73237

发现了这一切

UPDATE 为了使这更容易使用,编写了以下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))