#c #audio #design-patterns #architecture
#c #Аудио #шаблоны проектирования #архитектура
Вопрос:
В моем коде обработки звука (аудиопроцессор) У меня есть что-то вроде приведенного ниже кода. Я пытаюсь избежать этого ниже повторяющегося кода. Интересно, есть ли лучший способ написать этот код?
Код — это просто иллюстрация для понимания проблемы: у меня есть несколько блоков обработки звука, в которых звук одного блока передается в качестве входных данных во второй блок и так далее до окончательного обработанного вывода. Существует 4 основных компонента этих «блоков»: инициализация, обработка, сброс и деинициализация.
/* some code here to initialize audio processing blocks */
//snip
/*
* order of audio processing is important here.
* Is there any way to avoid writing below code
* for every processing block that gets added in
* future in c 11 perhaps??
*/
if (t1) {
t1->process(iFrame, oFrame);
iFrame = oFrame;
}
if (t2) {
t2->reset();
t2->process(iFrame, oFrame);
iFrame = oFrame;
}
if (t3) {
t3->process(iFrame, oFrame);
iFrame = oFrame;
}
/*
* if in future we want this way t1 - > t3 - > t2 then code change is required,
* is there any way to avoid this code change
*/
По сути, я ищу общий способ справиться с этим:
P1 -> P2 -> P3 -> P4
- Во время компиляции мы должны иметь возможность определять порядок блоков обработки. Инициализируйте блоки значениями, считанными из файла конфигурации.
- После этого для каждого из них вызывается функция обработки и создается конечный результат.
- Во время обработки некоторые блоки могут иметь функцию сброса и другие обратные вызовы на основе блоков обработки.
- После завершения обработки нам нужно деинициализировать блоки.
- Как нам передать вывод первого блока на вход второго блока и так далее.
P означает блок обработки.
Комментарии:
1. Почему выполняется только
t2
сброс?2. @Quentin: все блоки обработки не нуждаются в сбросе перед обработкой.
3. Если вы согласны с этим с помощью пустой
reset
функции в этих блоках, базовый класс и виртуальные функции должны хорошо соответствовать вашим потребностям. Затем вы можете сохранить их в astd::vector<std::unique_ptr<BaseProcess>>
и вызывать их по порядку.4. @Quentin: согласен, как насчет передачи вывода первого блока второму, а также порядок может измениться?
5. Вам просто нужно сохранить
iFrame = oFrame
строку для передачи данных. Переупорядочение блоков будет выполняться простым переупорядочением вектора.