• Witamy w największym polskim serwisie internetowym poświęconym w całości zagadnieniom samodzielnej budowy nagłośnienia.
    Dzięki DIYaudio.pl poznasz zagadnienia samodzielnej budowy nagłośnienia od podszewki oraz będziesz mógł dyskutować o DIY audio do woli.

    Artykuły z dawnego portalu zostały przeniesione do sekcji forum na samym dole.

Mój własny streamer/preamp: Reaktywacja (Alpha 0.10). Walka z materią i kodem

Rejestracja
Paź 3, 2022
Postów
25
Reakcji
3
Lokalizacja
Green Mountain City
Cześć wszystkim!

Od dobrych nastu lat zabieram się za produkcję własnego zestawu stereo. Kolumny, po ciężkich bojach, są już na ukończeniu – zostały detale i mam nadzieję, że w tym roku w końcu zamknę ten temat. Jednak wciąż z tyłu głowy siedzi mi autorski wzmacniacz/streamer.

Moja droga była kręta:

  1. Lampa: Najpierw marzył mi się prosty wzmacniacz lampowy (nawet 1W), ale o lampach wiem niewiele, a im więcej czytałem o transformatorach głośnikowych, tym szybciej przybywało mi siwych włosów.
  2. Gainclone: Później padło na projekt Gainclone z Arduino, ale czułem, że to zbyt ograniczone rozwiązanie.
  3. Volumio: Przez kilka lat używałem Volumio. Malinka leżała "nago" na komodzie i... tak leży do dziś. Nic się nie zmieniło.
Dziś mam już pełną świadomość ograniczeń sprzętowych i programowych. Właśnie uśmierciłem swoją 9. wersję projektu (Alpha 0.9). Dlaczego? Bo szukam czegoś więcej niż "gotowca".

O co walczę?​

Nie interesuje mnie radio internetowe z pogodą, polityką i durnymi komentarzami dziennikarzy. Odpaliłem RMF – działa, ale to potrafi nawet kalkulator. Znalazłem stację Trance Pulse, która nadaje w wysokiej jakości i tu mój projekt poległ – po każdym utworze przepełniał się bufor i system stawał "jak widły w gnoju".

Volumio i podobne softy są super, jak chcesz tylko streamingu (Spotify, YT i koniec). Mój projekt idzie o krok dalej:

  • Serce: Początkowo miał być STM32, ale uznałem, że to walka z wiatrakami. Wybrałem Raspberry Pi 3B (wersja bez Wi-Fi, co mi nie przeszkadza).
  • DAC: Aktualnie PCM5102. Docelowo planuję PCM5122 lub jakieś dedykowane DSP, jak budżet pozwoli.
  • Analog Input (To mnie odróżnia!): Realizowane na PCM1808. Nie znalazłem niczego lepszego/tańszego, co trzymałoby przyzwoitą jakość przy wprowadzaniu analogu do cyfry.
  • Selektor wejść: Szalony pomysł na przełącznik analogowy 4:1 sterowany po szynie I2C. Pierwsze wejście będzie dedykowane pod gramofon.
  • Digital In: Planuję wejście SPDIF jako czwarte źródło (prawdopodobnie przez prosty przetwornik D/A, żeby sprowadzić to do wspólnego mianownika). Później może cos lepszego
  • Bluetooth: jako ostanie wejście.
Dodatki typu dotykowy ekran czy enkodery to dla mnie oczywistość – to ma być solidny, stacjonarny streamer.

Główny wróg: Oprogramowanie​

O ile Linux sam w sobie jest przewidywalny, to soft audio ma własne życie. Albo gra muzyka, ale nie działa korektor, albo podpięcie enkodera pod GPIO gryzie się z przerwaniami audio i wszystko trzeszczy.

W poniedziałek startuję z wersją Alpha 0.10. Mam nadzieję, że to ostatnia prosta. Plan na start jest minimalistyczny:

  1. Stabilne radio internetowe.
  2. Interfejs webowy do podstawowego sterowania (wgrywanie/usuwanie stacji).
Większość gratów już mam na stole. Jeśli ktoś z Was budował coś podobnego, walczył z implementacją wejść analogowych w malinie albo ma sprawdzone sposoby na stabilne bufory przy streamingu Hi-Res – będę wdzięczny za każdą wskazówkę, przemyślenia, a nawet konstruktywny hejt.

