Быстрые функции обратного вызова

Я пытаюсь использовать Amazing Audio Engine для записи звука с помощью Swift на OS X. Для этого мне нужно реализовать функцию обратного вызова, которая будет получать звук и что-то с ним делать. В документации есть несколько примеров того, как это сделать с помощью Objective-C:

@interface MyAudioReceiver : NSObject <AEAudioReceiver>
@end
@implementation MyAudioReceiver
static void receiverCallback(__unsafe_unretained MyAudioReceiver *THIS,
 __unsafe_unretained AEAudioController *audioController,
 void *source,
 const AudioTimeStamp *time,
 UInt32 frames,
 AudioBufferList *audio) {

 // Do something with 'audio'
}
-(AEAudioReceiverCallback)receiverCallback {
 return receiverCallback;
}
@end
...
id<AEAudioReceiver> receiver = [[MyAudioReceiver alloc] init];

или же

id<AEAudioReceiver> receiver = [AEBlockAudioReceiver audioReceiverWithBlock:
 ^(void *source,
 const AudioTimeStamp *time,
 UInt32 frames,
 AudioBufferList *audio) {
 // Do something with 'audio'
}];

Это насколько я получил:

var audioController: AEAudioController? = nil
audioController = AEAudioController(audioDescription: AEAudioStreamBasicDescriptionInterleaved16BitStereo, inputEnabled: true)
do {
    try audioController?.start()
} catch {
    NSLog("An error happened while starting AEAudioController.")
}

let receiver = MyAudioReceiver();
audioController?.addInputReceiver(receiver)

class MyAudioReceiver : NSObject, AEAudioReceiver {
    var receiverCallback: AEAudioReceiverCallback! {
        // what do I do here?
    }
}

Теперь я получаю ошибку в receiverCallback имущество. Я на правильном пути или мой подход совершенно неверный?

Я не могу понять, как сделать то же самое в Swift. Как бы я это сделал?

2 ответа

Вот пример из моего работающего проекта Taae Swift

var receiverCallback: AEAudioReceiverCallback! {
    return  { (receiver:AnyObject?, audioController:AEAudioController?, source:UnsafeMutablePointer<Void>, time:UnsafePointer<AudioTimeStamp>, frames:UInt32, audio:UnsafeMutablePointer<AudioBufferList>) -> Void in
        //do some thing with audio data here
    }
}

В Swift функции и блоки обрабатываются практически одинаково, с единым понятием замыканий. Я предлагаю вам прочитать (вместе с остальной документацией), чтобы понять синтаксис и семантику закрытия.

Другие вопросы по тегам