Hur man bygger jukebox med bara Debian-komponenter

D� jag k�pte en ny dator som hade processorkraft tillr�cklig f�r att avkoda MPEG-musik och spela upp den b�rjade vi planera f�r en jukebox i korridoren. Datorn skulle hur som helst st� i ett f�rr�d med n�tanslutning och agera CPU-server lagomt l�ngt bort fr�n �ron som ogillar fl�ktljud, s� den skulle alltid vara tillg�nglig. En till i korridoren hade en (n�got defekt) f�rst�rkare som han hittat i en container, s� vi saknade bara h�gtalare och kablage.

H�gtalare visade sig vara ganska l�tt att hitta till ett rimligt pris p� pantbanksauktion. Sondering p� visningen gav ett antal t�nkbara alternativ, varav korridorens uts�nda ropade in ett par f�r 260 kronor. Kablar inhandlades ute i k�pcentret Tornby, givetvis billigaste modellen med klena ledare, fem kronor metern. V�l hemma och med kablage draget genom v�ggar och kontakter ihopsatta m�rkte vi en sak som vi gl�mt, det �r v�ldigt bra med jord i kabeln mellan dator och f�rst�rkare. Kort sagt, det brummade bara.

L�gprisboden i Ryds centrum kom till r�ddningen och s�lde oss jordad kabel f�r sex kronor metern. Efter nytt kabeldragande och donande med kontakter lyckades musik produceras. Folkets jubel!

Ett anv�ndarv�nligt gr�nssnitt till jukeboxen beh�vdes givetvis. Min m�ls�ttning n�r jag b�rjade med det var att f�rs�ka skriva ett eget p� under en timma genom att bara anv�nda program som f�ljer med Debian-distributionen av Linux. Sj�lvklart tog det l�ngre tid �n en timme innan dagens resultat f�rel�g och man m�ste str�cka sig till att s�ga att en C-kompilator medf�ljer och kan anv�ndas f�r egna program, men en rudiment�r version var f�rdig p� under en timme.

Det stora problemet med version ett var att n�r den f�rsta l�ten hade spelats och den v�ntade p� att f� spela fler s� drog jukeboxen �ver 90% CPU. F�r att f�rklara det s� m�ste jag f�rst n�mna hur jag lade upp det hela.

Till att b�rja med delade jag upp jukeboxen i tv� delar, en server som sk�ter sj�lva spelningen och h�ller ordning p� ordningen l�tar ska spelas i och klienter som ber servern spela l�tar (n�ja, filnamn egentligen). Klienterna sk�ter all kontakt med anv�ndaren och kommunicerar med servern genom att skriva filnamn till en namngiven r�rledning som skapats med mkfifo innan. I mitt fall valde jag att anv�nda /var/local/juke som namn p� r�rledningen.

Ett problem med att l�sa kommunikationen med en namngiven r�rledning �r att hantera n�r man ska v�nta p� att en klient skriver n�got till den. Innan n�gon har skrivit till den �r det inga problem, l�sningen blockerar tills det finns n�got att l�sa. V�rre blir det n�r man l�st det som skrivits till den och vill blockera vid l�sning igen. F�rs�ker man l�sa nu, och ingen klient h�ller r�rledningen �ppen f�r man direkt ett filslut. Resultatet blir en slinga som ligger och l�ser konstant och drar CPU.

D� mina enkla klienter bara gjorde en echo till r�rledningen och d�rmed i allra h�gsta grad inte h�ll den �ppen efter skrivningen blev f�ljdaktligen resultatet att demonen drog m�ngder av CPU.

L�sningen p� detta problem fick bli att skriva serverdelen i C och f�nga filslutet och helt enkelt st�nga r�rledningen och direkt �ppna den igen. D� �r det fritt fram att l�gga sig i blockerande v�ntan p� en ny skrivning igen.

Klienter �r enklare att skriva eftersom de inte beh�ver g�ra s� mycket. D� kommunikationen med servern �r enkelriktad kan de inte g�ra s� mycket mer �n att visa upp ett vackert gr�nssnitt och skicka iv�g filnamn till servern n�r anv�ndaren v�ljer n�got.

Klienten som jag tog fram f�r korridoren bygger p� att alla MPEG-filer ligger i ett bibliotek (ett bibliotek med symboliska l�nkar g�r ocks�). Namnen p� filerna avg�r hur de presenteras. Formatet p� filnamn jag anv�nder �r Artist_-_L�ttitel.mp[23] d�r alla mellanrum byts ut mot _. F�r att slippa att n�gon skulle beh�va vara inloggad n�r jukeboxen k�rde s� skapades en speciell anv�ndare, juke, som vid inloggning k�r ett specialprogram. Detta program �r ett enkelt skalprogram som anv�nder ls f�r att f� fillistan och sedan skickar det vidare till ett perlprogram som stuvar om det till en menyfil som pdmenu kan anv�nda. Slutligen k�rs s� pdmenu med denna menyfil.

[...forts�ttning f�ljer...]


<andjo@ctrl-c.liu.se>
Last modified: Wed Jul 22 17:24:04 MET DST 1998