Wrzucam link do repozytorium (wszystko Open Source). Polecam gałąź new_project, bo tam dzieje się najwięcej:🔗 https://github.com/xtreamx2/streamer

Fotki z postępów wrzucę niebawem. Co o tym sądzicie?

PS. Ekran będzie obsługiwany przez RP2040 - bo musi działać nawet jak Raspberry będzie wstawać. To interakcja już będzie od strzała.

ps2 - Repo jeszcze nie dostepne na gicie - EDIT, Już jest.

v0.10.1 :
- widok jak na dole - interfejs WWW.
- działa Radio
- uruchomiona obsługa bluetooth
- stabilne 60st na procesorze (optymalna praca)

bug:
- problemy z interface
- czasami apka zailcza crush
- znikające podstrony

Zrzut ekranu 2026-03-11 114619.png

Zrzut ekranu 2026-03-11 114629.png

Zrzut ekranu 2026-03-11 114648.png

2026-03-09 13:22:30,182 INFO [__main__] Inicjalizacja managerów...
2026-03-09 13:22:30,184 INFO [core.uart_manager] UART start: /dev/ttyAMA0 @ 115200
2026-03-09 13:22:30,185 INFO [core.uart_manager] UART connected: /dev/ttyAMA0
2026-03-09 13:22:30,190 INFO [__main__] Przywracanie ostatniego źródła...
2026-03-09 13:22:30,191 INFO [core.source_manager] Switch: None → radio
2026-03-09 13:22:30,194 INFO [core.source_manager] Active: radio
2026-03-09 13:22:30,266 INFO [__main__] Streamer v3.0 — http://0.0.0.0:8000
2026-03-09 13:22:30,267 INFO [__main__] ALSA: hw:sndrpihifiberry,0
2026-03-09 13:22:30,267 INFO [__main__] UART: /dev/ttyAMA0 @ 115200
* Serving Flask app 'app'
* Debug mode: off
2026-03-09 13:22:30,279 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.1.71:8000
2026-03-09 13:22:30,279 INFO [werkzeug] Press CTRL+C to quit
2026-03-09 13:22:30,536 INFO [sources.radio] Radio play: http://stream.trance.ie:8000/tpmixes
2026-03-09 13:22:30,613 INFO [werkzeug] 192.168.1.84 - - [09/Mar/2026 13:22:30] "GET /api/status HTTP/1.1" 200 -
2026-03-09 13:22:30,635 INFO [werkzeug] 192.168.1.84 - - [09/Mar/2026 13:22:30] "POST /api/radio/play HTTP/1.1" 200 -
2026-03-09 13:22:30,959 INFO [sources.radio] Decoder: audio/x-raw
2026-03-09 13:22:30,977 INFO [sources.radio] Title: Ana Criado — Still There's You (A.R.D.I. Remix)
2026-03-09 13:22:33,579 INFO [werkzeug] 192.168.1.84 - - [09/Mar/2026 13:22:33] "GET /api/status HTTP/1.1" 200 -
2026-03-09 13:22:37,104 INFO [werkzeug] 192.168.1.84 - - [09/Mar/2026 13:22:37] "POST /api/volume HTTP/1.1" 200 -
2026-03-09 13:22:37,812 INFO [werkzeug] 192.168.1.84 - - [09/Mar/2026 13:22:37] "POST /api/volume HTTP/1.1" 200 -
2026-03-09 13:22:38,558 INFO [werkzeug] 192.168.1.84 - - [09/Mar/2026 13:22:38] "GET /api/status HTTP/1.1" 200 -
2026-03-09 13:22:41,149 INFO [werkzeug] 192.168.1.84 - - [09/Mar/2026 13:22:41] "POST /api/volume HTTP/1.1" 200 -
2026-03-09 13:22:41,770 INFO [werkzeug] 192.168.1.84 - - [09/Mar/2026 13:22:41] "POST /api/volume HTTP/1.1" 200 -
2026-03-09 13:22:42,042 INFO [werkzeug] 192.168.1.84 - - [09/Mar/2026 13:22:42] "POST /api/volume HTTP/1.1" 200 -
2026-03-09 13:22:42,297 INFO [werkzeug] 192.168.1.84 - - [09/Mar/2026 13:22:42] "POST /api/volume HTTP/1.1" 200 -
2026-03-09 13:22:43,582 INFO [werkzeug] 192.168.1.84 - - [09/Mar/2026 13:22:43] "GET /api/status HTTP/1.1" 200 -
2026-03-09 13:22:48,562 INFO [werkzeug] 192.168.1.84 - - [09/Mar/2026 13:22:48] "GET /api/status HTTP/1.1" 200 -
2026-03-09 13:22:53,550 INFO [werkzeug] 192.168.1.84 - - [09/Mar/2026 13:22:53] "GET /api/status HTTP/1.1" 200 -
 
