iOS: Аудиоустройство RemoteIO Работа с AudioBuffer (то есть звуковые эффекты от микрофона) - PullRequest
5 голосов
/ 25 июня 2010

Я поигрался с демонстрацией Apple aurioTouch, которая является примером кода для их учебного пособия по Audio Unit.Это приложение позволяет одновременный ввод / вывод с микрофона.к оратору.Он также воспроизводит стереограмму введенного звука с микрофона.

На самом высоком уровне этого низкоуровневого процесса пример кода определяет AudioComponent (в данном случае RemoteIO, который допускает одновременный ввод / вывод), и для этого аудиоустройства существует обратный вызов рендеринга.При обратном вызове они выполняют некоторую фильтрацию звука (фильтр подавления постоянного тока) и визуализацию стереограммы на основе звуковых данных AudioBuffer с микрофона.

Моя конечная цель - создать свой собственный аудиоустройство искажения звука на основе входного сигнала от микрофона.Я думаю, что правильный способ сделать это на основе учебного пособия по аудиоустройству - создать второй аудиоустройство и связать его с графиком обработки аудио.Тем не менее, я читал, что iOS не позволяет вам регистрировать свои собственные аудиоустройства.Мои вопросы:

  1. Могу ли я выполнить прямые манипуляции с AudioBufferList, к которому у меня есть доступ, в обратном вызове рендеринга с удаленного аудиоустройства (так как они, кажется, уже делают это и применяют аудио фильтрэто) и создать мое собственное пользовательское искажение звука там?
  2. Я пытался присвоить данные AudioBufferList константе (значение, которое, как я видел, было сохранено во время пробного запуска и регистрации AudioBufferList), но этокажется, ничего не делает.

Ответы [ 2 ]

4 голосов
/ 11 февраля 2011

Ответ на ваш первый вопрос - да.Обычно это так.

Я считаю, что вам нужно напрямую манипулировать данными в указателе, а не переназначать их.Возможно, вы захотите взглянуть на код в openframeworks, который обрабатывает назначение буферов и передачу их обратному вызову: https://github.com/openframeworks/openFrameworks/blob/master/addons/ofxiPhone/src/sound/ofxiPhoneSoundStream.mm

Есть другой код, который вы можете посмотреть, у Ника Коллинза есть основное приложениедля получения звука из микрофона и из динамика, обработка виста между: http://www.cogs.susx.ac.uk/users/nc81/code.html. У него также есть код, который извлекает буферы семплов из дорожки iPod, которые могут быть вам полезны.

1 голос
/ 02 марта 2011

Это правда, что вы не можете добавить свои собственные AudioUnits для iPhone.

Как это работает, вот так: динамик управляет цепочкой данных через систему.Вы добавляете обратный вызов рендеринга в ioUnit, как вы уже сделали.

Обратный вызов запускается всякий раз, когда динамик (шина # 0) голоден, и ваша задача заполнить столько семплов, сколько он запросил,в буфере, который предоставил докладчик.Размер предоставленного буфера будет степенью двойки, максимально приближенной к предпочитаемой длительности буфера ввода-вывода, указанной вами при настройке AudioSession.

Самый простой способ сделать это - взять список AudioBufferList, который вы использовалиотдайте его и передайте AudioUnitRender на микрофон (шина №1).После заполнения буфера с помощью Render (), но до возврата обратного вызова вы можете манипулировать данными любым удобным для вас способом.Например, AurioTouch обнуляет его, чтобы отключить его.

Важно помнить, что говорящий будет считывать данные из фактического буфера данных, который он вам передал.Он не собирается смотреть на дескриптор AudioBufferList и проверять, указали ли вы на другой буфер данных.Если вы начнете изменять список AudioBufferList, который вам дали, у вас возникнут проблемы.В лучшем случае вас будут игнорировать.В худшем случае вы столкнетесь с проблемами управления памятью.

Если вы не хотите ограничиваться работой только в буфере ioData, тогда вы можете использовать свой собственный AudioBufferList, выделенный любым удобным вам способом в любомразмер, и попросите микрофон Render () в это.Затем вы можете делать все, что вам нравится, до тех пор, пока в конце вы не скопируете результаты в буфер, предоставленный обратным вызовом (т.е. ioData-> mBuffers [0] .mData, как это было во время вызова обратного вызова).

...