Это правда, что вы не можете добавить свои собственные AudioUnits для iPhone.
Как это работает, вот так: динамик управляет цепочкой данных через систему.Вы добавляете обратный вызов рендеринга в ioUnit, как вы уже сделали.
Обратный вызов запускается всякий раз, когда динамик (шина # 0) голоден, и ваша задача заполнить столько семплов, сколько он запросил,в буфере, который предоставил докладчик.Размер предоставленного буфера будет степенью двойки, максимально приближенной к предпочитаемой длительности буфера ввода-вывода, указанной вами при настройке AudioSession.
Самый простой способ сделать это - взять список AudioBufferList, который вы использовалиотдайте его и передайте AudioUnitRender на микрофон (шина №1).После заполнения буфера с помощью Render (), но до возврата обратного вызова вы можете манипулировать данными любым удобным для вас способом.Например, AurioTouch обнуляет его, чтобы отключить его.
Важно помнить, что говорящий будет считывать данные из фактического буфера данных, который он вам передал.Он не собирается смотреть на дескриптор AudioBufferList и проверять, указали ли вы на другой буфер данных.Если вы начнете изменять список AudioBufferList, который вам дали, у вас возникнут проблемы.В лучшем случае вас будут игнорировать.В худшем случае вы столкнетесь с проблемами управления памятью.
Если вы не хотите ограничиваться работой только в буфере ioData, тогда вы можете использовать свой собственный AudioBufferList, выделенный любым удобным вам способом в любомразмер, и попросите микрофон Render () в это.Затем вы можете делать все, что вам нравится, до тех пор, пока в конце вы не скопируете результаты в буфер, предоставленный обратным вызовом (т.е. ioData-> mBuffers [0] .mData, как это было во время вызова обратного вызова).