Ostatnia edycja:
Changelog:

PylonisAmp v0.10.4.16:
Shutdown
- naprawiony, pojawia się obok Reboot w sekcji "System" w Settings
Phono - pointer-events:none + opacity:0.4 — nie można kliknąć
Stare wejście "Line" - usunięte, zostają tylko Line In 1 i Line In 2
Zakładka IN - wszystkie karty wycieniowane, cursor:not-allowed, bez onclick
Spectrum po powrocie - showPage('amplifier') jawnie restartuje RAF spectrum jeśli _meterMode === 'spectrum'

PylonisAmp v0.10.4.13 - BUG (HTML error):
Przełącznik VU/Spectrum usunięty z wnętrza panelu
- sterowanie tylko przez chipy na górze. Stan zapisywany w config.json jako meter_mode ('vu'/'spectrum'/'off'), przywracany po załadowaniu strony
Shutdown - przycisk w Settings obok Reboot, pomarańczowy, pyta o potwierdzenie, pokazuje "Wyłączanie..."
Wejścia analog - Phono/Line wycieniowane z podpisem "wkrótce", S/PDIF już był disabled
Ikony źródeł - artystyczne SVG: płyta winylowa z fioletową poświatą, antena z neonami, pastylka BT, TOSLINK z laserem

PylonisAmp v0.10.4.12:
VU/Spectrum — radio buttons
— kliknięcie jednego wyłącza drugi, można też kliknąć aktywny żeby schować wskaźniki
Phono i Line — wycieniowane (opacity: 0.35, pointer-events: none, podpis "wkrótce") — czekają na PCM1808
S/PDIF — już był wycieniowany klasą disabled

PylonisAmp v0.10.4.11:
30fps
— timer co 33ms, fetch timeout 80ms
Peak hold — 800ms hold, 60 dB/s opadanie (było ~12 dB/s)
Skala logarytmiczna — etykiety na precyzyjnych pozycjach: -60 · -18 · -12 · -6 · -3 · 0
Gradient — żółty przy -17 dBFS (≈0 VU), czerwony od -4 dBFS
Nazwa — PylonisAmp wszędzie

PylonisAmp v0.10.4.10 - bump minorowy bo zmian dużo:
Przełącznik VU/Spectrum po powrocie ze strony - showPage('amplifier') teraz jawnie resetuje timer i RAF, potem wywołuje initMeterMode() + startSpectrum(). To był główny bug
VU peak hold - opadanie clampowane do -60 dBFS (nie mogło spaść w nieskończoność), obia kanały mają pełną logikę
Pierwsze pasma spectrum - zamiast czystego max() używa teraz 70% max + 30% średnia - mniej szarpane przejścia między grupami
UART - connected zamiast active

PylonisAmp v0.10.4.7-9:
Spectrum 32 pasm
- wszystkie 32 wyświetlane. Pasma 25-32 (16-22 kHz)
Autogain - dodany do /api/status, UI odczytuje stan po załadowaniu strony
UART - pokazuje connected (port otwarty) zamiast active (wymaga pong od RP2040)

PylonisAmp v0.10.4.6:
VU metr — teraz prawdziwa skala VU:

0 VU = -18 dBFS (standard broadcasting/recording)
Zakres: -20 VU do +5 VU
Etykiety: -20, -10, -7, -3, 0, +3 VU
Gradient: niebieski poniżej 0 VU, żółty przy 0 VU, czerwony od +3 VU

