2010-12-22 7 views
5

Estoy diseñando una aplicación de visualizador de música para el iPhone.Creación de un iPhone Visualizador de música basado en Fourier Transform

Estaba pensando en hacer esto recogiendo datos a través del micrófono del iPhone, ejecutando una Transformada de Fourier en él y luego creando visualizaciones.

El mejor ejemplo que he podido obtener de esto es aurioTuch que produce un gráfico perfecto basado en datos FFT. Sin embargo, he estado luchando por comprender/replicar aurioTouch en mi propio proyecto.

No puedo entender dónde exactamente aurioTouch recoge los datos del micrófono antes de hacer la FFT?

También hay algún otro ejemplo de código que podría utilizar para hacer esto en mi proyecto? ¿O algún otro consejo?

+0

Lo siento por preguntar lo obvio, pero ¿trataste de seguir el programa paso a paso en modo de depuración? ¿Cuáles son las dificultades exactas que encontraste? –

+0

Sí, he seguido el código del programa. Tal vez yo sea grueso aquí, pero no puedo determinar exactamente dónde se obtienen los datos del micrófono. ¿Alguna idea sobre esto? – Dave

Respuesta

3

Como estoy planeando utilizar la entrada del micrófono, creo que su pregunta es una buena oportunidad para familiarizarse con un código de muestra relevante.

voy a rastrear los pasos de leer a través del código:

  1. empezando en SpectrumAnalysis.cpp (ya que es obvio que el audio tiene que llegar a esta clase de alguna manera), se puede ver que el método de la clase SpectrumAnalysisProcess tiene un segundo argumento de entrada const int32_t* inTimeSig --- suena un punto de partida prometedor, ya que la señal de tiempo de entrada es lo que estamos buscando.
  2. El uso de la opción del menú del botón derecho Find in project en este método, se puede ver que a excepción de lo obvio declaración definición &, este método se utiliza sólo dentro del método FFTBufferManager::ComputeFFT, donde se pone mAudioBuffer como su segundo argumento (el inTimeSig desde el paso 1). Buscando este miembro de datos de clase da más de 2 o 3 resultados, pero la mayoría de ellos son solo definiciones/memoria alloc etc. El resultado de búsqueda interesante es donde mAudioBuffer se usa como argumento para memcopy, dentro del método FFTBufferManager::GrabAudioData.
  3. De nuevo, utilizando la opción de búsqueda, vemos que FFTBufferManager::GrabAudioData se llama una sola vez, dentro de un método llamado PerformThru. Este método tiene un argumento de entrada llamado ioData (suena prometedor) del tipo AudioBufferList.
  4. Buscando PerformThru, vemos que se utiliza en la siguiente línea: inputProc.inputProc = PerformThru; - estamos casi allí :: parece que registra una función de devolución de llamada. Buscando el tipo de inputProc, de hecho vemos que es AURenderCallbackStruct - eso es todo. La devolución de llamada es llamada por el marco de audio, que es responsable de alimentarlo con muestras.

Usted probablemente tendrá que leer la documentación de AURenderCallbackStruct (o mejor, la Audio Unit Hosting) para obtener una comprensión más profunda, pero espero que esto le dio un buen punto de partida.

+0

Muchas gracias por la ayuda de Itamar. Sin embargo, me he encontrado con otro problema ahora en el que parece que no puedo grabar los datos del micrófono y reproducir música de la biblioteca del iPod al mismo tiempo. ¿Alguna idea sobre esto? – Dave

+0

Quizás estos enlaces sean útiles: http: // atastypixel.com/blog/using-remoteio-audio-unit/y http://cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html –

Cuestiones relacionadas