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,
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
[...forts�ttning f�ljer...]