У меня есть установка EZAudio в быстрой вычислении fft микрофонного входа в реальном времени, а затем я запускаю специальный алгоритм по данным fft.отделить вычисление fft от контроллера вида
Моя проблема в том, что я могу получить доступ к данным БПФ, когда я положил это в контроллере представления, с dispatch_async (см. Код последней FUNC)
class MasterKey:NSObject,EZMicrophoneDelegate, EZAudioFFTDelegate{
var microphone: EZMicrophone!
var fft: EZAudioFFTRolling!
var tone:String = ""
var sampleRate:Float = 0.0
var fftWindowSize:vDSP_Length = 8192
var keys:MKHRangeToKey!
init(tone:String){
super.init()
self.tone = tone
/*
* setup all dependencys for the fft analysis
*/
//setup audio session
let session = AVAudioSession.sharedInstance()
do{
try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
try session.setActive(true)
}catch{
print("Audio Session setup Fails")
}
//create a mic instance
microphone = EZMicrophone(delegate: self, startsImmediately: true)
self.sampleRate = Float(microphone.audioStreamBasicDescription().mSampleRate)
//create a fft instace
fft = EZAudioFFTRolling(windowSize: fftWindowSize, sampleRate: sampleRate, delegate: self)
//start the mic
microphone.startFetchingAudio()
self.keys = MKHRangeToKey(tone: tone, sampleRate: sampleRate, fftWindowSize: Int(fftWindowSize))
}
//get the mic data
func microphone(microphone: EZMicrophone!, hasAudioReceived buffer: UnsafeMutablePointer<UnsafeMutablePointer<Float>>, withBufferSize bufferSize: UInt32, withNumberOfChannels numberOfChannels: UInt32) {
//calc the fft
if fft != nil{
fft.computeFFTWithBuffer(buffer[0], withBufferSize: bufferSize)
}
}
//get the fft data from last calculstion
func fft(fft: EZAudioFFT!, updatedWithFFTData fftData: UnsafeMutablePointer<Float>, bufferSize: vDSP_Length){
dispatch_async(dispatch_get_main_queue(), {
print(fftData)
})
}
}
Но как я могу сделать это в отдельном классе назовите это, когда мне нужно?
челобитной мольбы Помощь
Спасибо за ответ, моя проблема в том, что func fft() не имеет никакого возврата для этого. это метод от EZAudio. Я не знаю, как я могу это сделать? EZAudio написана в Obj-c, я не знаком с ней. – Aron
Я не знаю, что вы имеете в виду. Вы попробовали мое предложение? Переместите функции (ы), которые вы хотите отделить от вашего cobtroller, в отдельный файл Swift (с тем, что включает в себя его компиляцию). Вы сможете позвонить им из своего контроллера. Независимо от того, возвращает ли функция что-либо, это не имеет никакого отношения. Попробуйте мое предложение, и мы пойдем оттуда, если у вас возникнут проблемы. –
ok теперь у меня есть отдельный код, и я могу получить к нему доступ, хм, спасибо - у меня была блокада на данный момент. Теперь моя проблема, как я могу получить данные от отправки async за пределами этого файла? это мое первое аудио-приложение в реальном времени, извините за вопросы noob. – Aron