2016-01-12 1 views
0

У меня есть установка 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) 


    }) 
} 
} 

Но как я могу сделать это в отдельном классе назовите это, когда мне нужно?

челобитной мольбы Помощь

ответ

0

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

Важное примечание. Функция не должна принадлежать классу.

+0

Спасибо за ответ, моя проблема в том, что func fft() не имеет никакого возврата для этого. это метод от EZAudio. Я не знаю, как я могу это сделать? EZAudio написана в Obj-c, я не знаком с ней. – Aron

+0

Я не знаю, что вы имеете в виду. Вы попробовали мое предложение? Переместите функции (ы), которые вы хотите отделить от вашего cobtroller, в отдельный файл Swift (с тем, что включает в себя его компиляцию). Вы сможете позвонить им из своего контроллера. Независимо от того, возвращает ли функция что-либо, это не имеет никакого отношения. Попробуйте мое предложение, и мы пойдем оттуда, если у вас возникнут проблемы. –

+0

ok теперь у меня есть отдельный код, и я могу получить к нему доступ, хм, спасибо - у меня была блокада на данный момент. Теперь моя проблема, как я могу получить данные от отправки async за пределами этого файла? это мое первое аудио-приложение в реальном времени, извините за вопросы noob. – Aron