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