OpenWrt: mpd, der "music player daemon"

Update: 10.04.2015 keine Probleme mit ogg-Dateien unter 14.07 Barrier Breaker

Gnome Music Player ClientIn "OpenWrt: Alternative Routersoftware (auf TP-Link TL-WDR3600)" wurde kurz beschrieben, wie OpenWrt installiert wird. Dieser Artikelt baut darauf auf. Hier geht es darum, wie man auf dem Router den "mpd" installiert. Mit einer Android-App kann dann eine Musiksammlung von einer externen Harddisk oder einem NAS abgespielt werden.

Das Fazit: Heute, im April 2015 und mit einiger "Echtwelt-Erfahrung" mit Streaming (dlna) ziehe ich die Musiksteuerung via mpd derjenigen via dlna vor. mpd ist direkter, geht gleich nach dem Einschalten und wechselt Songs direkt wie es auch ein guter CD-Player macht. Bei dlna benötigt alles seine Zeit. 

Notwendige Hardware

  • WLAN-Router (bspw. TP-Link TL-WDR3600 oder TL-WDR4300 mit 8MB Flash, 128MB Ram, 2xUSB 2.0, 560MHz MIPS CPU)
  • USB-Stick, ab 512MB (8GB empfohlen, ein kleiner Stick steht nicht weit vor, bspw der  "USB Cruzer Fit 8GB" von SanDisk) für die Erweiterung des Hauptverzeichnisses ( / ). Die lediglich 8MB Flashspeicher auf dem Router reichen nicht aus.
  • USB-Audio, (bspw. Soundblaster MP3+ mit Hardware-Mixer, oder den sehr preiswerten LogiLink UA0078 mit C-Media Audiochip (ein einfacher Test dieses Adapters erfolgt in Kürze)).
  • USB2.0-Hub
  • Verstärker oder Aktiv-Boxen

Installation

OpenWrt Dokumentation zu USB-Audio: http://wiki.openwrt.org/doc/howto/usb.audio

USB-Audio

opkg update && opkg install kmod-usb-audio kmod-sound-core alsa-utils librt

Muskiplayer-Dämon (mpd)

opkg install mpd

Konfiguration

Schwierigkeiten macht unter Umständen, welches Device man verwenden sollte. Das kann man mit einem der beiden Kommandos

aplay -L
amixer

herausfinden. Das passende Device (Gerät) wird unter mixer_control eingetragen.

/etc/mpd.conf

Die Pfade können frei angepasst werden. In diesem Beispiel liegt das Musikverzeichnis auf der 2. Festplatte, die an den Router angeschlossen wurde. Die Wiedergabelisten und die Datenbank werden geschickterweise ebenfalls auf die Harddisk geschrieben. Möglicherweise muss das Verzeichnis .mpd per Hand erstellt werden: mkdir /mnt/sdb1/.mpd . So kann man einfach die Harddisk wechseln ohne jedesmal die Datenbank neu generieren zu müssen. (Der Router muss dafür ausgeschaltet werden).

music_directory      "/mnt/sdb1/music"
playlist_directory    "/mnt/sdb1/music/playlists"
db_file                    "/mnt/sdb1/.mpd/database"
log_file                   "/mnt/sdb1/.mpd/log"
pid_file                   "~/.mpd/pid"
state_file                "/mnt/sdb1/.mpd/state"
audio_output {
        type               "alsa"
        name             "My ALSA Device"
        device            "hw:0,0"
        mixer_control "Master"
}

Anpassen von /etc/init.d/mpd

Der "Mixer" (Lautstärkeregelung) wird womöglich falsch eingestellt. In der Datei /etc/init.d/mpd muss dafür eine Zeile abgeändert werden:

Von:
[ -x /usr/bin/amixer ] && /usr/bin/amixer set PCM 40

zu:
[ -x /usr/bin/amixer ] && amixer set Master,0 20%,20% unmute >/dev/null 2>&1

Der mpd soll sich auch etwas "netter" mit den anderen laufenden Programmen vertragen. Dafür ändert man die Zeile:
nice -n -10

zu:
nice="nice -n -20"

Und:
#service_start /usr/bin/mpd

zu:
$nice /usr/bin/mpd

Angepasste und erweiterte Version von /etc/init.d/mpd

Die nachffolgende Version sieht in /etc/mpd.conf nach, wo sich das Datenbankverzeichnis findet und erstellt es gegebenenfalls, wenn es nicht vorhanden ist. Die Datei ist diesem Artikel auch angehängt (Umbenennen von 'mpd.' zu 'mpd'). Nicht vergessen, das x-Flag zu setzen, wenn man sie benutzen will anstelle der originalen Version.

#!/bin/sh /etc/rc.common
# Copyright (C) 2007-2011 OpenWrt.org
# extended by iNetCom/jh 2012-12-14

START=93
start() {
    #create mpd directories
    pld=`grep ^playlist_directory /etc/mpd.conf | cut -d "\"" -f 2 | sed "s/~/\/root/g"`
    mpddir=`grep ^db_file /etc/mpd.conf | cut -d "\"" -f 2 | sed "s/db_file//g" | sed "s/\/database//g"`
    if [ ! -d $pld ]; then
        mkdir -m 0755 -p $pld
    fi
    if [ ! -d $mpddir ]; then
        mkdir -m 0755 -p $mpddir
        echo "created $mpddir"
    fi
    [ -x /usr/bin/amixer ] && amixer set Master,0 10%,10% unmute >/dev/null 2>&1
    if [ -x /bin/nice ]; then
        nice="nice -n -20"
    fi
    $nice /usr/bin/mpd   
}
stop() {
    service_stop /usr/bin/mpd
}

ogg-Dateien benötigen zu viel Rechenzeit: kein Problem ab Version 14.07 Barrier Breaker

ogg-Dateien können unter Barrier Breaker problemlos abgespielt werden. Es müssen keine besonderen Vorkehrungen getroffen werden.

Die von mpd für das Abspielen von ogg-Dateien verwendete Bibliothek verwendet Fliesskomma-Arithmetik (floating point). Da den meisten, wenn nicht zur Zeit allen, Routern ein Fliesskommaprozessor (FPU) fehlt, ist das sehr rechenintensiv. Die Lösung dafür liegt in der Verwendung der Bibliothek libvorbisidec statt libvorbis, die mit einer reinen Integer-Arithmetik auskommt (siehe http://www.nslu2-linux.org/wiki/HowTo/BuildMpd).
Eine Installation von

opkg install libvorbisidec

reicht leider nicht aus. Nach einer Lösung wird gesucht (ohne gleich das ganze Packet selber bauen zu müssen).

Clients (Steuerung)

Hier finden sich zahlreiche Clients:

http://mpd.wikia.com/wiki/Clients

Sehr komfortabel, wie eine Fernbedienung zu gebrauchen sind diese für Android oder iOS (Apple):

Android

iOS

 

AnhangGröße
mpd.720 Bytes