Как определить, какая входная шина активна, когда вызывается AUEffectBase :: Render? - PullRequest
3 голосов
/ 17 ноября 2009

Это явно вопрос n00b, поскольку он успешно реализован в приложениях. Но сейчас 2009 год, и мне до сих пор неясно, как работают шины ввода / вывода с AUBase.

Я напишу формулировку моего вопроса из сообщения в список рассылки coreaudio-api . Этот вопрос всплывает в другие времена без ответа до 2005 года.

Я просто просматривал код AUBase снова, и мне было трудно увидеть, как AUBase::Render() должен работать в случае нескольких шин (потому что он не принимает аргумент номера шины) .. .

Вот краткий обзор порядка вызова метода:

  1. В реализации AUBase::DoRender() локальная переменная output установлена ​​в GetOutput(inBusNumber).

  2. Затем переменная output в конечном счете (после вызова выноски уведомления перед рендерингом) передается в AUBase::DoRenderBus().

  3. DoRenderBus() выполняет некоторую подготовку буфера на theOutput, который передается output (для данного номера шины), а затем вызывает RenderBus(). Выходной элемент не передается.

  4. Реализация по умолчанию RenderBus() вызывает NeedsToRender() и затем на Render(), без передачи номера шины или объекта выходного элемента.

Комментарий выше AUBase::RenderBus() в AUBase.h гласит:

Переопределите этот метод, если ваш AU обрабатывает несколько выходных шин совершенно независимо - вам нужно просто позвонить на Render без проверки NeedsToRender. В противном случае переопределите Render().

Для меня приведенный выше комментарий звучит так, как будто он говорит, что вы должны выполнить обработку в Render() даже , если поддерживает несколько шин.

Итак ... если кто-то выполняет свою обработку в Render(), как определить, с каким выходным элементом работать? Если вы также переопределите RenderBus(), вы можете сохранить аргумент inBusNumber где-нибудь для использования в Render(), но это просто ужасно.

1 Ответ

0 голосов
/ 08 апреля 2010

Как вы говорите, Render не принимает аргумент номера шины.

virtual OSStatus Render(AudioUnitRenderActionFlags & ioActionFlags,
                        const AudioTimeStamp & inTimeStamp,
                        UInt32 inNumberFrames);

Я считаю, что это означает, что он должен отображать выходные данные для всех выходных шин. Он также будет получать входные данные со всех входных шин.

Чтобы определить, какие входные шины существуют / подключены / активны (не уверен, какова терминология), вы можете позвонить HasInput.

Я пробовал только с одной выходной шиной и несколькими входными шинами.

...