Я пошел по этому пути в 2009 году, пробуя Audio Toolkit, Audio Queue Services, openAL и, наконец, остановился на RemoteIO AudioUnit.
Audio Toolbox отлично подходит для базовых триггерных звуковых эффектов, но не смог изменить частоты или циклические сэмплы.
Службы Audio Queue Services могут зацикливать сэмплы, но единственный способ найти частоту воспроизведения сэмпла - это перечитать данные из файла - очень больно. Кроме того, фреймворк чрезвычайно громоздок - я бы использовал его, только если бы пытался что-то транслировать из Интернета.
OpenAL был находкой - он был готов к работе менее чем через час, после того как я взял в руки пример приложения для iPhone «CrashLanding», которое больше недоступно от Apple. Я обнаружил, что OpenAL идеально подходит для игр или даже музыкальных инструментов - сэмплы можно было предварительно загружать, регулировать частоту было легко, и зацикливание не было проблемой. Для меня заключалась сделка, заключающаяся в том, что запуск и остановка петлевого семпла почти каждый раз приводили бы к неприятному «поп» Кроме того, встроенный трехмерный позиционный аудиомикшер был слишком загружен процессором, на мой взгляд.
Если ваш инструмент не использует циклические сэмплы, я бы предложил сначала попробовать маршрут OpenAL - кривая обучения гораздо менее пугающая. Попробуйте отследить "SoundEngine.h", "CrashLanding" или "TouchFighter" или проверить следующую ссылку:
http://benbritten.com/blog/2008/11/06/openal-sound-on-the-iphone/
Поскольку зацикленные сэмплы были для меня требованием, я, наконец, остановился на AudioUnits (который на iPhone называется «RemoteIO», если вы хотите сделать ввод или вывод). Это было чрезвычайно сложно реализовать - очень похоже на Audio Queue Services, так как ядро вашей реализации будет внутри «буфера обратного вызова», вызываемого несколько раз в секунду для заполнения буфера исходящего звука необработанными значениями SInt16.
В конечном счете, мой инструмент прекрасно работал с многотоновой полифонией, зацикленными сэмплами, отсутствием хлопаний и минимальной задержкой.
К сожалению, RemoteIO плохо документирован. Майкл Тайсон был одним из первых, кто подробно писал о RemoteIO, и его посты (и комментарии) были очень полезны для меня:
http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/
Удачи!
Отредактировано несколько лет спустя: я открыл исходный код RemoteIO / AudioUnits, на который я ссылался выше: https://github.com/glenn-barnett/hexaphone/blob/master/Classes/Instrument.m - извиняюсь за беспорядок, я надеюсь, что у меня будет время, чтобы почистить код и комментарии. 1029 *