Расширение аудио хоста AUv3 и подключение к дереву параметров - PullRequest
0 голосов
/ 25 января 2020

Я начинаю писать аудио расширение AUv3 и следую шаблону в Xcode 11.3, который проделал всю тяжелую работу. Расширение хорошо работает при загрузке на другие хосты! Теперь я хочу использовать свое собственное расширение в своем приложении и просто воспроизвести аудиофайл, но у меня возникли проблемы, и я несколько дней (и ночей) рвал на себе доступ к параметрам.

Я использую AVplayer и AVengine и создаю экземпляр AudioUnitExtension следующим образом:

    // instantiate AudioUnit as AVAudioUnit
[AVAudioUnit instantiateWithComponentDescription:audioDescription options:1 completionHandler:^(AVAudioUnit * audioUnit, NSError *error) { ... do more stuff here}];

К моему удивлению, метод createAudioUnitWithComponentDescription в моем расширении не вызывается ?! Но когда я подключаю его к AVengine:

[self->_engine attachNode:self->_AV_AudioUnit];

Звук проходит, и эффект применяется, но в AVAudioUnit нет дерева параметров, поэтому я не могу изменить какие-либо параметры обработки. Похоже, что AVAudioUnit! = AUAudioUnit и не имеет дерева параметров. Но AVengine позволяет работать только с AVAudioUnits!

Я просмотрел пример Apple и веб, но не смог найти ничего полезного ... было бы здорово, если бы кто-то мог указать мне направление, как это настроить!

1 Ответ

0 голосов
/ 01 февраля 2020

Мне потребовалось несколько долгих ночей, чтобы найти причину: audioUnit не может быть динамически загружен в одно и то же приложение, поэтому отладчик не останавливается на точках останова внутри расширения AU-Unit.

Чтобы получить контроллер представления, я сначала создал экземпляр AV-AudioUnit, а затем использовал оболочку для получения AU-AudioUnit

WWDC2015 Этот AV Audio Эффект модуля, в свою очередь, обнажил базовый аудиоустройство AU, которое является первым классом API аудиоустройства версии 3.

Это делается здесь:

        // wrapper - to get the AU-unit from AV-Unit
    self->_AU_AudioUnit = audioUnit.AUAudioUnit;

Затем загрузка соответствующий ViewController

        // get the corresponding Viewcontroller
    [self->_AU_AudioUnit requestViewControllerWithCompletionHandler:^(AUViewControllerBase * _Nullable viewController) { ... do presenting in container view here }]

Надеюсь, это поможет кому-то не тратить так много времени, как я!

...