Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Zelfbouw van een piepkleine maar fijne muziekstreamer  (gelezen 5214 keer)

Offline Bloom

  • Lid
  • Steunpunt: Ja
Zelfbouw van een piepkleine maar fijne muziekstreamer
« Gepost op: 2013/02/20, 14:58:57 »
Je hebt een kleine energievriendelijke en vooral stille minipc of nettop nodig. Voor dit artikel veronderstel ik dat de muziekbestanden op een NAS in het netwerk staan. De minipc of nettop zal bediend worden via een webinterface (smartphone, tablet of netbook) en volledig 'headless' (zonder aangesloten toetsenbord, muis en scherm) draaien.
Je kunt zo'n minipc natuurlijk zelf samenstellen door onderdelen te kopen en die dan samen te bouwen, maar ik koos ervoor om een bestaande nettop te kopen. Met name de Giada A51.

En dat is dus 19 cm hoog, 16 cm diep en 3 cm breed (zonder de voet). Heeft HDMI en VGA (maar die gebruik ik alleen tijdens de installatie) en S/PDIF optisch via mini-TOSlink. Momenteel heb ik hem via usb aangesloten op mijn Beresford externe DAC. Bleek zeer eenvoudig: Debian herkende dat meteen als een geluidskaart en kon er meteen zonder installatie van wat dan ook mee werken. En het verbruik is minder dan 30W als hij muziek staat te spelen. Het systeem wordt standaard geleverd met een 320 GB notebookhardeschijf, maar het kan ook starten van een eenvoudig usb-stickje. Een GUI-loze Debian en met de muziekspeelsoftware neemt minder dan 3 GB in beslag.

Onderstaande instructies gelden voor vrijwel alle Debian-achtigen en ook voor Ubuntu.
Ik vertrek het liefst van Debian Testing omdat dat een rolling release is en je dus nooit meer een nieuwe versie hoeft te installeren. Gewoon upgraden en je krijgt telkens het nieuwste.
Vertrek in elk geval van een mini- of "network install"-ISO. Probeer ook zo'n iso vanaf een usb-stick te installeren in plaats vanaf een usb cd-rom, omdat dat veel en veel sneller is. Je kunt onder Linux Unetbootin (zit in de standaard pakketten van Ubuntu en andere distributies) gebruiken om iso's op een usb-stick te zetten. (Niet van toepassing hier, maar voor oudere computers die geen boot vanaf een usb-stick ondersteunen maar wel vanaf een cd of een floppy kun je de Plop Boot Manager gebruiken om toch vanaf een usb te kunnen installeren door te booten vanaf een floppy of cd-r met die Plop Boot Manager en die laat je dan vanaf de usb-stick booten. Werkt prima!)

Installeer Debian (of Ubuntu) vanaf deze mini- of netinst-ISO normaal, maar vul geen rootwachtwoord in als hij daarom mocht vragen. In verband met de toegang tot de NAS installeer je best je normale gebruikeridentiteit (naam en wachtwoord).
Als je op het eind het keuze scherm krijgt van wat je allemaal kunt installeren, vink dan de standaard desktop en de printserver uit! De openssh server installeren is wel een goed idee, omdat je dan de onderstaande bevelen gemakkelijk kunt kopiëren en plakken vanaf een andere pc met webbrowser. En als het systeem eenmaal headless draait, kun je er ook nog aan via ssh. Onderaan staan standaardgereedschappen aangevinkt.
Na afloop moet het systeem rebooten en krijg je een terminalprompt. Als je de openssh-server geïnstalleerd had, kun je naar een andere computer gaan en via ssh een terminaltoegang openen. Wellicht moet je eerst even op de verse installatie inloggen en met hostname -I het ip-adres opvragen als dat via dhcp toegekend werd.
De onderstaande uitleg is voor Debian Testing, omdat ik die leuker vind dan Ubuntu. Waarom? Omdat het een rolling release is en Ubuntu niet. Debian Testing hoef je dus nooit te herinstalleren of een tijdrovende upgrade naar een nieuwe versie uit te voeren.

