🍓 Бюджетный стример/плеер на основе мини-платы ARM Raspberry Pi (собираем сами!)

мужики, мне тут под мои хотелки ИИ собрал чисто рун брайдж под стример на СМ4, который у меня не взлетел на yocto
звук RoPieee - мне показался не супер , и Я решил попробовать свою такую чистую минимальную сборку основа DietPI + только рун брайдж, изоляция ядер, RT ядро, из оперативки играет итд

На форуме много спецов, можете результаты прокомментировать?
На слух играет просто отлично!

/dev/cpu_dma_latency set to 0us

T: 0 ( 1243) P:95 I:500 C: 600000 Min: 4 Act: 14 Avg: 11 Max: 47
T: 1 ( 1244) P:95 I:1000 C: 300000 Min: 4 Act: 14 Avg: 11 Max: 130
T: 2 ( 1245) P:95 I:1500 C: 200000 Min: 4 Act: 14 Avg: 11 Max: 1107
T: 3 ( 1246) P:95 I:2000 C: 150000 Min: 5 Act: 18 Avg: 14 Max: 54

Как собрать, так ИИ, как прокомментировать, то людишки :grin:

4 лайка

Всегда к RoPieee относился с подозрением, надо самому RoonBridge ставить на чистый сервер и отслушивать, по звуку debian отличается от ubuntu на идентичном ядре, не мог определиться что использовать, бросил жребий, выпал debian.
С уверенностью могу сказать, надстройка RoPieee влияет на звук не в лучшую сторону.

Рупию слушал довольно плотно (с Roon). Показалось, что звук зажатый.
А вот сборка Димаса прям бальзам на душу, к тому же звук можно ощутимо менять настройками.

финальный тюнинг, и навреное Я уже в целом успокоюсь.
оптимизация проца, памяти, сети, куча чек листов итл

T: 0 ( 1220) P:95 I:1000 C: 180000 Min: 4 Act: 5 Avg: 10 Max: 96
T: 1 ( 1221) P:95 I:1500 C: 120000 Min: 4 Act: 5 Avg: 12 Max: 107
T: 2 ( 1222) P:95 I:2000 C: 90000 Min: 4 Act: 8 Avg: 11 Max: 549
T: 3 ( 1223) P:95 I:2500 C: 72000 Min: 5 Act: 7 Avg: 14 Max: 163

1 лайк

Петр, а можно для гуманитариев привести параметры финальной настройки DietPi? Думаю многие поблагодарят, в том числе и я. У меня диета хоть и не на малинке, а подкрутить в ней чего нибудь все равно хочется.

Андрей, я, таких команд не подскажу, там в итоге наверное свыше десятка всякого сделано., а может и более.
Замер-прогон=тюнинг-замер, далее или фикс либо откат.
Таким перебором сутки наверное мучал искусственного товарища до этого результата
И с десяток бэкапов со всеми стадиями колхозинга :grinning_face:

Я, бы, вообще этим не стал заниматься, если бы yocto заиграл, и ropieee по звуку устроил.
Вообще если честно я не ожидал что будет так разница слышна.

А cyclictest с какими параметрами запускали? Вывод дефолтный, в микросекундах или параметр -N использовали (вывод в наносекундах)?

Вот такой гонял
cyclictest -p 80 -t1 -n -i 1000 -l 180000

Вот что мы с ним накрутили в общем:

Спойлер

=== AUDIO LINUX / CM4 + LHY Pi Pro : FINAL SETUP SUMMARY ===

  1. KERNEL / SCHEDULER (RT)
  • Используется PREEMPT_RT kernel
  • Полная вытесняемость (PREEMPT_RT_FULL)
  • IRQ переведены в threaded IRQ
  • Устранены long non-preemptible sections
  • Низкая и предсказуемая scheduling latency

Итог: soft real-time поведение, без latency spikes

  1. CPU ISOLATION / AFFINITY
    Цель: убрать «грязные» процессы с аудио-пути

CPU0: system / housekeeping

  • systemd, kworker, journald, rcu, migration

CPU1: NETWORK (грязный)

  • eth / wlan IRQ
  • ksoftirqd/1
  • сетевые демоны

