Быстрые функции обратного вызова
Я пытаюсь использовать 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 функции и блоки обрабатываются практически одинаково, с единым понятием замыканий. Я предлагаю вам прочитать (вместе с остальной документацией), чтобы понять синтаксис и семантику закрытия.