2010-06-25 11 views
5

He estado jugando con la demostración aurioTouch de Apple, que es un código de muestra para su tutorial de unidad de audio. Esta aplicación permite entradas/salidas simultáneas desde el micrófono. al hablante. También renderiza una estereografía del sonido ingresado desde el micrófono.iOS: unidad de audio RemoteIO Manipulación de AudioBuffer (es decir, efectos de sonido del micrófono)

En un nivel muy alto de este proceso de bajo nivel, el código de muestra define un AudioComponent (en este caso RemoteIO que permite la entrada/salida simultánea) y hay una devolución de llamada para esta Audio Unit. En la devolución de llamada, realizan algunos filtros de audio (un filtro de rechazo de CC) y la visualización de la estereografía basada en los datos de sonido de AudioBuffer del micrófono.

Mi objetivo final es crear mi propia unidad de audio con distorsión de sonido personalizada basada en la entrada del micrófono. Creo que la forma correcta de hacerlo en base al tutorial de la unidad de audio es crear una segunda unidad de audio y conectarlas con un gráfico de procesamiento de audio. Sin embargo, he leído que iOS no le permite registrar sus propias unidades de audio personalizadas. Mis preguntas son:

  1. ¿Puedo hacer la manipulación directa en el AudioBufferList que tengo acceso a la devolución de llamada render de la Unidad de remoteIO Audio (puesto que ya parecen estar haciendo esto y aplicando un filtro de audio en él) y crear mi propia distorsión de sonido personalizada allí?
  2. He intentado asignar los datos de AudioBufferList a una constante (un valor que he visto contener de una ejecución de muestra y registro de la Lista de AudioBuffer), pero parece que no hace nada.

Respuesta

4

La respuesta a su primera pregunta es sí. Por lo general, así se hace.

Creo que debe manipular los datos en el puntero directamente, en lugar de reasignarlos. Es posible que desee ver el código en openframeworks que maneja la asignación de búferes y pasarlos a una devolución de llamada: https://github.com/openframeworks/openFrameworks/blob/master/addons/ofxiPhone/src/sound/ofxiPhoneSoundStream.mm

Hay otro código que puede ver, nick collins tiene una aplicación básica para desactivar el sonido el micrófono y el altavoz, whist procesando en medio: http://www.cogs.susx.ac.uk/users/nc81/code.html. También tiene un código allí que obtiene almacenamientos intermedios de muestra de una pista de iPod que puede ser útil para usted.

+1

Cualquiera que esté buscando el enlace github, ese código ahora se ha movido a: https://github.com/openframeworks/openFrameworks/blob/master/addons/ofxiPhone/src/sound/ofxiPhoneSoundStream.mm –

1

Es cierto que no puede agregar sus propias AudioUnits personalizadas al iPhone.

La forma en que funciona así: El altavoz impulsa la cadena de datos a través del sistema. Agrega una devolución de llamada de renderizado a la ioUnit, como ya lo hizo.

La devolución de llamada se ejecuta siempre que el parlante (bus n. ° 0) esté hambriento y es su trabajo completar tantas muestras como haya solicitado, en el búfer que el parlante haya proporcionado. El tamaño del búfer provisto será una potencia de dos que esté lo más cerca posible de la Duración del búfer de E/S preferida que especificó al configurar la AudioSesión.

La forma más sencilla de hacerlo es tomar la AudioBufferList que se le dio y pasarla a AudioUnitRender en el micrófono (bus n. ° 1). Después de llenar el búfer con Render(), pero antes de que regrese la devolución de llamada, puede manipular los datos de la forma que desee. Por ejemplo, AurioTouch lo pone a cero para silenciarlo.

Lo importante que debe recordar es que el parlante leerá del búfer de datos real que le pasó. No va a mirar el descriptor AudioBufferList y comprobar si apuntó a otro buffer de datos. Si comienza a cambiar la lista de AudioBuffer que recibió, se encontrará con problemas. En el mejor de los casos, serás ignorado.En el peor, se encontrará con problemas de administración de memoria.

Si no desea verse obligado a trabajar en el búfer ioData, puede usar su propia AudioBufferList, asignada de la forma que desee, en cualquier tamaño, y pedirle al micrófono que la haga en Render(). Luego puede hacer toda la manipulación que desee, siempre y cuando al final copie los resultados en el búfer proporcionado por la devolución de llamada (es decir, ioData-> mBuffers [0] .mData tal como era en el momento en que se invocó la devolución de llamada).

Cuestiones relacionadas