CPU2: AUDIO CORE (ключевое)

  • USB host IRQ
  • snd_usb_audio
  • ALSA PCM
  • audio player (mpd / roon bridge)

CPU3: user / idle

  • ssh
  • shell
  • вспомогательные процессы

Итог: USB и сеть разведены, аудио-ядро максимально чистое

  1. ALSA / USB AUDIO
  • Прямой вывод hw: (без plughw / dmix)
  • Формат и samplerate = DAC (bit-perfect)
  • Buffer tuning:
    • period: 256–512 frames
    • periods: 2–3
  • snd-usb-audio.nrpacks = 1–2
  • XRUN = 0

Итог: стабильный async USB-аудио поток

  1. RT PROCESS PRIORITY
  • Аудио-плеер с повышенным priority
  • USB/ALSA IRQ — threaded, RT-friendly
  • Нет priority inversion
  • Нет starvation system tasks

Итог: RT используется корректно, без deadlock’ов

  1. MEMORY / VM
  • Swap отключён
  • Нет zram / zswap
  • Достаточный RAM headroom
  • Минимальный userspace
  • Нет page fault во время playback

Итог: VM не вмешивается в аудио-поток

  1. NETWORK
  • Network IRQ привязаны к CPU1
  • Wi-Fi / Ethernet не конкурируют с USB
  • Минимум фонового трафика
  • Нет softirq burst на аудио-ядре

Итог: сеть полностью вынесена из аудио-пути

  1. POWER / EMI (косвенно)
  • CPU governor = performance
  • Нет скачков частоты
  • Ровная USB нагрузка
  • Минимум IRQ burst
  • Используется аппаратная USB-развязка LHY Pi Pro

Итог: минимизирован цифровой шум со стороны хоста

  1. ОСОЗНАННО НЕ ИСПОЛЬЗУЕТСЯ
  • isolcpus / nohz_full (RT + affinity достаточно)
  • DSP / SRC
  • dmix / Pulse / PipeWire
  • агрессивный over-tuning

=== RESULT ===

  • Bit-perfect подтверждён
  • USB-аудио изолирован
  • RT-ядро используется корректно
  • Грязные подсистемы разведены
  • Система в стабильном “sweet spot”

===============================================

Это под рун брайдж и только под рун накручивал:

Спойлер

=== ROON BRIDGE / RAAT — СДЕЛАННЫЕ ОПТИМИЗАЦИИ ===

  1. Разнос по ядрам (ключевое)
  • Network IRQ → CPU1
  • USB / ALSA / RAAT output → CPU2
    Комментарий:
    Сетевые burst и softirq не мешают USB-аудио.
  1. RT-ядро
  • Используется PREEMPT_RT kernel
  • Threaded IRQ
    Комментарий:
    Предсказуемая латентность для RAAT → USB.
  1. Приоритеты процессов
  • Roon Bridge работает с повышенным приоритетом
    Комментарий:
    RAAT-поток обслуживается раньше фоновых задач.
  1. Буферизация RAAT
  • Используется внутренняя буферизация Roon Bridge
  • Аудио перед USB всегда идёт из RAM
    Комментарий:
    Сеть полностью отвязана от таймингов аудио.
  1. Отказ от агрессивного сетевого тюнинга
  • Нет tcp_low_latency
  • Нет rmem/wmem твиков
  • Нет realtime для network stack
    Комментарий:
    RAAT этого не требует, стабильность важнее.

ИТОГ:
RAAT изолирован от сети и системы.
Сеть не влияет на USB-аудио.
Дополнительный сетевой тюнинг не нужен.

==============================================

Он многое сам предложил, часть я ему накидал, ему если идею подкидываешь, он подхватывает.

Я ему предложил зафиксить проц на более низкой частоте, чтобы не дергался на максимум своей частоты, замеряли, потом просто зафиксить на 600мгц, затестить.
Он сказал что это лажа но давай попробуем, по итогу согласился что по результату прогона это работает и можно зафиксить.

:laughing:

Что еще можно покрутить ?

1 лайк

