2015-10-17 2 views
2

Я стучал головой о стену в течение нескольких часов, пытаясь создать MTAudioProcessingTapCallbacks из MediaToolbox библиотеки, с помощью Swift 2. я нашел this great article с реализацией в Objective-C, так что я думал Я бы попытался переписать его в Swift, чтобы я мог лучше понять его, но это пока что немного опережает меня.Создать MTAudioProcessingTapCallbacks в Swift 2

Основная проблема заключается в том, что я не могу найти способ бросить возвращаемое значение 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 в будущем?

+0

Эй, Сэм! Как вам удалось создать фактические ответные обратные вызовы? Я застрял в этой точке ... например, 'var callbacks: MTAudioProcessingTapCallbacks ... callbacks.prepare = ???' –

ответ

1

Ну, я в конце концов понял, как получить этот маленький кусочек головоломки составителя (я до сих пор не проверял во время выполнения), используя:

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

Все это я узнал от от https://stackoverflow.com/a/30788165/73237

UPDATE чтобы сделать это немного проще в использовании, написал следующее быстрый класс, имитируя 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)) 

 Смежные вопросы

  • Нет связанных вопросов^_^