Der Music Player Daemon (MPD) ist ein Musik-Player, der Musik an verschiedenste Ausgaben senden kann, wie z. B. an Icecast, lokale Soundkarten, Jack, usw. Auch die Eingaben sind vielfältig, wie z. B. Icecast.
Um einen MPD zu steuern, gibt es viele verschiedene Clienten, eine vollständige Liste aller MPD-Clienten gibt es hier. Diese Clienten geben jedoch nicht direkt den Ton aus sondern dienen nur der reinen Steuerung.
Es wird übrigens Jack verwendet weil Mumble in Verbindung mit Bots nicht immer zuverlässig einen PulseAudio-Ausgabekanal belegt. Jack ist hier zuverlässiger.
Vor allem aber ist die CPU-Belastung von Jack deutlich geringer, siehe hier.
Daher müssen wir uns Mumble aus den Quellen selbst kompilieren, um den Jack-Patch integrieren zu können.
Benutzer in Mumble sollen Zugang zu einem wie auch immer gearteten Interface bekommen, um die Musik eines Mumble-Bots steuern zu können. Dazu gibt es auf dem Server einen Fundus an freier Musik.
Manche Benutzer bekommen direkten Zugang über das Netzwerk und können somit jeden MPD-Clienten verwenden (z. B. gmpc); andere erhalten Zugriff auf ein Web-Interface (Patchfork), über das man alles machen kann.
Alternativ können Benutzer mit SSH-Zugriff auf den Server direkt in der Serverkonsole das Programm ncmpcpp verwenden.
Es ist natürlich möglich, mit diesem Setup beliebig viele Kombinationen aus MPD und Mumble zu erstellen; dazu muss lediglich jedes Mumble ein eigenes Verezeichnis bekommen, siehe unter Mumble Portabel - Linux.
Auch MPD benötigt je ein eigenes Verzeichnis. Und es wird ein neues Startscript benötigt, welches hier noch hochgeladen wird.
Allgemein gesagt muss man bei jedem weiteren Bot folgende Dinge tun: MPD kopieren, Mumble kopieren, bei Mumble das Zertifikat löschen und per x11vnc einrichten lassen, dann in startall.sh einfach in die drei oberen Zeilen die Bots eintragen.
/home/music/ /home/bot/mpd/ /home/bot/mumble/
Zuerst werden alle Dinge einzeln eingerichtet und zum Schluss wird dies alles in ein Script gegossen, was alle automatisch startet.
Dieses Setup läuft hier in einer virtuellen Maschine (KVM), hat 160 MiB RAM und eine vCPU. Belegt sind nach dem Start ca. 102 MiB RAM. Die CPU-Belastung innerhalb der VM liegt dauerhaft bei ca. 10 %.
apt-get -y install build-essential qt4-dev-tools libqt4-dev \ libspeex1 libspeex-dev libboost-dev libasound2-dev libssl-dev g++ \ libspeechd-dev libcap-dev libspeexdsp-dev \ libprotobuf-dev protobuf-compiler libogg-dev \ libavahi-compat-libdnssd-dev libsndfile1-dev libxi-dev \ git xvfb x11vnc libjack-jackd2-dev jackd2 openbox
Die Frage nach der Echtzeit Priorität für jackd2 kann man mit Nein beantworten.
Wir benötigen eine neuere Version von MPD als die bei Debian 7 verfügbare. Dazu greifen wir zu den Backports.
Wie man Backports einbindet, steht detailiert unter https://backports.debian.org/Instructions/.
Im Prinzip reicht es aus, die folgende Zeile ans Ende der Datei /etc/apt/source.list anfügen:
deb https://ftp.de.debian.org/debian wheezy-backports main
Danach ein
apt-get update && apt-get -t wheezy-backports install mpd
Hinweis: Selbst kompilieren fällt weg, da mpd eine neuere Version der glib benötigt (>= 2.16).
Damit MPD nicht System-seitig läuft, ändert man die Datei /etc/default/mpd und setzt den Wert von START_MPD auf false.
Da bei der Installation direkt MPD gestartet wurde, beendet man es mit
service mpd stop
Um alles beisammen zu haben, erstellt man den neuen Benutzer „bot“:
adduser bot
Erstellung des Musik-Verzeichnisses
mkdir /home/music && chown bot /home/music
Alle weiteren Anweisungen in dieser Anleitung führt man nur noch als Benutzer „bot“ aus, indem man den Kontext wechselt:
su - bot
Jetzt wäre ein guter Zeitpunkt, etwas Musik ins Musik-Verzeichnis zu kopieren, wie auch immer man dies anstellen möchte.
Zur Ersteinrichtung muss der Jack-Server laufen:
jackd --no-realtime -d dummy >/dev/null 2>&1
Es wird der Treiber „dummy“ verwendet, damit man keine echte Soundkarte benötigt.
Da auf dem Linux-Server kein XServer läuft, benötigt man einen Fake-Bildschirm, den Mumble zur Darstellung nutzen kann; hier verwenden wir xvfb (X virtual frame buffer). In diesen Fake-Bildschirm kann man sich auch mit VNC einklinken.
Starten kann man diesen Fake-XServer mit:
Xvfb -screen 0 800x600x8 >/dev/null 2>&1 &
Damit ein gestartetes Programm später auf den virtuellen XServer zugreifen kann, wird es wie folgt gestartet:
DISPLAY=:0 programm
Dies ist später beim Start von Mumble relevant.
Benötigte Verzeichnisse erstellen:
mkdir -p mpd/playlists
Nachvolgend die vollständige Konfigurationsdatei mpd.conf, die man im Verzeichnis /home/bot/mpd/ erstellt oder direkt herunterlädt mit:
wget https://wikiarchiv.natenom.de/_export/code/mumble/audiobots/music_bot_mpd_mumble_jack?codeblock=12 -O ~/mpd/mpd.conf
music_directory "/home/music" playlist_directory "/home/bot/mpd/playlists" db_file "/home/bot/mpd/tag_cache" log_file "/home/bot/mpd/mpd.log" pid_file "/home/bot/mpd/pid" state_file "/home/bot/mpd/state" sticker_file "/home/bot/mpd/sticker.sql" bind_to_address "localhost" input { plugin "curl" } audio_output { type "jack" name "mpd_jack" mixer_type "software" } filesystem_charset "UTF-8" id3v1_encoding "UTF-8"
Der Mixer-Typ ist auf Software eingestellt, damit man im MPD-Clienten die Lautstärke auch ohne Soundkarte verändern kann.
Der Name (mpd_jack) hat nichts mit der Benennung der Jack-Ports zu tun sondern es ist der Name, wie er z. B. in MPC-Clienten als Ausgabe auftaucht.
cd && mpd mpd/mpd.conf
Die Meldung über die fehlende Datei tag_cache kann man ignorieren, sie wird automatisch angelegt.
Mumble aus git holen:
git clone git://github.com/mumble-voip/mumble.git mumble cd mumble && git submodule init && git submodule update git checkout tags/1.2.8 wget "https://sourceforge.net/p/mumble/patches/_discuss/thread/1bfdbda2/a90e/attachment/mumble-jack-support.patch" -O mumble-jack-support.patch git apply mumble-jack-support.patch qmake CONFIG+="no-11x no-pulseaudio no-oss no-server pch no-bonjour no-g15 no-portaudio no-speechd opus jack packaged" main.pro -recursive make -j3 #Jetzt befindet sich das startbare Mumble im Unterordner release.
Mumble kann man erst einrichten, wenn Xvfb und Jack laufen.
Man muss Mumble anweisen, den entsprechenden Fake-XServer zu verwenden und kann ihn wie folgt starten:
cd && DISPLAY=:0 ./mumble/release/mumble >/dev/null 2>&1 &
Jetzt kann man auf dem Server x11vnc starten:
DISPLAY=:0 x11vnc >/dev/null 2>&1 &
Nun lauscht x11vnc auf dem Server auf Port 5900 an localhost. Damit man hierauf Zugriff erhält, verwendet man ssh von zuhause aus:
ssh -L 5900:localhost:5900 bot@server 'x11vnc -localhost -display :0'
Jetzt hat man auf seinem lokalen Rechner Zugriff auf den Port 5900, der auf den Server weitergeleitet wird und kann z. B. vncviewer starten:
vncviewer localhost
Jetzt kann man Mumble für einen Bot entsprechend einrichten, siehe unter Mumble-Einstellungen für Bots optimieren:
Wichtig ist jetzt, dass man Mumble nach der Konfiguration ordentlich beendet, da dann erst die Konfiguration gespeichert wird.
Man sollte natürlich also in der Lage sein, sich mit MPD zu verbinden und einen bereits hochgeladenen Song abzuspielen.
Ich verwende z. B. gmpc über einen SSH-Tunnel mit folgendem Aufruf:
ssh -L 6600:localhost:6600 bot@serverip -N
Eine gute Anleitung zu gmpc gibt es unter https://wiki.ubuntuusers.de/GNOME_Music_Player_Client.
Der Aufbau der Verbindung mit Jack funktioniert nur dann, wenn MPD Musik abspielt, daher kann man den folgenden Schritt weglassen sich darauf verlassen, dass das später vorgestellt Script alles richtig macht :)
So verbindet man die „Ausgabe von MPD“ und die „Eingabe von Mumble“ miteinander:
jack_connect "mumble:input" "Music Player Daemon:left"
Wir nutzen übrigens nur einen Kanal, da der Sound sonst übersteuert ist.
Jetzt, da alles eingerichtet ist, kann man beginnen, alle Vorgänge mit einem Bash-Script zu automatisieren, damit beim Start des Servers nur noch dieses Script ausgeführt werden muss, z. B. indem man es in /etc/rc.local einträgt.
Dazu gibt es ein Script, welches man entweder selbst einfügen kann oder sich herunterlädt mit
cd && wget https://wikiarchiv.natenom.de/_export/code/mumble/audiobots/music_bot_mpd_mumble_jack?codeblock=23 -O start.sh
In beiden Fällen muss man es danach noch ausführbar machen mit:
chmod a+x start.sh
#!/bin/bash #Start the Bot :) killall -9 jackd killall -9 Xvfb killall -9 mumble killall mpd echo Sleeping 5 secs... #nur zur Sicherheit sleep 5 echo Starting jackd... jackd --no-realtime -d dummy >/dev/null 2>&1 & #Dummy-Ausgabe, da der Server keine Soundkarte hat echo Sleeping 10 secs... #nur zur Sicherheit sleep 10 echo Starting mpd... mpd mpd/mpd.conf & echo Starting Xvfb... Xvfb -screen 0 800x600x8 >/dev/null 2>&1 & sleep 5 #nur zur Sicherheit echo Starting mumble DISPLAY=:0 ./mumble/release/mumble mumble://mumble.natenom.com:64738 -m >/dev/null 2>&1 & echo Sleeping 2 secs... sleep 2 DISPLAY=:0 /usr/bin/openbox & # Die folgende Schleife ist notwendig, um Mumble immer wiedermit dem Jack-Port von MPD zu verbinden, da diese Verbindung z. B. beendet wird, sobald man in MPD die Wiedergabe beendet. while true; do jack_connect "mumble:input" "Music Player Daemon:left" >/dev/null 2>&1 sleep 5 done
Nun loggt man sich als Benutzer bot ab, ist wieder root und fügt in die Datei /etc/rc.local vor der letzten Zeile „exit 0“ folgenden Text ein:
su - -c "./start.sh" mpd &
Damit wird alles beim Start des Server automatisch gestartet.