Вы действительно можете использовать обратные вызовы рендеринга, если хотите, но встроенные аудиоустройства великолепны (и есть вещи, которые я пока не могу сказать здесь, в NDA и т. Д., Я бы сказал слишком много, если выиметь доступ к iOS 5 SDK, я рекомендую вам посмотреть).
Вы можете реализовать желаемое поведение, не используя AUGraph
, однако рекомендуется делать это, так как во многом заботится ои экономит ваше время и усилия.
Использование AUGraph
Из Руководства по хостингу аудиоустройств (Библиотека разработчиков iOS) :
Тип AUGraph
повышает безопасность потоков в истории аудиоустройства: он позволяет перенастроить цепочку обработки на лету.Например, вы можете безопасно вставить эквалайзер или даже заменить другую функцию обратного вызова рендеринга для входа микшера во время воспроизведения звука.Фактически, тип AUGraph
обеспечивает единственный API в iOS для выполнения такого рода динамической реконфигурации в аудиоприложении.
Выбор шаблона проектирования (Библиотека разработчика iOS) подробно расскажем о том, как вы будете выбирать, как реализовать среду аудиоустройства.От настройки аудио сеанса, построения графиков и настройки / добавления модулей до написания обратных вызовов.
Что касается того, какие аудиоустройства вы хотите указать на графике, в дополнение к тому, что вы уже указали, вам понадобится многоканальный микшерный блок (см. Использование определенных аудиоустройств(iOS Developer Library) ) для микширования двух аудио входов, а затем подключите микшер к устройству Output .
Прямое подключение
В качестве альтернативы, если выМы должны были сделать это напрямую, без использования AUGraph, следующий код - пример для самостоятельного подключения аудиоустройств.(Из Создание приложений аудиоустройства (Библиотека разработчика iOS) )
Кроме того, вы можете устанавливать и разрывать соединения между аудиоустройствами напрямую, используя механизм свойств аудиоустройства.Для этого используйте функцию AudioUnitSetProperty
вместе со свойством kAudioUnitProperty_MakeConnection
, как показано в Listing 2-6 .Этот подход требует, чтобы вы определяли структуру AudioUnitConnection для каждого соединения в качестве значения его свойства.
/*Listing 2-6*/
AudioUnitElement mixerUnitOutputBus = 0;
AudioUnitElement ioUnitOutputElement = 0;
AudioUnitConnection mixerOutToIoUnitIn;
mixerOutToIoUnitIn.sourceAudioUnit = mixerUnitInstance;
mixerOutToIoUnitIn.sourceOutputNumber = mixerUnitOutputBus;
mixerOutToIoUnitIn.destInputNumber = ioUnitOutputElement;
AudioUnitSetProperty (
ioUnitInstance, // connection destination
kAudioUnitProperty_MakeConnection, // property key
kAudioUnitScope_Input, // destination scope
ioUnitOutputElement, // destination element
&mixerOutToIoUnitIn, // connection definition
sizeof (mixerOutToIoUnitIn)
);