Fui por este camino en 2009, probando Audio Toolkit, Audio Queue Services, openAL, y finalmente estableciéndome en la AudioUnit de RemoteIO.
Audio Toolbox está bien para los efectos de sonido disparados básicos, pero no fue capaz de cambiar las frecuencias o muestras de bucle.
Los servicios de cola de audio pueden reproducir muestras en bucle, pero la única forma que pude encontrar para ajustar la frecuencia de reproducción de una muestra fue volver a leer los datos del archivo, muy doloroso. Además, el marco es tremendamente engorroso: solo lo usaría si estuviera intentando transmitir algo desde Internet.
OpenAL fue un regalo del cielo - se puso en funcionamiento en menos de una hora, después de tener en mis manos la aplicación de muestra de iPhone "CrashLanding" ya no disponible desde Apple. Descubrí que OpenAL era ideal para juegos o incluso un instrumento musical: las muestras podían precargarse, el ajuste de la frecuencia era fácil y el bucle no era un problema. El factor decisivo para mí fue que iniciar y detener una muestra de en bucle daría como resultado un desagradable "pop" casi todo el tiempo. Además, el mezclador de audio posicional integrado en 3D era demasiado intensivo en la CPU para mi gusto.
Si su instrumento no utiliza muestras en bucle, le sugiero que pruebe la ruta OpenAL primero: la curva de aprendizaje es mucho menos intimidante. Tratar de localizar a "SoundEngine.h", "CrashLanding" o "TouchFighter", o visite el siguiente enlace:
http://benbritten.com/blog/2008/11/06/openal-sound-on-the-iphone/
Dado que las muestras en bucle fue un requisito para mí, finalmente se decidió por AudioUnits (que , en el iPhone, se conoce como "RemoteIO" si desea hacer entrada o salida). Fue tremendamente difícil de implementar, muy similar a Audio Queue Services, en el sentido de que el núcleo de su implementación estará dentro de una "devolución de llamada de buffer", siendo llamado varias veces por segundo para llenar un buffer de audio saliente con valores raw SInt16.
Al final, conseguí que mi instrumento funcionara perfectamente con polifonía de notas múltiples, muestras en bucle, sin saltos y latencia mínima.
Desafortunadamente, RemoteIO no está bien documentado.Michael Tyson fue uno de los primeros en el campo para escribir sobre RemoteIO extensamente, y sus puestos (y los comentarios) eran muy útil para mí:
http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/
Buena suerte!
Editado años después: He abierto el código de RemoteIO/AudioUnits que mencioné arriba: https://github.com/glenn-barnett/hexaphone/blob/master/Classes/Instrument.m - disculpas por el desastre, espero tener algo de tiempo para limpiar el código y los comentarios.
Gracias por el consejo. Estoy intentando OpenAL con el código de muestra de oalTouch en este momento, pero no puedo encontrar la configuración para cambiar el tono o la frecuencia sobre la marcha. ¡Cualquier consejo en la dirección correcta es muy apreciado! – Matthew
No importa. Descubrí cómo ajustar el tono. El código de muestra para oalTouch solo administra un archivo de sonido, así que supongo que necesito mirar a SoundManager después de todo. – Matthew
El código de Sound Engine funciona muy bien en iPhone OS 2.21 SDK pero no se puede compilar en 3.0 del SDK. ¿Alguna idea de si hay una nueva versión por ahí? – Matthew