СУХОЙ принцип для блока обработки звука

#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

  1. Во время компиляции мы должны иметь возможность определять порядок блоков обработки. Инициализируйте блоки значениями, считанными из файла конфигурации.
  2. После этого для каждого из них вызывается функция обработки и создается конечный результат.
  3. Во время обработки некоторые блоки могут иметь функцию сброса и другие обратные вызовы на основе блоков обработки.
  4. После завершения обработки нам нужно деинициализировать блоки.
  5. Как нам передать вывод первого блока на вход второго блока и так далее.

P означает блок обработки.

https://ideone.com/GEvaKm

Комментарии:

1. Почему выполняется только t2 сброс?

2. @Quentin: все блоки обработки не нуждаются в сбросе перед обработкой.

3. Если вы согласны с этим с помощью пустой reset функции в этих блоках, базовый класс и виртуальные функции должны хорошо соответствовать вашим потребностям. Затем вы можете сохранить их в a std::vector<std::unique_ptr<BaseProcess>> и вызывать их по порядку.

4. @Quentin: согласен, как насчет передачи вывода первого блока второму, а также порядок может измениться?

5. Вам просто нужно сохранить iFrame = oFrame строку для передачи данных. Переупорядочение блоков будет выполняться простым переупорядочением вектора.