Op dit moment heeft het systeempje een dynamisch ip-adres gekregen via dhcp. Dat kan zo blijven, in de meeste thuisnetwerken is zo'n adres immers behoorlijk stabiel. Wil je echter een statisch ip-adres zoals bij je NAS, dan moet je /etc/network/interfaces in rootmodus editeren en de benodigde info invullen. Dat ziet er dan zo uit:
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.0.20
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 192.168.0.1
dns-search mijnnetwerk.nl
De opgegeven ip-adressen zijn voorbeelden, die moet je natuurlijk aanpassen aan je eigen wensen en behoeften.
Nadat je dit in orde gebracht hebt, kun je de nieuwe instellingen activeren via:
aptitude -y install resolvconf //dit dient om /etc/resolv.conf automatisch in te vullen bij een statisch ip-adres
service networking stop; sleep 5; service networking start
Als je via ssh werkte, verbreekt dit laatste de verbinding en moet je eerst opnieuw inloggen op het nieuwe ip-adres.

We gaan eerst zorgen dat we de goeie softwarerepository's activeren. Standaard staan de editors nano en vi geïnstalleerd, maar als je zoals ik van Wordstar-compatibiliteit houdt kun je de editor joe installeren. Zelf verwijder ik ook de apt-listchanges die in Debian standaard geïnstalleerd wordt. Dat pakket zorgt ervoor dat je na iedere updatesessie een overzicht krijgt van de verschillen tussen pakketten die opgewaardeerd worden. Dat is voor de meeste gewone gebruikers helemaal niet interessant en zelfs vervelend. Ubuntu doet dat ook niet, dus weg ermee! Voor systeembeheerders is dit overigens wél nuttig. Ik werk ook graag met aptitude opdat dat een veel beter uitgewerkt en vollediger bevel is dan apt-get. Debian heeft het standaard aan boord, maar Ubuntu vanaf versie 11.04 niet meer. Ga eerst in rootmodus:
sudo -iof
su rooten daarna:
apt-get -y install joe aptitude; aptitude -y purge apt-listchanges
Editeer nu met joe of een andere editor /etc/apt/sources.list zodat het er als volgt uitziet (en Vlamingen kiezen uiteraard .be. ipv .nl. in het onderstaande):
deb ftp://ftp.nl.debian.org/debian/ testing main contrib non-free
deb ftp://ftp.nl.debian.org/debian-security/ testing/updates main contrib non-free
deb ftp://mirror.boxed-it.com/pub/deb-multimedia/ testing main non-free
Het is de bedoeling het systeem compact te houden en dus willen we alleen maar de pakketten installeren die we specifiek vragen en geen aanbevolen of gesuggereerde pakketten.
Editeer /etc/apt/apt.conf en vul dit in:
APT::Install-Recommends "false";
APT::Install-Suggests "false";

Alles nagekeken en exact zo ingetikt? Dan gaan we nu updaten en upgraden voor zover nodig (als je toevallig een 'stable' (Debian Squeeze) geïnstalleerd had, brengt je dit omhoog naar 'testing').
apt-key adv --recv-keys --keyserver pgp.mit.edu 07DC563D1F41B907;aptitude update ; aptitude -y full-upgrade ; aptitude -y install debian-keyring deb-multimedia-keyring ; aptitude update ; aptitude -y install firmware-linux lshw openssh-serverDat laatste is alleen nodig als tijdens de installatie van de iso geen ssh-server gekozen werd en je die toch wel wil hebben.
Debian installeert normaal ook een lichte smtp-server om e-mails naar root te kunnen versturen. Dat is handig als je een server installeert, maar zinloos bij een desktop. Omdat we immers compactheid nastreven, opteer ik ervoor die te verwijderen:
aptitude -y purge exim4 exim4-base exim4-config exim4-daemon-lightBij de Giada A51 verschijnt telkens een waarschuwing in beeld dat er geen firmware geïnstalleerd is voor de Realtek netwerkkaart. Die kun je makkelijk toevoegen via:
aptitude -y install firmware-realteken dan verdwijnt die foutmelding.