Spectrum — 24 z 32 pasm (0–16.5 kHz):
GStreamer nadal liczy 32 pasma liniowo
Ostatnie 8 (16.5–22 kHz) są odcinane bo tam nic nie ma w muzyce
Wszystkie 24 aktywne pasma będą wypełnione

PylonisAmp v0.10.4.5:
Skala VU: -48..0 dBFS -
zamiast -60..0 — bardziej zgodna z profesjonalnymi VU metrami. Trance przy -7dB RMS będzie na ~85% - to poprawne, ta muzyka jest masterowana bardzo głośno (loudness war)
Znaczniki - zaktualizowane: -48, -30, -15, -9, -3, 0
Gradient - przesunięty: żółty od -9dB, pomarańcz od -5dB, czerwony od -2dB
GStreamer peak-ttl = 0 - brak podwójnego hold (GStreamer + JS), teraz tylko JS robi hold

PylonisAmp v0.10.4.4:
32 pasma
- n=32 zahardkodowane w canvas draw, Array zamiast TypedArray
Codec - przywrócona pełna nazwa "Free Lossless Audio Codec (FLAC)"
Bit depth - 44.1 kHz/16bit (wyciągane z GStreamer caps S16LE)
Peak hold naprawiony - prosta logika: opadanie 1.5 dB per tick (~120ms) = ~12.5 dB/s, bez błędów akumulacji czasu
Cache buster - meta tag z wersją wymusza nowy JS

PylonisAmp v0.10.4.3:
VU peak hold
- naprawiony błąd w algorytmie opadania (mnożnik * 0.01 powodował że peak prawie nigdy nie opadał). Teraz: hold 1.5s, opadanie ~18 dB/s
Spectrum 32 pasm - canvas rysuje zawsze n=32, restart RAF przy każdym powrocie na stronę
Gradient - progi jak w v0.10.4.2

PylonisAmp v0.10.4.2:
32 pasma -
spectrum (GStreamer + API + JS)
Gradient VU i Spectrum - nowe progi: niebieski do -23dB, żółty od -15dB, pomarańcz od -7dB, czerwony od -3dB, mocny czerwony przy 0dB (clip)

PylonisAmp v0.10.4.1:
naprawiony przełącznik VU/Spectrum
- Problem polegał na tym że _specDraw (canvas animation loop przez requestAnimationFrame) zatrzymywał się gdy canvas był ukryty

PylonisAmp v0.10.4.0 - PylonisAmp:
Spectrum
- api/meters pobiera teraz z aktywnego źródła (wcześniej zawsze z radio nawet gdy nieaktywne), 16 pasm
Bitrate - szuka nominal-bitrate/maximum-bitrate dla FLAC; codec "Free Lossless Audio Codec (FLAC)" → "FLAC"
UART ping/pong - co 8s wysyła {"cmd":"ping"} do RP2040, oczekuje {"evt":"pong"}; active=true tylko gdy odpowiedź przyszła w ostatnich 30s. Wymaga aktualizacji firmware RP2040 żeby odpowiadał na ping.
Nazwa - PylonisAmp, licencja GPL v3, CHANGELOG.md

```
Zmiana nazwy projektu na PylonisAmp - połączenie "kolumny głośnikowe + ucho + oraz wzmacniacz"
```

v0.10.3.29-35 - bug APP (nie włącza się):
New:
- Edit → Direct - przycisk naprawiony (był zduplikowany w pliku)
- werkzeug logi - wyciszone (tylko WARNING+), błędy będą widoczne w journalctl
- Direct - przycisk zastępuje Edit w sekcji EQ; aktywny = bypass EQ (wszystkie pasma 0) + ignoruje loudness
- WiFi - przyciski "WiFi OFF/ON" i "Rozłącz" w Network page
- User1/User2 preset - PRESETS w JS ma user1/user2, loadUserPresetNames() wczytuje gains z serwera, saveUserPreset aktualizuje lokalnie po zapisie
- SD card - _save_config(debounce=True) dla EQ/gain/last_source — max 1 zapis co 5s; volume zapisuje natychmiast
- Auto Gain - przywrócony z etykietą i opisem; logika: przy CLIP (peak ≥ -0.1 dBFS) obniża gain o 1dB i zapisuje
- Gain per wejście - suwaki -10..+6 dB w sekcji "Gain wejść" w Settings; stosowany jako pre-gain przy każdym przełączeniu źródła
- User 1 / User 2 - presety EQ w ustawieniach; "Save →" zapisuje bieżące nastawy, "Rename" zmienia nazwę
- initMeterMode - spectrum/VU włącza się automatycznie przy ładowaniu strony
- streamer.service - wersja zsynchronizowana z app.py, usunięty zduplikowany After=, wersja aktualizowana automatycznie
Bug:
- Spectrum/VU - naprawiony regex w initMeterMode, timeout skrócony do 500ms
- ERR_CONNECTION_RESET - initMeterMode z 2s opóźnieniem, serwer ma czas się uruchomić
- Usunięto etykiety Mono w ustawieniach