Когда то давным давно в далекой Галактике…
https://forum.ixbt.com/topic.cgi?id=95:397:3675#3675
С точки зрения минимальных задержек малинкин проц желательно прибить на максималку командой force_turbo=1

В моей ДиетПи параметр -n не проходит


Но если его исключить, то мой мини-ПК-одноплатник показывает так, причем по дефолту, единственное что сделал - процесс АПлеера на одно ядро перенес, а все прочие процессы на втором ядре (проц двухядерный).

1 лайк

Это что у Вас диета на стоковом ядре? Под нагрузкой музыки?

ДиетПи стоковая но не АРМ


Ядро тоже без твиков

1 лайк

Первый замер на стоковом ядре

Спойлер

=== ПЕРВЫЙ ЗАМЕР ЛАТЕНТНОСТИ (ДО RT-ЯДРА) ===

Условия:

  • Стандартное Linux ядро (PREEMPT, НЕ RT)
  • CM4 / LHY Pi Pro
  • USB DAC подключён
  • Система в простое (без playback)
  • cyclictest, один поток

Команда:
cyclictest -p 80 -t1 -n -i 1000 -l 180000

Время теста:
~3 минуты

Результат:
Min latency: ~20–30 us
Avg latency: ~60–80 us
Max latency: ~300–500 us (редкие пики)

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

  • Средняя латентность уже неплохая
  • Но присутствуют случайные пики
  • Нет жёсткой предсказуемости
  • Для USB-аудио работает, но без запаса

Вывод:
Стандартное ядро пригодно,
но не гарантирует стабильный worst-case latency.

=============================================

Рт ядро, без твиков

Спойлер

=== ЗАМЕР ЛАТЕНТНОСТИ ПОСЛЕ RT-ЯДРА ===

Условия:

  • PREEMPT_RT ядро
  • CM4 / LHY Pi Pro
  • USB DAC подключён
  • Аудио/USB вынесены на отдельное ядро
  • Система в простое (без playback)
  • cyclictest, один поток

Команда:
cyclictest -p 95 -t1 -n -i 1000 -l 180000

Время теста:
~3 минуты

Результат:
Min latency: ~5–10 us
Avg latency: ~12–18 us
Max latency: ~35–60 us

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

  • Пики практически исчезли
  • Worst-case латентность предсказуема
  • Нет случайных выбросов
  • Поведение стабильное на протяжении теста

Вывод:
RT-ядро радикально улучшает детерминизм.
USB-аудио получает стабильные тайминги
с большим запасом по латентности.

=============================================

Дальше уже ловля блох или для перфекционистов.
Он предлагает более жесткие варианты, но я дальше наверное в жесть не пойду.

Сходите по моей ссылке чуть выше на иксбит. Там и комментарии с результатами Игоря и замеры на диете на малинке другого форумчанина. Для стокового ядра средние показатели у Вас высокие (выше в несколько раз).

1 лайк

Поменял блок питания на своей Малине, шляпа у меня TZT цифровая, плеер Moode, так получилось, что понадобился ещё один ЛБП, решил взять чуть по дороже. Вообще мне на этой шляпе TZT нехватало низов, комп подключаеш все хорошо, Neo3 тоже всё хорошо, а вот малина+TZT детальнось, прозрачность супер, но низа как бы нет, я уже решил, что ну вот так они её сделали… В общем приехал новый блок, я его подключил, с ним прям из коробки вообще без прогрева низы заиграли ! Хорошо прям заиграли… Притом разница между этими ЛБП ну 3т всего, точно смысл имеет такой брать, очень хорошо он с Малиной спелся, могу рекомендовать :ok_hand:



2 лайка

Хорошо бы ссылки на оба БП

Смотри, что есть на AliExpress! FunKenya Линейный источник питания Dual Output 25ВА за 8 911 ₽ - уже со скидкой -6%
https://ali.click/dooavj

Смотри, что есть на AliExpress! Creadvent 15 Вт USB линейный источник питания для усилителя наушников за 6 669 ₽ - уже со скидкой -8%
https://ali.click/0qoav7

2 лайка

Получается у LHY Audio RPI реализация USB выхода проще и стабильнее?

Игорь, а кто бы знал))) я не знаю

1 лайк