MILA*
Osobni audio streamer · U razvoju
- Cilj: lokalna hi-res glazba, internetski radio i streaming u jednom prilagodljivom playeru.
- Moja uloga: zahtjevi, ponašanje sustava, testiranje na stvarnom uređaju i odluke o objavi; AI asistenti za programiranje pišu velik dio implementacije.
- Trenutačno stanje: funkcionalan osobni prototip u aktivnom razvoju, za svakodnevno slušanje.
- Provjera: automatizirani testovi i provjere uređaja; neke integracije, scenariji oporavka i ponašanje zvuka još zahtijevaju dodatnu provjeru.
Glazbeni projekt koji povezuje moje zanimanje za računala, praktično rješavanje problema i svakodnevno slušanje. MILA* spaja postojeći hardver sa sučeljem koje mogu oblikovati prema vlastitim potrebama.
Od frustracije do projekta
Glazbu slušam svaki dan, uz veliku osobnu zbirku hi-res FLAC datoteka, internetski radio i streaming. Streameri koje sam koristio frustrirali su me: spori izbornici pri pretraživanju većih zbirki, povremeni prekidi veze i ograničene mogućnosti prilagodbe. Želio sam i izravnu kontrolu obrade zvuka — bit-perfect prijenos datoteka visoke rezolucije, izbjegavanje neželjenog preuzorkovanja i provjeru onoga što DAC stvarno prima.
Odlučio sam izraditi svestran player: namjenski uređaj koji bez kompromisa povezuje lokalnu reprodukciju visoke rezolucije, internetski radio i streaming. Umjesto stalno uključenog glavnog računala, pogledao sam hardver koji sam već imao: Raspberry Pi 5, dodirni zaslon, brz NVMe disk za glazbu, USB DAC i linearno napajanje. Zapisao sam zahtjeve i počeo oblikovati streamer prema njima.
Cilj je bio jasan: svestran player koji lako reproducira FLAC albume visoke rezolucije, drži radio i streaming pri ruci te ostaje potpuno odzivan i jasan u svom ponašanju.
Jedno sučelje za svakodnevno slušanje
Player povezuje kontrole reprodukcije s redom čekanja, favoritima i nedavno reproduciranim ili dodanim sadržajem. Filtri izvora omogućuju prelazak između lokalne glazbe, radija i streaminga unutar istog sučelja.
Ugrađeni dodirni zaslon glavni je način upravljanja. Isto web-sučelje može se otvoriti s telefona ili računala u lokalnoj mreži. Reprodukcija ostaje na streameru; ostali uređaji služe kao daljinski upravljači.
Zbirka koju mogu istraživati
Velika zbirka hi-res FLAC datoteka zahtijeva brzo i intuitivno sučelje. Lokalna glazba može se pregledavati po albumu, izvođaču, žanru ili mapi, uz pretraživanje, sortiranje i abecednu navigaciju. Brza NVMe pohrana na Pi-ju omogućuje trenutačno učitavanje omota i metapodataka.
Želim da pregledavanje bude povezano sa slušanjem: otvori album, odaberi pjesmu, vrati se u zbirku i upravljaj redom reprodukcije bez gubitka mjesta.
Radio bez nereda
Radijski prikaz odvaja moju zbirku stanica od otkrivanja novih. Povezuje spremljene stanice, pretraživanje, nedavno slušano i filtre za zemlju, žanr i kvalitetu. Mogu se dodati i vlastiti streamovi.
Pouzdano slušanje u pozadini važan je razvojni cilj. Kad stream ili veza zakažu, sučelje treba objasniti što se dogodilo i ponuditi jasan put oporavka. Dugo slušanje i provjere oporavka dio su preostalog testiranja.
Streaming i upravljanje zvukom
Qobuz je integriran preko Lyrion Music Servera. AirPlay, Spotify Connect i Bluetooth također su dio rada na prijamnicima, uz zasebno praćenje podrške i provjera tijekom razvoja.
Glavni put reprodukcije koristi Lyrion Music Server → Squeezelite → USB DAC. Cilj mi je izbjeći nepotrebno preuzorkovanje i digitalne promjene glasnoće za podržani sadržaj. Sučelje razlikuje kvalitetu izvora od formata koji se trenutačno prijavljuje na izlazu DAC-a.
Ta je razlika važna: izlaz prikazan kao 32-bitni ne pretvara komprimirani radijski stream u kvalitetniji izvor. Prikaz formata pomaže u istraživanju, ali sam po sebi ne dokazuje bit-perfect reprodukciju.
Postavke koje pripadaju playeru
Izgled, zvuk i usluge, pohrana glazbe i održavanje sustava organizirani su u četiri cjeline. Projekt uključuje teme i opcije zaslona, mjerače, podatke o uređaju i alate za sigurnosne kopije korisničkih podataka. Osjetljive radnje sustava imaju zaštićene kontrole.
Čuvari zaslona i vizualni detalji dio su iskustva, ali koriste isti vizualni jezik kao zasloni za slušanje i pregledavanje.
Moja uloga i način rada
Moje iskustvo obuhvaća hardver, kontrolu kvalitete i analizu kvarova, a tako vodim i MILA*. Vodim projekt: definiram zahtjeve, odlučujem kako se sustav treba ponašati, testiram svaku izmjenu na stvarnom uređaju i odlučujem što se objavljuje. AI asistenti za programiranje pišu velik dio implementacije pod mojim vodstvom. Usmjeravanje tog rada i provjera rezultata zasebna su vještina.
Temelj reprodukcije čine Lyrion i Squeezelite; moja aplikacija povezuje izvore, kontrole i funkcije uređaja u usklađeno iskustvo.
Rad je iterativan: primijeti problem, ponovi ga, istraži uzrok, napravi izmjenu i provjeri rezultat. Primjeri u nastavku prate taj obrazac. Nakon završenog obrazovanja za Java developera kroz projekt produbljujem i razumijevanje Pythona.
Primjer iz razvoja · 01
Dosljedni favoriti
- 01 / Problem
- Jedna je radnja mogla dvaput dodati isti favorit. Spor odgovor mogao je stići nakon novije izmjene i ponovno prikazati stariji popis.
- 02 / Istraživanje
- Pregled razvoja pokazao je da dva prikaza popisa dijele istu temeljnu kolekciju. Otkrivena su i mjesta na kojima su stariji odgovori još mogli prebrisati aktualne favorite.
- 03 / Izmjena
- Popisi su razdvojeni, a novije potvrđene promjene sada imaju prednost pred ranijim odgovorima. Neizvjesna se radnja prijavljuje umjesto automatskog ponavljanja.
- 04 / Provjera
- Ciljane automatizirane provjere obuhvatile su dvostruka dodavanja, zakašnjele odgovore i potvrđene promjene. Dokumentirano ažuriranje instalirano je, a prikaz favorita pregledan na Pi-ju. Dulja uporaba i istodoban rad više klijenata ostaju dio daljnje provjere.
Primjer iz razvoja · 02
Naredbe koje su samo izgledale uspješno
- 01 / Problem
- Naredbe Play, Pause i Next mogle su zakazati bez obavijesti u sučelju. Odbijene naredbe tiho su se zanemarivale, a odgovor glazbenog poslužitelja koji je sadržavao pogrešku mogao se protumačiti kao uspjeh.
- 02 / Istraživanje
- Pregled je pratio naredbu od dodirnog gumba preko pozadinskog sustava do Lyrionova JSON-RPC sučelja. Nedostajući rezultat pretvarao se u prazan „uspjeh”. Izgubljen mrežni odgovor također ništa ne govori o tome je li naredba stvarno izvršena.
- 03 / Izmjena
- Svaka naredba sada završava jednim od triju ishoda: potvrđeno, odbijeno ili nepoznato. Nepoznat ishod prikazuje upozorenje da je naredba možda već izvršena. Naredbe se namjerno ne ponavljaju automatski: ponavljanje preklopne naredbe Play/Pause moglo bi poništiti onu koja je uspjela.
- 04 / Provjera
- Novi automatizirani scenariji obuhvatili su odbijene, neispravne i izgubljene odgovore. Ažuriranje je instalirano uz novu sigurnosnu kopiju; glazbeni poslužitelj nastavio je raditi, a player je prijavljivao reprodukciju prije i nakon instalacije.
Primjer iz razvoja · 03
Prekid veze bez lažnih uzbuna
- 01 / Problem
- Kad bi sučelje izgubilo kontakt s playerom, zaslon bi nastavio prikazivati posljednje poznato stanje bez naznake da je možda zastarjelo.
- 02 / Istraživanje
- Dohvat statusa već je ispravno obrađivao istek vremena i zakašnjele odgovore pa su nedostajale povratne informacije, a ne podaci. Pitanje je bilo što smatrati kvarom: jedan spor odgovor ili kartica preglednika u pozadini ne bi trebali izazvati uzbunu.
- 03 / Izmjena
- Dvije uzastopne neuspjele provjere statusa sada prikazuju diskretnu obavijest da status nije dostupan i da player prikazuje posljednju poznatu reprodukciju. Nakon povratka veze nakratko se pojavi obavijest o oporavku. Obavijest ništa ne pokreće ni ponavlja pa ne može prekinuti reprodukciju.
- 04 / Provjera
- Pet novih automatiziranih scenarija obuhvatilo je prekid, oporavak, pojedinačne pogreške i skrivenu stranicu. Na Pi-ju obavijest ostaje skrivena tijekom normalnih provjera; izgled je pregledan u odvojenom pretpregledu. Još nisam izazvao stvaran mrežni kvar na uređaju kako bih je provjerio ondje.
Ovi primjeri pokazuju pristup koji donosim iz kontrole kvalitete: istražiti uzrok, dokumentirati izmjenu i provjeriti rezultat, uz jasno navođenje onoga što još nije provjereno.
Testiranje i objave
MILA* radi na uređaju koji svakodnevno slušam pa je izmjena dovršena tek nakon provjere.
- Automatizirani testovi. Više od 1100 automatiziranih testova obuhvaća Python pozadinski sustav i JavaScript sučelje: naredbe reprodukcije, zbirku i red čekanja, radio, favorite, postavke i sam alat za instalaciju. Pokreću se prije instalacije izmjena.
- Sigurna instalacija s povratkom na prethodnu verziju. Ažuriranja prolaze kroz instalacijski alat. Najprije stvara sigurnosnu kopiju i provjerava kopiju na mom računalu kontrolnim zbrojem. Zatim zamjenjuje samo programske datoteke i provjerava pokretanje sučelja, podudaranje svake datoteke s izdanjem i ispravnu dostupnost resursa stranice. Ako provjera ne uspije, automatski vraća prethodnu verziju. Glazbene usluge nastavljaju raditi tijekom ažuriranja.
- Provjere na stvarnom uređaju. Nakon ažuriranja na Pi-ju provjeravam status, zbirku, red reprodukcije i radio, a zatim slušanje i dodirno upravljanje. Prolazak testova ne smatram dokazom da je zvuk ispravan.
Povratak na prethodnu verziju obuhvaćen je ciljanim testovima; kontrolirana provjera na stvarnom hardveru još je na popisu.
Hardver i temelj sustava
Fotografije mog sustava za slušanje s dodirnim zaslonom, DAC-om, linearnim napajanjem i zvučnicima. Pozadine su ublažene radi prezentacije.
| Komponenta | Uloga |
|---|---|
| Raspberry Pi 5 | Namjensko računalo koje pokreće streamer |
| NVMe disk | Lokalna pohrana glazbe |
| Topping E50 USB DAC | Audioizlaz |
| 10-inčni dodirni zaslon | Ugrađeno upravljačko sučelje |
| Namjensko linearno napajanje | Napajanje DAC-a |
| Edifier MR5 zvučnici | Moj sustav za slušanje |
Softver: Raspberry Pi OS · Lyrion Music Server · Squeezelite · Python · HTML/CSS/JavaScript
Trenutačno stanje
MILA* je funkcionalan osobni prototip u aktivnom razvoju. Trenutačan fokus su stabilno slušanje, oporavak nakon prekida i dosljedno ponašanje na različitim veličinama zaslona. Neke integracije i tijekovi rada još traže doradu i provjeru u stvarnim uvjetima prije stabilne objave.
Izvorni kod nalazi se u privatnom repozitoriju. Rado ću u razgovoru predstaviti kod, testove i povijest objava.