'''
loudness w tym projekcie jest tylko jako preset EQ (zestaw gainów) - nie jest jeszcze stosowany jako dodatkowa korekta na bieżący preset.
'''

v0.10.2-28 changelog:
New:
- Peak hold - marker przeniesiony poza maskę CSS, biały z glow, widoczny
- Spectrum - 32 pasma animowane przez requestAnimationFrame, kształt EQ-like (basy/górne wzmocnione), peak ticki białe, ten sam gradient co VU, płynne opadanie
- Gradient zawsze rozłożony na całej szerokości tracku (niebieski → żółty → czerwony)
- Ciemna maska CSS ::after odkrywa gradient proporcjonalnie do poziomu
- Peak marker biały z delikatnym glow - BUG
- Brak JS manipulacji kolorem — wszystko w CSS
- parowanie BT
- BT audio - bluealsa-aplay uruchamiany jako subprocess przy activate, zatrzymywany przy deactivate

- W-Fi conect
- Ostatnia stacja radiowa - przywracana automatycznie po restarcie
- Zakładka -Streamer · TrancePulse dla radia (nazwa stacji), Streamer · Bluetooth dla BT itd.
- Stream info -kHz i Stereo/ch z GStreamer

Bugfix:
- Sieć - naprawiony parser nmcli (obsługuje connected (externally))
- Głośność
- była zapisywana ale teraz też last_station_id jest zapisywane przy każdym play
- Ostatnia stacja - przywracana automatycznie przy starcie
- Loudness - prawdziwy endpoint /api/setting, zapisywany w config, przywracany przy starcie
- BT connect - auto-trust przed połączeniem
- problemy z interface
- czasami apka zailcza crush
- znikające podstrony
- IP - zawsze pobiera z eth0 pierwszego

v0.10.1 changelog:
- interfejs WWW.
- działa Radio
- uruchomiona obsługa bluetooth
- stabilne 60° na procesorze (optymalna praca)

bug:
- problemy z interface
- czasami apka zailcza crush
- znikające podstrony
 
Ostatnia edycja:
Zapowiada się pięknie.
Ja od kilku już lat przymierzam się do procesorowego sterowania magnetofonem szpulowym. HMMM- nadal się przymierzam. :)
 
Wczoraj przy kawie zacząłem się zastanawiać ile lat minęło od pierwszego pomysłu. Sam nie wierzę, ale to juz 14 lat...
Teraz nie wszystko działa idealnie, ale na tym etapie jestem mega zadowolony.
Liczylem na pomoc, a tu okazuje się ze wystarczyło MPD zamienić na GStreaming i jakoś działa.
Największą bolączką to wizualizacja. Na tym etapie wkuża, ale nie jest krytyczna.
Czekam na RP2040 - w końcu by zobaczyć czy główne założenie (dotykowy ekran) będzie działać z projektem.

Czas pokaże...
 
Z rezonatorem, mam chiński moduł i nie wiem jak to ugryźć by zadziałało od strzała. potrzebny mi 25.576Mhz i nie bardzo wiem jak to podłączyć.

Dziś nie wrzucę update. Na gita może też pójdzie w przyszłym tygodniu. Przez tydzień przełączam się na inne zadanie, ale może w tym czasie uda się podłączyć PCM1808 hardwareowo...
 
Ostatnia edycja:
Powrót
Góra