Мое приложение (закодированное в Swift) выполняет обработку в реальном времени на основе аудиосигналов.
Мне нужно получить функцию с левым и правым буферами на входе (2 канала от USB-микрофона) и одну функцию с буферами на выходе (тоже 2 канала).
Раньше я использовал EZAudio, но у меня проблемы с памятью с 2-канальным форматом 96K. А так как EZAudio остановился, то хотелось бы перейти либо на Superpowered, либо на Audiokit.
Моя проблема: я не могу получить ни в одной из этих библиотек функции с буферами.
Superpowered: я добавил #import «SuperpoweredIOSAudioIO.h» в заголовок моста.
Я добавил SuperpoweredIOSAudioIODelegate в свой ViewController. Это автоматически добавило функции прерывания, разрешения и mapchannels, но не audioProcessingCallback.
Я пробовал следующие вещи:
audio = SuperpoweredIOSAudioIO(delegate: self, preferredBufferSize: 12, preferredMinimumSamplerate: 96000, audioSessionCategory: AVAudioSessionCategoryPlayAndRecord, channels: 2, audioProcessingCallback: audioProcessingCallback, clientdata: UnsafeMutablePointer)
audio.start()
а также
func audioProcessingCallback(buffers: UnsafeMutablePointer<UnsafeMutablePointer<Float>>, inputChannels: UInt32, outputChannels: UInt32, numberOfSamples: UInt32, sampleRate: UInt32, hostTime: UInt64) -> Bool {
return true
}
Но я получаю сообщение об ошибке:
Невозможно преобразовать значение типа '(UnsafeMutablePointer>, UInt32, UInt32, UInt32, UInt32, UInt64) -> Bool' в ожидаемый тип аргумента 'audioProcessingCallback!' (иначе 'ImplicitlyUnwrappedOptional‹@convention(c) (Необязательный, Необязательный>>>, UInt32, UInt32, UInt32, UInt32, UInt64) -> Bool>')
Я не смог найти примеров этой библиотеки со Swift...
Вот что я сделал с AudioKit:
let mic = AKMicrophone()
installTap(mic)
AudioKit.output = mic
AudioKit.start()
func installTap(_ input:AKNode) {
input.avAudioNode.installTap(onBus: 0, bufferSize: 1024, format: AudioKit.format) { [weak self] (buffer, time) -> Void in
self?.signalTracker(didReceivedBuffer: buffer, atTime: time)
}
}
func signalTracker(didReceivedBuffer buffer: AVAudioPCMBuffer, atTime time: AVAudioTime){
let samples = UnsafeBufferPointer(start: buffer.floatChannelData?[0], count:1024)
audioProcess.ProcessDataCaptureWithBuffer(samples, numberOfSamples: UInt32(1024))
}
Он может получить поступающие буферы в моем алгоритме, но, похоже, не в «реальном времени», я имею в виду, очень медленно.. (извините, трудно объяснить.)
Спасибо!