(iPhone) Live FFT desde el iPod

Ok chicos, he leído muchas cosas sobre el material FFT, pero parece ser un poco más complicado que build un tableView.

Estoy buscando una manera de analizar el audio de reproducción (desde la biblioteca de iPod) en tres ranges (bajo, medio y alto). Creo que FFT está haciendo el trabajo, pero no estoy seguro si podría filtrar (Lowpass, Bandpass y Highpass) el audio de reproducción y analizar los picos también. Entonces, si alguien sabe cuál es el mejor (mejor, quiero decir, la manera más rápida (CPU) de hacerlo, ayúdeme. No habrá front-end, así que no dibujaré el FFT en una window (supongo que el dibujar se come mucho de la CPU).

Entonces no tengo idea de cómo podría analizar el audio. Todos los códigos de muestra de FFT que encontré están usando el micrófono. No quiero usar el micrófono. Vi algo obteniendo el file de audio y exportándolo a un file sin comprimir, pero necesito un análisis en vivo. He echado un vistazo a aurioTouch2, pero no entiendo cómo podría cambiar la input del micrófono a la biblioteca del iPod. Creo que la parte que estoy buscando está aquí:

// Initialize our remote i/o unit inputProc.inputProc = PerformThru; inputProc.inputProcRefCon = self; CFURLRef url = NULL; try { url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFStringRef([[NSBundle mainBundle] pathForResource:@"button_press" ofType:@"caf"]), kCFURLPOSIXPathStyle, false); XThrowIfError(AudioServicesCreateSystemSoundID(url, &buttonPressSound), "couldn't create button tap alert sound"); CFRelease(url); // Initialize and configure the audio session XThrowIfError(AudioSessionInitialize(NULL, NULL, rioInterruptionListener, self), "couldn't initialize audio session"); UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord; XThrowIfError(AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory), "couldn't set audio category"); XThrowIfError(AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, propListener, self), "couldn't set property listener"); Float32 prefernetworkingBufferSize = .005; XThrowIfError(AudioSessionSetProperty(kAudioSessionProperty_PrefernetworkingHardwareIOBufferDuration, sizeof(prefernetworkingBufferSize), &prefernetworkingBufferSize), "couldn't set i/o buffer duration"); UInt32 size = sizeof(hwSampleRate); XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate, &size, &hwSampleRate), "couldn't get hw sample rate"); XThrowIfError(AudioSessionSetActive(true), "couldn't set audio session active\n"); XThrowIfError(SetupRemoteIO(rioUnit, inputProc, thruFormat), "couldn't setup remote i/o unit"); unitHasBeenCreated = true; drawFormat.SetAUCanonical(2, false); drawFormat.mSampleRate = 44100; (...) 

Pero soy bastante nuevo en todas estas AudioUnits, así que no puedo entender dónde se carga una input. Entonces, el código mencionado anteriormente usa AVAudioSession. Me dijo un pajarito, esto será desechado, entonces ¿cuál es la alternativa?

Así que básicamente:

  1. ¿Cómo puedo get el audio que se está reproduciendo actualmente para realizar un análisis? ¿Puedo usar un MPMusicPlayerController y get las muestras? ¿O tengo que build una AudioUnit completa que reproduzca en la Biblioteca?

  2. ¿Cuál es la manera más rápida (CPU) de analizar bajos, medios y altos? ¿Filtración? ¿FFT? ¿Algo más?

  3. ¿Tendré problemas con los derechos de autor de la música comprada? Porque intenté convertir el file de reproducción a PCA Samples y, a veces, tengo este error:

    VTM_AViPodReader [7666: 307] * Terminar la aplicación debido a una exception no detectada 'NSInvalidArgumentException', motivo: '* – [AVAssetReader initWithAsset: error:] parámetro no válido no satisfactorio: asset! = ((Void *) 0)'

  4. ¿Cuál es la forma "nueva" de hacer un FFT si todo el material de AVAudioSession no funcionará en el futuro?

No puede get el audio que se está reproduciendo actualmente (el sandbox de security lo impide) en iOS, a less que su aplicación sea la que reproduce el audio usando ciertas API selectas (Audio Queue, RemoteIO, etc.)

3 filters de paso de banda (fabricados con biquads IIR) serán más rápidos que un FFT. Pero incluso un FFT completo utilizará un porcentaje muy pequeño de time de CPU.

Una aplicación no puede convertir ni reproducir música protegida de la biblioteca de iTunes en una forma en que se puedan capturar muestras.

El FFT está en el marco de Accelerate, no en la session de audio.