Droid & Rezonans
Rezonans Rezonans
Привет, Дроид. Тут ковыряюсь с полифоническими волновыми формами, интересно, как ты в своих проектах организуешь маршрутизацию сигналов в реальном времени?
Droid Droid
Дроид на связи, отличный проект. Маршрутизация в реальном времени – это всё о путях с низкой задержкой и потокобезопасности. Я использую модульную шинную систему, где каждый модуль предоставляет входные и выходные порты, а затем легковесный планировщик следит за тем, чтобы пакеты двигались каждый такт. Данные я храню в буферах фиксированного размера, чтобы избежать блокировок при выделении памяти. Для полифонии я мультиплексирую голоса на отдельные каналы и использую очередь с приоритетами, чтобы наиболее требовательная волна обрабатывалась первой. Если тебе нужен конкретный пример, могу показать кусочки кода или схему потока данных, которой я пользуюсь.
Rezonans Rezonans
Отлично, эта модульная шина звучит надёжно. Надо будет проверить, как твой приоритетный очередь справляется с пиками задержки, когда тяжёлый синтезатор включится. Может, поделимся опытом по настройке гранулярности планировщика, чтобы не терять пакеты. Кстати, есть какой-то секрет, как ты избегаешь смещения кольцевых буферов?
Droid Droid
Конечно. Я блокирую указатели кольцевого буфера лёгким спинлоком на каждый канал и использую схему двойной записи: производитель пишет в одну половину буфера, а потребитель читает из другой. Когда буфер почти заполнен, я немедленно меняю половины и отбрасываю самый старый пакет – без искажений, просто чистый обрыв. Для гранулярности планировщика я установил размер тика в 512 сэмплов при частоте 48 кГц, что даёт 10.7 миллисекунд на тик. Я запускаю тяжелый синтезатор с более низким приоритетом, чтобы его пакеты перетекали в следующий тик без жёсткого сброса. Дай знать, как это отработает у тебя.
Rezonans Rezonans
Этот твой приём с двойной записью и половинным буфером – умная штука, без перетаскивания указателей, просто сброс. У меня на стороне я держу тик на 256 сэмплов при 44.1 килогерца, так что чуть плотнее. Попробую твою настройку с 512 сэмплами и 48 килогерц, посмотрим, как синтезаторы будут проигрываться. Если начнёт фальшивить – сразу сообщу. Кстати, ты используешь один спинлок для всех каналов или разворачиваешь каждый по отдельности?
Droid Droid
Я каждый канал обрабатываю отдельно – по замку на шину, чтобы избежать зависаний между ними. Так, если один синтезатор глючит, остальные не блокируются. Удачи с 256-м семплом на тик; дай знать, если синтезатор начнёт фальшивить, я подкручу зернистость или добавлю небольшой предбуфер.