Nu hebben we het basissysteem in orde. Als je bij de updates een nieuwe kernel hebt binnengekregen, reboot dan nu eerst het systeem met reboot en log daarna weer in als root (liefst via een ssh-sessie vanaf een andere pc met browser zodat je de rest gewoon kunt kopiëren en plakken).
Log weer in als root via sudo -i of su root en zorg eerst dat je verbinding hebt met de NAS waarop je muziek opgeslagen staat. Dat kan via SMB (het Windows netwerkprotocol), maar als het een kant-en-klare NAS is zal die onder Linux draaien en kun je ook het veel snellere Linux- en Unix-specifieke NFS gebruiken.
Voeg daartoe de volgende regel toe in /etc/fstab:
192.168.0.2:/data/pub/Media/Muziek /media/Muziek nfs4 rw,hard,intr,async,actimeo=0,nodev,nosuid 0 0
Vervang hier het ip-adres door dat van je NAS. Ik heb hier verondersteld dat je muziekdirectory door het NFS-systeem van de NAS geëxporteerd wordt via /data/pub/Media/Muziek: als dat niet zo is, maak dat dan in orde op de NAS en/of corrigeer het pad, anders zal het niet werken!
Voer nu het volgende uit:
mkdir /media/Muziek
chown -R gebruiker:gebruiker /media/Muziek
chmod -R 777 /media/Muziek
aptitude install nfs-common
mount /media/Muziek
Vervang 'gebruiker' door je eigen gebruikersnaam en -groep.

Normaal zou het niet nodig moeten zijn, maar je kunt de taalondersteuning zonodig perfect op Nederlands zetten via:
localedef -v -c -i nl_NL -f UTF-8 nl_NL.UTF-8
update-locale LANG=nl_NL.UTF8
(Vlamingen vervangen hier de nl_NL door nl_BE)

Nu gaan we de geluidsondersteuning installeren. Doe eerst:
aptitude -y install alsa-base alsa-utilsNu gaan we het systeem nog wat efficiënter laten werken links en rechts. Maak het bestand /etc/sysctl.d/60-local.conf aan:
#Tweaked local settings
# Verminder de swapneiging en krimp de inode cache niet agressief in
# Gebruik waarde 20 voor >1 GB RAM
vm.swappiness=10
vm.vfs_cache_pressure=50
#sidux tweaks
net.core.rmem_default = 524288
net.core.rmem_max = 524288
net.core.wmem_default = 524288
net.core.wmem_max = 524288
net.ipv4.tcp_wmem = 4096 87380 524288
net.ipv4.tcp_rmem = 4096 87380 524288
net.ipv4.tcp_mem = 524288 524288 524288
net.ipv4.tcp_rfc1337 = 1
net.ipv4.ip_no_pmtu_disc = 0
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_ecn = 0
#debian tcp window scaling errata fix for buggy routers
#net.ipv4.tcp_rmem=4096 65536 65536
#net.ipv4.tcp_wmem=4096 65536 65536
# Do not send ICMP redirects (we are not a router)
net.ipv4.conf.all.send_redirects = 0
# Do not accept IP source route packets (we are not a router)
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.tcp_fin_timeout=30
#net.ipv4.route.gc_timeout=300
net.ipv4.tcp_tw_reuse=1
#disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Als je wél IPv6 wenst, zet dan commentaartekens # voor de laatste drie instructies in 60-local.conf.
Als je router en je provider geen IPv6 ondersteunen, werkt je systeem sneller als je het uitschakelt.

Vervolgens voorzien we volautomatisch uitvoeren van upgrades zonder de gebruiker ermee lastig te vallen bij elke boot en zodra het netwerk actief is.
#!/bin/sh
# controleer internetconnectiviteit
if ! ping -c 1 -w 1 8.8.8.8 >/dev/null; then
  if ! ping -c 1 -w 1 194.7.1.4 >/dev/null; then
    echo PROBLEM: No internet connectivity! >/var/log/autoupgr.log
    exit 0
  fi
