Содержание
В этой статье мы увидим магию будем накладывать эффект Delay на звук. Сделано будет все на основе исходного кода прошлой статьи, дописывать будем именно туда.
Как я и говорил, с помощью Audio Unit мы можем накладывать эффекты на звук, мы рассмотрим это на примере графа с тремя вершинами: AudioFilePlayer, Delay, RemoteIO. Звук из плеера будет поступать на вход эффекта, а из эффекта будет идти на RemoteIO, который свою очередь отправит звук на динамики.
Как добавить юнит в граф
Интересующий нас юнит с эффектом имеет тип kAudioUnitType_Effect и подтип kAudioUnitSubType_Delay. Добавить вершину с таким юнитом в граф можно так:
AudioComponentDescription acd; acd.componentManufacturer = kAudioUnitManufacturer_Apple; acd.componentType = kAudioUnitType_Effect; acd.componentSubType = kAudioUnitSubType_Delay;AUGraph graph = ...; AUNode delayNode; CA(AUGraphAddNode(graph, &acd, &delayNode));
Так же, как и для других юнитов, мы можем получить сам юнит из вершины (обязательно после открытия графа!):
AUGraph graph = ...; AudioUnit delayUnit; CA(AUGraphNodeInfo(graph, delayNode, NULL, &delayUnit));
Теперь соединим вершины:
AUGraph graph = ...; AUNode playerNode = ...; AUNode delayNode = ...; AUNode rioNode = ...; CA(AUGraphConnectNodeInput(graph, playerNode, 0, delayNode, 0)); CA(AUGraphConnectNodeInput(graph, delayNode, 0, rioNode, 0));
Первым вызовом AUGraphConnectNodeInput мы подключаем выход плеера ко входу эффекта, а вторым вызовом AUGraphConnectNodeInput мы подключаем выход эффекта ко входу RemoteIO.
Параметры юнита Delay
Как было сказано в введении, у юнитов кроме свойств есть еще и параметры. Параметры влияют на то, что юнит делает со звуком. Итак, Delay имеет 4 параметра:
- kDelayParam_WetDryMix — влияет на то, сколько (по громкости) мы слышим оригинального звука и звука измененного эффектом. Диапазон от 0 до 100. Например, если значение 30, то мы слышим 70% громкости оригинального звука и 30% измененного. По-умолчанию значение равно 50.
- kDelayParam_DelayTime — длинна задержки звука в секундах. Диапазон от 0 до 2 секунд. По-умолчанию значение 1. В таком случае мы будем слышать повторяющийся звук через секунду.
- kDelayParam_Feedback — определяет насколько быстро будет затухать звук. Значения от -100 до 100. Чем больше значение (по моим наблюдениям, по модулю) тем медленнее будет затухать звук. Похоже, что на 100 совсем не затухает.
- kDelayParam_LopassCutoff — самый нераскрытый для меня параметр. Но, очевидно, это — фильтр, который пропускает все частоты ниже заданных. Диапазон от 10 до половины частоты дискретизации звука. По-умолчанию равен 15000 Hz.
Установим, например, длинну задержки звука:
AudioUnit delayUnit = ...; AudioUnitParameterValue value = 0.5; // длинна задержки - пол секунды CA(AudioUnitSetParameter(delayUnit, kDelayParam_DelayTime, kAudioUnitScope_Global, 0, value, 0));
Функция принимает сам юнит, параметр, scope для которого применяется, шина для которой применяется (первый ноль), значение параметра. Последний аргумент должен быть равен нулю.
Заключение
Как видим, добавить вершину с юнитом в граф — не такая уж и тяжелая задача. Исходный код проекта вы можете загрузить по этой ссылке. Код оснащен комментариями, чтобы было проще разобраться. Рекомендую обратить внимание на метод setupDelayUnit, изменить некоторые параметры и посмотреть как они влияют на звук.
- Audio Unit в iOS. Часть 1, введение
- Audio Unit в iOS. Часть 2, строим граф и проигрываем файлы
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: