Двукратное копирование буферов в czaptel.c было скопировано из исходного кода одного из драйверов для digum-карточек. Разработчик, который скопировал этот код, не стал разбираться для чего это нужно.
На самом деле такое копирование (именно двукратное) нужно для сопоставления в zt_ec_chunk() принятого и переданного звука с учетом задержки данных в буферах телефонной платы (один буфер на приём и один на передачу). Если телефонная карта непосредственно подключена к месту порождения эха (hybrid-модулю), то задержка на "два буфера" помогает в точности сопоставить принятый звук с эхом от переданного ранее сигнала. В целом это позволяет использовать чуть более простые алгоритмы эхоподавления и иногда повышать качество их работы.
Если источник эха подключен не непосредственно к карте, то такая буферизация обычно не даёт результата, поскольку величина общей задержки сигнала между линейным интерфейсом карты и источником эха неизвестна. Т.е. неизвестна суммарная задержка сигнала при прохождении по пути память->адаптер->линия->телефон->линия->адаптер->память.
В случае с картами для E1 ситуация усугубляется, поскольку сигнал ещё будет идти через сеть E1, а затем через блоки коммутации АТС и ЦАП/АЦП. Поэтому для карт с E1-интерфейсами такая "буферизация через копирование", как правило, очень мало что даёт.
Задача вычисления задержки (фактически поиск максимальной корреляции) и соответствующая подстройка коэффициентов вычитающего фильтра - одна из главных задач любого алгоритма эхоподавления. Любой более-менее приличный алгоритм эхоподавления будет работать вне зависимости от наличия такой буферизации совершенно одинаково.
При использовании PCI-плат производства Кроникс задержка "внутри" платы зависит от модели устройства и конфигурации (например от qlen=#). Поэтому "буферизацию" мы посчитали излишней тратой ресурсов процессора. Тоже самое (отсутствие двойного копирования) вы можете увидеть во многих других драйверах, в том числе в комплекте zaptel.
В вашем случае объяснение "улучшения" будет примерно такое:
1) Если "внешняя" задержка по E1 очень мала (непосредственно соединение с АТС) и используется простейший эхоподавитель, то двойное копирования помогает алгоритму подавления быстрее и лучше подстроить вычитающий фильтр;
2) Возможно, что улучшение обусловлено только изменением ZT_CHUNKSIZE и свойствами выбранного эхо-подавителя;
Если вы проведете небольшие испытания и на самом деле окажется, что "буферизация копированием" реально помогает, то я реализую включение/выключение "буферизации" через sconfig.
--
С уважением, / Best regards,
Леонид Юрьев / Leo Yuriev
КБ Кроникс / Cronyx Engineering