fi
#controleer NAS en hecht muzieshare aan als dat nog niet gebeurd is
if  ping -c 1 -w 1 192.168.0.2 &>/dev/null; then
    while [ ! "$(ls -A /media/Muziek)" ]; do mount /media/Muziek; sleep 3; done
    echo 'INFO: NFS volume(s) aangehecht.' >>/var/log/autoupgr.log
  else
    echo 'PROBLEEM: NFS volume(s) niet beschikbaar!' >>/var/log/autoupgr.log
fi
# volautomatische full-upgrade
apt-get update
export DEBIAN_FRONTEND=noninteractive
yes '' | apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade
echo 'INFO: full-upgrade gebeurd.' >>/var/log/autoupgr.log
exit 0
Maak bovenstaand bestand aan als autoupgr in /etc/network/if-up.d/
en maak het uitvoerbaar via sudo chmod +x /etc/network/if-up.d/autoupgrReboot nu het systeem met
sudo rebootLog weer in als root via sudo -ien controleer of de NFS-aanhechting gelukt is en de systeemupgrade geslaagd:
cat /var/log/autoupgr.log
Nu gaan we de muziekspeelsoftware installeren en configureren. Zorg dat je nettop aangesloten is op de geluidinstallatie. Ik zal er hier vanuit gaan dat je net zoals ik een externe DAC gebruikt, aangesloten via de optische S/PDIF, maar ik zal tussendoor ook tonen hoe het moet als je een usb-DAC gebruikt.
Verfieer eerst het reeds geïnstalleerde ALSA-geluidssysteem correct werkt.
aplay -ltoont de aangesloten hardwarekaarten. Dat ziet er bij een Giada A51 zo uit:
**** List of PLAYBACK Hardware Devices ****
card 0: Generic [HD-Audio Generic], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: CODEC [USB Audio CODEC], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: SB [HDA ATI SB], device 0: ALC662 rev1 Analog [ALC662 rev1 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: SB [HDA ATI SB], device 1: ALC662 rev1 Digital [ALC662 rev1 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
Kaart 1 toestel 0 is de usb-DAC die aangesloten is.
Kaart 2 toestel 1 is de optische S/PDIF die in de Giada ingebouwd zit. Als je de usb-DAC loskoppelt, wordt deze aansluiting kaart 1 toestel 1.
Je kunt nu de usb-aansluiting testen via:
speaker-test -Dplughw:1,0 -c2
en dan de optische S/PDIF via:
speaker-test -Dplughw:1,1 -c2 // als de usb niet ingeplugd is
speaker-test -Dplughw:2,1 -c2 // als de usb wél ingeplugd is
Als je niets hoort, controleer dan met het terminalprogramma alsamixer dat de kanalen niet geMUTEd zijn. Als er bij een kanaal MM staat, is dat zo. Tik dan op 'M' op het te 'unmuten'.
Bij sommige computers wordt de S/PDIF standaard uitgeschakeld bij elke boot. Voer dan het volgende uit om dat weer aan te zetten:
ieset audio onWerkt het nu? Zo ja, zet die instructie dan in /etc/rc.local.
Je kunt ook apparaatonafhankelijke "toestellen" gebruiken, waarbij het niet uitmaakt of de usb insteekt of niet. Die lijst kun je zien met:
aplay -L(hoofdletter L ipv kleine)
en dan zie je dit:
null
    Discard all samples (playback) or generate zero samples (capture)
hdmi:CARD=Generic,DEV=0
    HD-Audio Generic, HDMI 0
    HDMI Audio Output
default:CARD=CODEC
    USB Audio CODEC, USB Audio
    Default Audio Device
(...)
iec958:CARD=SB,DEV=0
    HDA ATI SB, ALC662 rev1 Digital
    IEC958 (S/PDIF) Digital Audio Output
Dat is dus een hele hoop. De analoge aansluitingen kun je hier negeren en heb ik er dus uitgewied. Ons interesseren alleen de S/PDIF en de USB.
iec958:CARD=SB,DEV=0 geeft je de S/DIF-aansluiting (iec958 is een andere naam voor S/PDIF).
default:CARD=CODEC geeft je de USB-aansluiting naar de externe DAC toe (hier eentje van Beresford).
En deze toestelnamen veranderen dus niet, ongeacht welk apparaat al dan niet aangesloten of ingeschakeld is.
Probeer te testen of deze toestellen ook inderdaad werken:
speaker-test -Dtoestelname -c2dus voor usb:
speaker-test -Ddefault:CARD=CODEC -c2en voor s/pdif:
speaker-test -Diec958:CARD=SB,DEV=0 -c2Alles okee?
Dan installeren we en configureren we nu de muziekafspeelsoftware...
aptitude -y install mpd mpc subversion
cd /opt
svn checkout http://client175.googlecode.com/svn/trunk/ client175
cd client175
joe site.conf
Zoek in het configuratiebestand naar de muziekdirectory en verander die naar /media/Muziek.
De standaardpoort voor de webinterface staat op 8080. Als je dat zoals ik niet wil, zoek dan naar het uitgecommentarieerde 'server.socket_port: 80', haal het commentaarteken # weg en vervang de 80 door de poort die jij wenst. Ik koos voor 8888. Je kunt natuurlijk ook 80 laten staan als je liever geen poortnummer opgeeft en er geen andere webserver op dit systeem draait.
Nu moeten we nog de configuratie van mpd in orde maken.
cd
service mpd stop
joe /etc/mpd.conf
Zoek de volgende parameters en vervang ze door wat hieronder staat:
music_directory    "/media/Muziek"
playlist_directory "/media/Muziek/.mpd/playlists"
db_file    "/media/Muziek/.mpd/mpd.db"
log_file    "/media/Muziek/.mpd/mpd.log"
state_file    "/media/Muziek/.mpd/state"
sticker_file       "/media/Muziek/.mpd/sticker.sql"
user               jouwgebruikersnaam
bind_to_address    "127.0.0.1"
bind_to_address    "192.168.0.20"
Vergeet niet achter 'user' je eigen gebruikersnaam in te vullen en achter de tweede 'bind_to_address' het juiste statische of dynamische ip-adres van deze computer.
Verderop in /etc/mpd.conf moeten we ook nog de audio-instellingen corrigeren:
audio_output {
type "alsa"
name "Beresford USB Audio"
# device "iec958:CARD=SB,DEV=0" #gebruik dit voor de optische S/PDIF van de Giada
device "default:CARD=CODEC"  #en dit is dus de Beresford USB Audio aansluiting
format "96000:32:2" # optional
auto_resample   "no"            # this is ALSA telling not to touch the stream
mixer_type "none" # volume control by ext. amp.
}
Nu voeren we nog enkele instructies uit:
joe /root/dompd
chmod +x /root/dompd
Neem in het tekstbestand /root/dompd het volgende op (pas de gebruiker aan):
chmod -R 777 /var/run/mpd
chown -R gebruiker:gebruiker /var/run/mpd
iecset audio on
if ! $(ps -e|grep mpd); then
  service mpd start
fi
sleep 20
python /opt/client175/server.py &
en roep dat bestand dan aan vanuit rc.local, net voor de 'exit 0'.
/root/dompd
Voer dit laatste nu even manueel uit, dan zou de Music Player Daemon mpd gestart moeten worden en enige tijd later de webinterface Client175. Let wel: dit is een rijke webinterface bedoeld voor normale schermen. Wil je liever een beknoptere interface voor een smartphone, dan kun je hier (klik!) een gepaste vinden.

Open je webbrowser en surf naar http://192.168.0.20:8888/static/index.htm
en dan zou je de Client175 interface moeten zien en kun je muziek opzoeken en laten afspelen. Let wel: de eerste keer moet mpd een database aanleggen van al je muziek en het duurt wel even vooraleer hij dat allemaal gescand heeft op je NAS. Laat hem dus voldoende lang aanstaan daarvoor. Muziek die nog niet in de database zit, kun je niet vinden en afspelen via het systeem. Even geduld dus.
Je kunt van dit systeempje ook een volwaardige HTPC maken door XBMC te installeren (zit in de standaardpakketten), maar dat zou ons hier over de maximale limiet van aantal tekens brengen.
Dat is het zowat, denk ik. Als er vragen zijn, stel ze maar!

Offline Ramana

  • Lid
  • Steunpunt: Nee
Re: Zelfbouw van een piepkleine maar fijne muziekstreamer
« Reactie #1 Gepost op: 2013/02/21, 09:12:51 »
Leuke toepassing en vooral een helder en leerzaam verhaal.  Prikkelt om ook zo iets te gaan doen....

Offline Bloom

  • Lid
  • Steunpunt: Ja
Re: Zelfbouw van een piepkleine maar fijne muziekstreamer
« Reactie #2 Gepost op: 2013/02/21, 10:33:31 »
Het is vooral veel goedkoper dan wat je voor eender welke commercieel verkrijgbare muziekstreamer zou moeten betalen.
De Client175 webinterface ziet er overigens zo uit:


Offline erik1984

  • Lid
    • erik1984
  • Steunpunt: Nee
Re: Zelfbouw van een piepkleine maar fijne muziekstreamer
« Reactie #3 Gepost op: 2013/02/21, 11:48:39 »
Mooie handleiding Bloom.

MPD is leuk speelgoed. Wat ik me wel afvraag, is het echt nodig om die audio_output in de configuratie zo uitgebreid neer te zetten? Zelf heb ik er alleen het volgende staan en dat werkt ook:
audio_output {
        type    "pulse"
        name    "Mijn PulseAudio-uitvoer"
}


Of moet dat ivm ALSA en de specifieke geluidskaart van dat kastje?

Offline Bloom

  • Lid
  • Steunpunt: Ja
Re: Zelfbouw van een piepkleine maar fijne muziekstreamer
« Reactie #4 Gepost op: 2013/02/21, 12:19:16 »
Ik heb alleen ALSA geïnstalleerd en geen pulseaudio, dus jouw configuratie was geen optie.
Overigens is de ALSA-configuratie niet moeilijker, alleen heb ik er nog een paar opties bij gezet om geen automatische bitrateconversies uit te voeren maar alles als 96 kHz en 32 bit naar buiten te sturen.

Offline Bloom

  • Lid
  • Steunpunt: Ja
Re: Zelfbouw van een piepkleine maar fijne muziekstreamer
« Reactie #5 Gepost op: 2015/07/14, 09:24:56 »
Vanaf kernel 4.0 heb ik er last van dat er periodiek drop-outs voorkomen in de geluidsweergave. Omdat mijn flac-bestanden via NFS binnenkomen, dacht ik eerst aan een netwerkprobleem. Maar zelfs een lokale buffer op de streamer om ruim tien seconden aan muziek te cachen vooraleer de weergave begint, loste het drop-outprobleem niet op. Dan kon het dus niet het netwerk zijn, maar moest het iets lokaals zijn. Uiteindelijk besloot ik dat het om de kernel moest gaan.
Ik heb de gewone kernel nu vervangen door de real-time kernel en dat loste het probleem op: geen drop-outs meer!

sudo apt-get install linux-image-rt-amd64 irqbalance

Overigens is het pakket irqbalance wel nuttig om te installeren in elk multicore-processorsysteem. Het verdeelt alle IRQ's (systeeminterrupts) over alle cores in plaats van alleen over de eerste.
Na het installeren van een nieuwe kernel moet je natuurlijk herstarten en kun je daarna de oude kernel verwijderen.