[an error occurred while processing this directive]
|
Хорошо. Я не знал, что Вы не знаете, что такое "фреймворк".
Это программный код, который обеспечивает функционирование DSP-приложения и взаимодействие его компонентов. Например, в аудиообработке таковым считается код, выполняющий инициализацию аудиобуферов, последовательный пробег по всем реал-тайм функциям и вызов каждой из них, обработку микрокоманд. К микрокомандам относятся команды, поступающие извне (под "извне" может также подразумеваться "от других задач, работающих на данном процессоре, в случае наличия операционной системы) для изменения работы Soundset (аудио-проекта). Например, передать параметры в такой-то модуль (изменить настройки такого-то фильтра, переключить каналы, изменить громкость и проч.). Или добавить в Soundset новый модуль. Все перечисленные выше действия относятся к фреймворку.
Теперь примеры того, что можно (и, на мой взгляд, следует) писать на Си (Си++):
1) фреймворк;
2) Сервисные функции аудиомодулей, целью которых (функций) является изменение параметров модуля или режима его работы (что в общем-то также можно отнести к параметрам)
3) Функции инициализации аудиомодулей.
Более конкретный пример. Пусть мне надо написать аудиомодуль "Биквад", который представляет собой биквадратный фильтр.
Данный аудиомодуль будет, как-минимум, состоять из трех функций: Biquad_Init(...), Biquad_Service(...) и Biquad_Execute(...).
Первая функция выделяет память под параметры биквада, производит начальные установки значений переменных, которые либо не будут изменяться, либо являются значениями по умолчанию, ставит в соответствие аудиобуфер на вход и аудиобуфер на выход.
Вторая функция выполняет одно из перечисленных ниже действий.
1. Рассчитывает при необходимости коэффициенты фильтра, если входные параметры были заданы в виде: тип фильтра, частота среза (или центральная частота), Q-фактор, коэффициент передачи, ... После всего сервисная функция должна "уметь" безопасно установить новые значения коэффициентов фильтра, принимая во внимание возможность прерывания ее задачей более высокого приоритета (реал-тайм задачей, например, что может повлечь за собой вызов реал-тайм функции Biquad_Execute данного биквада, а коэффициенты фильтра наполовину новые, а наполовину еще старые; как результат - возможная потеря устойчивости фильтра на короткий промежуток времени и как окончательное следствие - слышимые неприятные эффекты; в случае других аудиомодулей подобное прерывание сервис функции без соответствующей защиты может вызвать крах всей системы).
2. Устанавливает новое значение времени интерполяции при плавном переходе от одного фильтра к другому.
Третья функция выполняет собственно фильтрацию, а также, в случае перехода от одного фильтра к другому, осуществляет интерполяцию (morphing) коэффициентов.
Вот первые две функции пишутся на Си. Последняя либо полностью на ассемблере (для биквадов, наверное, так и имеет смысл сделать), либо на си, но внутри вызывает ассемблерные функции.
Вообще, любые нереалтаймовские приложения имеет смысл писать на Си (Си++), поскольку они имеют низкий приоритет.