Einfache Anleitung für Linux MPD+Brutefir gesucht
-
- Aktiver Hörer
- Beiträge: 81
- Registriert: 18.04.2012, 21:33
- Wohnort: Rheinstetten (bei Karlsruhe)
Einfache Anleitung für Linux MPD+Brutefir gesucht
Hallo,
ich habe mir auf einem alten Notebook Ubuntu 12.04 LTS mit MPD aufgesetzt und bin fasziniert, wie gut das einerseits klingt, und auch wie stabil und schnell das übers Tablet mit MPDroid zu steuern ist.
Nun möchte ich aber die mit Acourate erstellten Filter-Files wie in JRiver gewohnt auch in o.g. Konfiguration einbinden. Nach ein wenig Recherchieren hier und im Web scheint sich hierfür wohl Brutefir durchgesetzt zu haben?! Allerdings konnte ich auch nirgends eine einfache Anleitung finden, wie man die fertigen Filter-Files in der mpd.conf einbinden kann. Und die Brutefir Konfigdateien scheinen nur mit jahrelangem Studium beherrschbar zu sein ...
Ist das denn wirklich so kompliziert, oder kann mir jemand eine einfache Anleitung geben, was ich tun muss, um zur bisherigen mpd.conf Brutefir mit meinen Filterdateien zu konfigurieren? Tausend Dank schon mal
Gruß
Matthias
ich habe mir auf einem alten Notebook Ubuntu 12.04 LTS mit MPD aufgesetzt und bin fasziniert, wie gut das einerseits klingt, und auch wie stabil und schnell das übers Tablet mit MPDroid zu steuern ist.
Nun möchte ich aber die mit Acourate erstellten Filter-Files wie in JRiver gewohnt auch in o.g. Konfiguration einbinden. Nach ein wenig Recherchieren hier und im Web scheint sich hierfür wohl Brutefir durchgesetzt zu haben?! Allerdings konnte ich auch nirgends eine einfache Anleitung finden, wie man die fertigen Filter-Files in der mpd.conf einbinden kann. Und die Brutefir Konfigdateien scheinen nur mit jahrelangem Studium beherrschbar zu sein ...
Ist das denn wirklich so kompliziert, oder kann mir jemand eine einfache Anleitung geben, was ich tun muss, um zur bisherigen mpd.conf Brutefir mit meinen Filterdateien zu konfigurieren? Tausend Dank schon mal
Gruß
Matthias
-
- Aktiver Hersteller
- Beiträge: 4666
- Registriert: 23.03.2009, 15:58
- Wohnort: 33649
- Kontaktdaten:
-
- Aktiver Hörer
- Beiträge: 81
- Registriert: 18.04.2012, 21:33
- Wohnort: Rheinstetten (bei Karlsruhe)
Hallo Uli,
vielen Dank, das hilft schon mal ein wenig. Allerdings tue ich mich generell noch schwer, im Linux Sound Dschungel zurecht zu kommen (ALSA, MPD, Jack, etc.) ...
Zum Verständnis: Kann man in der mpd.conf mit mehreren hintereinander angegebenen "audio_output" Blöcken eine Pipe aufbauen, in der das Eingangssignal mit dem ersten Block durch Brutefir geschoben und im zweiten Block dann an hw:1,0 ausgegeben wird? Oder wie funktioniert das mit dem Voranstellen von Brutefir? Sorry für die doofen Fragen, bin aber absoluter Anfänger auf dem Gebiet.
Gruß
Matthias
vielen Dank, das hilft schon mal ein wenig. Allerdings tue ich mich generell noch schwer, im Linux Sound Dschungel zurecht zu kommen (ALSA, MPD, Jack, etc.) ...
Zum Verständnis: Kann man in der mpd.conf mit mehreren hintereinander angegebenen "audio_output" Blöcken eine Pipe aufbauen, in der das Eingangssignal mit dem ersten Block durch Brutefir geschoben und im zweiten Block dann an hw:1,0 ausgegeben wird? Oder wie funktioniert das mit dem Voranstellen von Brutefir? Sorry für die doofen Fragen, bin aber absoluter Anfänger auf dem Gebiet.
Gruß
Matthias
-
- Aktiver Hersteller
- Beiträge: 4666
- Registriert: 23.03.2009, 15:58
- Wohnort: 33649
- Kontaktdaten:
Hallo Matthias,
die in meinen Augen einfachste Lösung ist 'brutefir' über die Pipe anzusprechen. Mittlereile funktioniert das zumindest bei mir sehr gut. Hierzu muss in der mpd.conf folgender Ausgang definiert sein:
Die brutefir_config sollte etwa so aussehen:
Die Pfade zur brutefir_config und zu den Acourate-Filtern müssen noch angepasst werden.
Eventuell macht es Sinn, das neueste 'brutefir' von Hand zu installieren. Dazu das aktuelle 'brutefir' herunter laden, in ein Verzeichnis entpacken und in diesem Verzeichnis in einem Terminalfenster 'make' aufrufen und danach 'sudo make install'. Das neue 'brutefir' wird dann nach /usr/local/bin installiert. In mpd.conf muss dann 'brutefir' durch /usr/local/bin/brutefir ersetzt werden.
Viele Grüße
Martin
die in meinen Augen einfachste Lösung ist 'brutefir' über die Pipe anzusprechen. Mittlereile funktioniert das zumindest bei mir sehr gut. Hierzu muss in der mpd.conf folgender Ausgang definiert sein:
Code: Alles auswählen
audio_output {
type "pipe"
name "brutefir pipe"
command "brutefir -nodefault /Pfad/zu/brutefir_config"
format "44100:32:2"
}
Code: Alles auswählen
## DEFAULT GENERAL SETTINGS ##
float_bits: 64; # internal floating point precision
sampling_rate: 44100; # sampling rate in Hz of audio interfaces
filter_length: 4096,16; # length of filters
config_file: "~/.brutefir_config"; # standard location of main config file
overflow_warnings: true; # echo warnings to stderr if overflow occurs
show_progress: false; # echo filtering progress to stderr
max_dither_table_size: 0; # maximum size in bytes of precalculated dither
allow_poll_mode: false; # allow use of input poll mode
modules_path: "."; # extra path where to find BruteFIR modules
monitor_rate: false; # monitor sample rate
powersave: false; # pause filtering when input is zero
lock_memory: true; # try to lock memory if realtime prio is set
sdf_length: -1; # subsample filter half length in samples
safety_limit: 20; # if non-zero max dB in output before aborting
convolver_config: "~/.brutefir_convolver"; # location of convolver config file
## COEFF DEFAULTS ##
coeff "c-l" {
filename: "/Pfad/zu/Acorate-Filter-links.dbl";
format: "FLOAT64_LE";
};
coeff "c-r" {
filename: "/Pfad/zu/Acorate-Filter-rechts.dbl";
format: "FLOAT64_LE";
};
## INPUT DEFAULTS ##
input "leftin","rightin" {
device: "file" { path: "/dev/stdin"; }; # module and parameters to get audio
sample: "S32_LE"; # sample format
channels: 2/0,1; # number of open channels / which to use
delay: 0,0; # delay in samples for each channel
maxdelay: -1; # max delay for variable delays
subdelay: 0,0; # subsample delay in 1/100th sample for each channel
mute: false,false; # mute active on startup for each channel
};
## OUTPUT analog
#
output "leftout", "rightout" {
device: "alsa" { device: "hw:1"; ignore_xrun: true; };
sample: "S32_LE";
channels: 2;
dither: true;
};
## FILTER DEFAULTS ##
filter "drc_l" {
from_inputs: "leftin";
to_outputs: "leftout";
coeff: "c-l";
};
filter "drc_r" {
from_inputs: "rightin";
to_outputs: "rightout";
coeff: "c-r";
};
Eventuell macht es Sinn, das neueste 'brutefir' von Hand zu installieren. Dazu das aktuelle 'brutefir' herunter laden, in ein Verzeichnis entpacken und in diesem Verzeichnis in einem Terminalfenster 'make' aufrufen und danach 'sudo make install'. Das neue 'brutefir' wird dann nach /usr/local/bin installiert. In mpd.conf muss dann 'brutefir' durch /usr/local/bin/brutefir ersetzt werden.
Viele Grüße
Martin
Hallo Uli
Hallo Martin
Last not least nun hallo Matthias
Bis auf die Bemerkungen zu Martin's Vorschlägen habe ich zu MPD und Brutefir nichts beizufügen. Aber vielleicht etwas zu meinen Linux-, MPD- und Brutefir- Erfahrungen im Allgemeinen. Ich höre im Alltag Musik, welche mittels Brutefir gefaltet ist. Und für meine Lautsprecherpröbeleien benütze ich sowohl Brutefir, als auch den Acourate Convolver. Beides ist mir vertraut. Brutefir schätze ich, weil man damit (fast) alles machen kann, bis incl. FLOW-Implementationen und auch L/R->M/S-L/R-Experimente. Das Geniale an Brutefir ist, dass praktisch alle Signale und Filter fast beliebig verschachtelbar sind. Konkret zu Linux: Keine meiner Linux-Installationen ist je definitiv. Ich verwende seit einiger Zeit Fedora, u.a. weil es bei der Installation die Option bereithält, sowohl ein rudimentäres Linux-Minimalsystem aufzusetzen (ohne das sonst übliche Soundbrimborium à la JACK, Pulseaudio, Gstream etc.), bis hin zu einer gesättigten (übersättigten) Vollinstalation. Das schöne an Linux ist, dass es zum Basteln/Pröbelln einlädt, und wenn es mal schief gelaufen ist, kann man doch recht schnell ein neues System aufsetzen, ohne dass jemand wegen einer Mehrfachinstallation mit demselben Schlüssel je reklamiert. Also, geniess diese Freiheit, und Fehler machen klug. Wenn Du Dich verfahren hast, dann starte einfach wieder bei Null. Damit es nicht ganz Null ist, mache ich von meinen Einstellungen nicht nur Notzizen, sondern mache kleine Skripte, welche ich dann einfach über ein neu aufgesetztes System laufen lasse. Mach doch versuchsweise ein Skript für Deine Grundeinstellungen, ein anderes für Brutefir und ein drittes für MPD, Skripte, welche im Laufe der Zeit verfeinert und Deinen Erfahrungen und Bedürfnissen angepasst werden können. So hast Du den Vorteil, dass Du nach einer Neuinstallation sehr schnell zu einem individualisierten System kommst. Anbei drei meiner aktuellen Skripte (möglicherweise immer noch fehlerbehaftet), eines für das Aufsetzen eines Audio-Setups, ein anderes für die Installation von Brutefir, und ein drittes für die Installation von MPD, immer mit Fedora, und immer mit dem Benutzername <privat>. Ich selbst pröble derzeit nicht mit MPD und Brutefir, sondern bin daran, ein hoffentlich sehr, sehr mageres Server-Client System mit Sox, Brutefir und Netcat zu errichten. Und da kommt mir die Möglichkeit, von Anfang an mit Fedora eine Linux-Minibasis aufzusetzen, sehr entgegen.
Wohl bekomm's
Simon
Skript für Audio-Einstellungen, Rechtevergabe etc.
Skript für die Installation von Brutefir
Skript für die Installation eines abgemagerten MPD
Alles klar. Der Interrupt ist angekommen.uli.brueggemann hat geschrieben:... dass Simon mitliest ...
Hallo Martin
Ich erlaube mir zwei Bemerkungen zu Deiner Brutefir Config. [safety_limit] ist ein neuer Parameter seit der Version 1.0m und würgt Brutefir sofort ab, sobald der Pegel am Ausgang den eingestellten Wert überschreitet. Ein Wert von 20 macht keinen Sinn, da damit grosszügig eine digitale Übersteuerung um 20dB zugelassen würde. Entweder kann dieser Parameter auskommentiert werden, oder aber man kann dessen Wert auf z.B. -0.01 einstellen, damit man sicher ist, dass der DAC nie übersteuert wird.martin hat geschrieben: safety_limit: 20; # if non-zero max dB in output before aborting
Ich empfehle beim aktuellen Stand des Codes, das Dithering (Im Modul [Output] ) !!! AUSZUSCHALTEN!!! Grund: Brutefir startet manchmal und gut reproduzierbar, aber völlig zufällig mit einem grauenvollen Kreischen auf, dies bei Angabe eines Ausganspegels von +80dB ... +1000dB. Das hat mich schon einen Hochtöner gekostet, welcher innerhalb von ca. 1 Sekunde abgeraucht ist. Zum Glück blieben wenigstens meine Ohren unbeschadet. Ich habe dies A.Torger gemeldet, was der Grund war, dass er zunächst einmal den oben abgehandelten Parameter [safety_limit] implementiert hat. Der fängt diesen Ausnahmezustand jedoch leider nicht ab, sondern funktioniert ausschliesslich beim regulärem Betrieb: D.h. auch bei [safety_limit = - 3dB] kann es munter kreischen, und dies darüber hinaus auch bei einem völlig zurückgestellten Eingangs- oder Ausgangspegel. Da hilft nichts, ausser das Dithering auszuschalten: Wenn [dither: false;] eingestellt ist, ist dieses Berserker-Verhalten nicht reproduzierbar. Ich vermute einen Fehler im entsprechenden Algorithmus für das Dithering, und A.Torger weiss von meiner Vermutung. Ich warte auf 1.0n ...martin hat geschrieben: dither: true;
Last not least nun hallo Matthias
Bis auf die Bemerkungen zu Martin's Vorschlägen habe ich zu MPD und Brutefir nichts beizufügen. Aber vielleicht etwas zu meinen Linux-, MPD- und Brutefir- Erfahrungen im Allgemeinen. Ich höre im Alltag Musik, welche mittels Brutefir gefaltet ist. Und für meine Lautsprecherpröbeleien benütze ich sowohl Brutefir, als auch den Acourate Convolver. Beides ist mir vertraut. Brutefir schätze ich, weil man damit (fast) alles machen kann, bis incl. FLOW-Implementationen und auch L/R->M/S-L/R-Experimente. Das Geniale an Brutefir ist, dass praktisch alle Signale und Filter fast beliebig verschachtelbar sind. Konkret zu Linux: Keine meiner Linux-Installationen ist je definitiv. Ich verwende seit einiger Zeit Fedora, u.a. weil es bei der Installation die Option bereithält, sowohl ein rudimentäres Linux-Minimalsystem aufzusetzen (ohne das sonst übliche Soundbrimborium à la JACK, Pulseaudio, Gstream etc.), bis hin zu einer gesättigten (übersättigten) Vollinstalation. Das schöne an Linux ist, dass es zum Basteln/Pröbelln einlädt, und wenn es mal schief gelaufen ist, kann man doch recht schnell ein neues System aufsetzen, ohne dass jemand wegen einer Mehrfachinstallation mit demselben Schlüssel je reklamiert. Also, geniess diese Freiheit, und Fehler machen klug. Wenn Du Dich verfahren hast, dann starte einfach wieder bei Null. Damit es nicht ganz Null ist, mache ich von meinen Einstellungen nicht nur Notzizen, sondern mache kleine Skripte, welche ich dann einfach über ein neu aufgesetztes System laufen lasse. Mach doch versuchsweise ein Skript für Deine Grundeinstellungen, ein anderes für Brutefir und ein drittes für MPD, Skripte, welche im Laufe der Zeit verfeinert und Deinen Erfahrungen und Bedürfnissen angepasst werden können. So hast Du den Vorteil, dass Du nach einer Neuinstallation sehr schnell zu einem individualisierten System kommst. Anbei drei meiner aktuellen Skripte (möglicherweise immer noch fehlerbehaftet), eines für das Aufsetzen eines Audio-Setups, ein anderes für die Installation von Brutefir, und ein drittes für die Installation von MPD, immer mit Fedora, und immer mit dem Benutzername <privat>. Ich selbst pröble derzeit nicht mit MPD und Brutefir, sondern bin daran, ein hoffentlich sehr, sehr mageres Server-Client System mit Sox, Brutefir und Netcat zu errichten. Und da kommt mir die Möglichkeit, von Anfang an mit Fedora eine Linux-Minibasis aufzusetzen, sehr entgegen.
Wohl bekomm's
Simon
Skript für Audio-Einstellungen, Rechtevergabe etc.
Code: Alles auswählen
#!/bin/bash
########
# _setup_audiopc
# Setup des OS als Audio-PC
########
#
# Simon
# 3.1.2013 / 00:00
# Version 0.02
# Variablen
AUDIO_USER="privat"
AUDIO_USER_RT_GROUP="realtime"
AUDIO_USER_RT_GROUP_LIMITSCONF_1="@${AUDIO_USER_RT_GROUP} - memlock 2000000000"
AUDIO_USER_RT_GROUP_LIMITSCONF_2="@${AUDIO_USER_RT_GROUP} - nice -19"
AUDIO_USER_RT_GROUP_LIMITSCONF_3="@${AUDIO_USER_RT_GROUP} - priority -2"
AUDIO_USER_RT_GROUP_LIMITSCONF_4="@${AUDIO_USER_RT_GROUP} - rtprio 99"
AUDIO_USER_SUDOERS="${AUDIO_USER} ALL=(ALL) NOPASSWD:/usr/local/bin/brutefir, /usr/bin/chmod, /usr/bin/chown, /usr/bin/killall, /usr/bin/mount, /bin/nice"
BINARIES_ERASE="gstreamer gstreamer1-plugins* gstreamer-tools jack-audio-connection-kit pulseaudio"
BINARIES_INSTALL="alsa-utils rtkit sox"
BINARIES_TEST="amixer aplay rtkit sox"
AUDIO_USER_ID=$(grep "${AUDIO_USER}" /etc/passwd | cut -d: -f3)
AUDIO_USER_RAMDISK="/run/user/${AUDIO_USER_ID}/ramdisk"
AUDIO_USER_RAMDISK_FIFO="${AUDIO_USER_RAMDISK}/fifo"
function binaries_erase() {
yum erase ${BINARIES_ERASE}
}
function binaries_install() {
yum install ${BINARIES_INSTALL}
}
function binaries_test() {
echo ""
echo ""
echo "*** Überprüfen von amixer, aplay, brutefir und sox ***"
echo ""
for BINARIES_ITEM in ${BINARIES_TEST} ; do
if [ $(whereis ${BINARIES_ITEM} | cut -d ":" -f2 | wc -w) -eq 0 ] ; then
# There are no ${BINARIES_ITEM} binaries on the system
# Message
INFO="WARNING: ${BINARIES_ITEM} is not installed on the system - Install ${BINARIES_ITEM} first"
exit
fi
done
}
function group_realtime_setup() {
groupadd ${AUDIO_USER_RT_GROUP}
if [ $(cat /etc/security/limits.conf | grep "@${AUDIO_USER_RT_GROUP}" | wc -w) -eq 0 ] ; then
echo "" >> /etc/security/limits.conf
echo "# Values added by user:" >> /etc/security/limits.conf
echo "" >> /etc/security/limits.conf
echo ${AUDIO_USER_RT_GROUP_LIMITSCONF_1} >> /etc/security/limits.conf
echo ${AUDIO_USER_RT_GROUP_LIMITSCONF_2} >> /etc/security/limits.conf
echo ${AUDIO_USER_RT_GROUP_LIMITSCONF_3} >> /etc/security/limits.conf
echo ${AUDIO_USER_RT_GROUP_LIMITSCONF_4} >> /etc/security/limits.conf
echo "" >> /etc/security/limits.conf
fi
}
function ramdisk_setup() {
echo ""
echo ""
echo "*** Setup der RAM-Disk ***"
echo ""
if ! [ -d ${AUDIO_USER_RAMDISK} ] ; then
if [ $(cat /etc/fstab | grep "${AUDIO_USER_RAMDISK}" | wc -w) -eq 0 ] ; then
FSTAB_STRING="ramfs "${AUDIO_USER_RAMDISK}" ramfs defaults 0 0"
echo $FSTAB_STRING >> /etc/fstab
echo "" >> /etc/fstab
cat /etc/fstab > /dev/null
fi
mkdir ${AUDIO_USER_RAMDISK}
mount -t ramfs ${AUDIO_USER_RAMDISK}
fi
chown ${AUDIO_USER} ${AUDIO_USER_RAMDISK}
}
function ramdisk_fifo_setup() {
if ! [ -a ${AUDIO_USER_RAMDISK_FIFO} ] ; then
# There is no FIFO yet
mkfifo ${AUDIO_USER_RAMDISK_FIFO}
fi
sudo chown ${AUDIO_USER} ${AUDIO_USER_RAMDISK_FIFO}
}
function sudoers_setup() {
if [ $(cat /etc/sudoers | grep "$AUDIO_USER" | wc -w) -eq 0 ] ; then
echo "" >> /etc/sudoers
echo ${AUDIO_USER_SUDOERS} >> /etc/sudoers
echo "" >> /etc/sudoers
fi
}
function user_audio_setup() {
usermod -a -G audio ${AUDIO_USER}
usermod -a -G ${AUDIO_USER_RT_GROUP} ${AUDIO_USER}
usermod -a -G rtkit ${AUDIO_USER}
}
# Binaries installieren
binaries_install
# Setup der Ramdisk
ramdisk_setup
# Setup des FIFO
ramdisk_fifo_setup
# Sudoers einrichten
sudoers_setup
# Gruppe realtime und deren Gruppenrichtlinien definieren
group_realtime_setup
# Audio User Einstellungen
user_audio_setup
# Überflüssige (Audio-) Software entfernen
# binaries_erase
# Überprüfen der installierten Software
binaries_test
Code: Alles auswählen
#!/bin/bash
########
# _setup_brutefir
# Setup / Installation Brutefir
########
#
# Simon
# 31.12.2013 / 00:00
# Version 0.03
# Variablen - userdefiniert
AUDIO_USER="privat"
BRUTEFIR_RELEASE="1.0m"
# Variablen - vorgegeben
AUX_BINARIES="alsa-lib-devel fftw-devel flex gcc jack-audio-connection-kit-devel"
BRUTEFIR_URL="http://www.ludd.luth.se/~torger/files/brutefir-${BRUTEFIR_RELEASE}.tar.gz"
DOWNLOAD_DIRECTORY="/home/${AUDIO_USER}/Downloads"
# Check auf eine bereits bestehende Installation von Brutefir
if [ $(which brutefir | wc -w) -ge 1 ] ; then
echo ""
echo "Brutefir ist bereits installiert und muss nicht nochmals installiert werden"
echo ""
exit
fi
# Check auf das Vorhandensein eines Download-Directories und wechsel dorthin
if ! [ -d ${DOWNLOAD_DIRECTORY} ] ; then
mkdir ${DOWNLOAD_DIRECTORY}
chown ${AUDIO_USER} ${DOWNLOAD_DIRECTORY}
fi
cd ${DOWNLOAD_DIRECTORY}
# Brutefir download
BRUTEFIR_TARBALL=$(find ${DOWNLOAD_DIRECTORY} -name "brutefir-${BRUTEFIR_RELEASE}*gz")
if [ $(echo "${BRUTEFIR_TARBALL}" | wc -w) -eq 0 ] ; then
wget --progress=dot ${BRUTEFIR_URL}
fi
# Check auf das Vorhandensein des Brutefir Archivs
BRUTEFIR_TARBALL=$(find ${DOWNLOAD_DIRECTORY} -name "brutefir-${BRUTEFIR_RELEASE}*gz")
if [ $(echo "${BRUTEFIR_TARBALL}" | wc -w) -eq 0 ] ; then
echo "Download von Brutefir ist gescheitert"
echo "Brutefir muss anders gedownloadet werden"
exit
fi
# Entpacken von Brutefir
# Check auf das Vorhandensein von bereits ausgepackten Sources
BrutefirSourceDirectory=$(find ${DOWNLOAD_DIRECTORY} -name "brutefir-${BRUTEFIR_RELEASE}")
if ! [ -d ${BrutefirSourceDirectory} ] ; then
# Source files sind noch nicht ausgepackt
# Source auspacken
cd ${DOWNLOAD_DIRECTORY}
tar xfvz ${BRUTEFIR_TARBALL}
chown ${AUDIO_USER} ${BrutefirSourceDirectory}
fi
# Compilieren und Installieren von Brutefir
if [ $(which brutefir | wc -w) -eq 0 ] ; then
# Hilfsdateien vorbereiten für das complilieren von Brutefir
yum install ${AUX_BINARIES}
# Compilieren
cd ${BrutefirSourceDirectory}
make
sudo make install
# Hilfsdateien wieder entfernen
yum erase ${AUX_BINARIES} jack-audio-connection-kit
fi
Code: Alles auswählen
#!/bin/bash
########
# _setup_mpd
# Setup des MPD
########
#
# Simon
# 31.12.2013 / 00:00
# Version 0.03
# MKDIR /home/privat/downloads
# Überprüfen auf bereits vorhandene Dateien für MPD
# Variablen - userdefiniert
AUDIO_USER="privat"
MPD_RELEASE="0.18.7"
MPD_CONFIGFILE_NAME="mpd.config"
MPD_CONFIG_DIRECTORY="/home/${AUDIO_USER}/.mpd"
MPD_MUSIC_DIRECTORY="/run/media/privat/audiofiles"
# Variablen - vorgegeben
AUDIO_USER_ID=$(grep "${AUDIO_USER}" /etc/passwd | cut -d: -f3)
AUX_BINARIES="alsa-lib-devel audiofile-devel autoconf automake flac-devel gcc gcc-c++ glib2-devel libcurl-devel libmpdclient-devel libsamplerate-devel sqlite-devel"
DOWNLOAD_DIRECTORY="/home/${AUDIO_USER}/Downloads"
MPD_CONFIGFILE_PATH="${MPD_CONFIG_DIRECTORY}/${MPD_CONFIGFILE_NAME}"
MPD_URL="http://www.musicpd.org/download/mpd/stable/mpd-${MPD_RELEASE}.tar.gz"
# Check auf eine bereits bestehende Installation von MPD
if [ $(which mpd | wc -w) -ge 1 ] ; then
if [ $( mpd --version | grep ${MPD_RELEASE} | wc -w) -ge 1 ] ; then
echo ""
echo "MPD Release ${MPD_RELEASE} bereits installiert und muss nicht nochmals installiert werden"
echo ""
exit
fi
fi
# Check auf das Vorhandensein eines Download-Directories und wechsel dorthin
if ! [ -d "${DOWNLOAD_DIRECTORY}" ] ; then
mkdir ${DOWNLOAD_DIRECTORY}
chown ${AUDIO_USER} ${DOWNLOAD_DIRECTORY}
fi
cd ${DOWNLOAD_DIRECTORY}
# MPD download
MPD_TARBALL=$(find "${DOWNLOAD_DIRECTORY}" -name "mpd-${MPD_RELEASE}*gz")
if [ $(echo "${MPD_TARBALL}" | wc -w) -eq 0 ] ; then
wget --progress=dot ${MPD_URL}
fi
# Check auf das Vorhandensein des MPD Archivs
MPD_TARBALL=$(find "${DOWNLOAD_DIRECTORY}" -name "mpd-${MPD_RELEASE}*gz")
if [ $(echo "${MPD_TARBALL}" | wc -w) -eq 0 ] ; then
echo "Download von MPD gescheitert"
echo "MPD muss anders gedownloadet werden"
exit
fi
# Entpacken von MPD
# Check auf das Vorhandensein von bereits ausgepackten Sources
MPDSourceDirectory=$(find "${DOWNLOAD_DIRECTORY}" -name "mpd-${MPD_RELEASE}")
if ! [ -d "${MPDSourceDirectory}" ] ; then
# Source files sind noch nicht ausgepackt
# Source auspacken
cd ${DOWNLOAD_DIRECTORY}
tar xfvz ${MPD_TARBALL}
# Check auf das Vorhandensein der nun ausgepackten Sources
MPDSourceDirectory=$(find "${DOWNLOAD_DIRECTORY}" -name "mpd-${MPD_RELEASE}")
chown ${AUDIO_USER} ${MPDSourceDirectory}
fi
# Compilieren und Installieren von MPD
# Hilfsdateien vorbereiten für das complilieren von MPD
yum install ${AUX_BINARIES}
# Compilieren
cd ${MPDSourceDirectory}
${MPDSourceDirectory}/autogen.sh --enable-alsa --enable-audiofile --enable-curl --enable-fifo --enable-flac --enable-httpd-output --enable-libmpdclient --enable-lsr --enable-pipe-output --enable-sqlite --disable-adplug --disable-bzip2 --disable-despotify --disable-ffmpeg --disable-fluidsynth --disable-gme --disable-id3 --disable-jack --disable-lame-encoder --disable-largefile --disable-libwrap --disable-mad --disable-mikmod --disable-oss --disable-pulse --disable-recorder-output --disable-roar --disable-shout --disable-soundcloud
make
make install
# Hilfsdateien wieder entfernen
yum erase ${AUX_BINARIES}
# MPD Verzeichnisstruktur erstellen
if ! [ -d ${MPD_CONFIG_DIRECTORY} ] ; then
mkdir ${MPD_CONFIG_DIRECTORY}
mkdir ${MPD_CONFIG_DIRECTORY}/playlist
chown ${AUDIO_USER} ${MPD_CONFIG_DIRECTORY}
fi
rm -fr $MPD_CONFIGFILE_PATH
# MPD-Konfigurationsdatei erstellen
if ! [ -a ${MPD_CONFIGFILE_PATH} ] ; then
echo '' >> ${MPD_CONFIGFILE_PATH}
echo '# users and ports' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo '#bind_to_address "localhost" # Muss inaktiviert sein, damit von extern auf MPD zugegriffen werden kann' >> ${MPD_CONFIGFILE_PATH}
echo 'port "6600"' >> ${MPD_CONFIGFILE_PATH}
echo '#user "privat" # Muss ggf. inaktiviert sein' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo '# directories and files' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo 'music_directory "'${MPD_MUSIC_DIRECTORY}'"' >> ${MPD_CONFIGFILE_PATH}
echo 'playlist_directory "'${MPD_CONFIG_DIRECTORY}'/playlist"' >> ${MPD_CONFIGFILE_PATH}
echo 'log_file "'${MPD_CONFIG_DIRECTORY}'/mpd.log"' >> ${MPD_CONFIGFILE_PATH}
echo 'pid_file "'${MPD_CONFIG_DIRECTORY}'/mpd.pid"' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo '# audio output format' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo '#samplerate_converter "Best Sinc Interpolator" # Verwendet libsamplerate. Muss ggf. für beste Qualität inaktiviert sein' >> ${MPD_CONFIGFILE_PATH}
echo '#samplerate_converter "soxr" # Verwendet libsoxr. Muss ggf. für beste Qualität inaktiviert sein' >> ${MPD_CONFIGFILE_PATH}
echo '#audio_output_format "96000:32:2" # Muss ggf. für beste Qualität inaktiviert sein' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo '# database' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo 'database' { >> ${MPD_CONFIGFILE_PATH}
echo ' plugin "simple"' >> ${MPD_CONFIGFILE_PATH}
echo ' path "'${MPD_CONFIG_DIRECTORY}'/db"' >> ${MPD_CONFIGFILE_PATH}
echo '}' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo '# in-outs' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo 'audio_output' { >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo ' # specific audio_input settings' >> ${MPD_CONFIGFILE_PATH}
echo ' type "fifo"' >> ${MPD_CONFIGFILE_PATH}
echo ' path "/run/user/'${AUDIO_USER_ID}'/fifo"' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
echo ' # general audio_input settings' >> ${MPD_CONFIGFILE_PATH}
echo ' name "mpd-sox_044_32_2.fifo"' >> ${MPD_CONFIGFILE_PATH}
echo ' format "44100:32:2"' >> ${MPD_CONFIGFILE_PATH}
echo ' enabled "yes"' >> ${MPD_CONFIGFILE_PATH}
echo ' tags "yes"' >> ${MPD_CONFIGFILE_PATH}
echo ' always_on "yes"' >> ${MPD_CONFIGFILE_PATH}
echo ' mixer_type "none"' >> ${MPD_CONFIGFILE_PATH}
echo ' replay_gain_handler "none"' >> ${MPD_CONFIGFILE_PATH}
echo '}' >> ${MPD_CONFIGFILE_PATH}
echo '' >> ${MPD_CONFIGFILE_PATH}
chown ${AUDIO_USER} ${MPD_CONFIGFILE_PATH}
fi
# MPD Aufruf mit $(chrt -f -p mpd ${MPD_CONFIGFILE.PATH})
-
- Aktiver Hörer
- Beiträge: 81
- Registriert: 18.04.2012, 21:33
- Wohnort: Rheinstetten (bei Karlsruhe)
Hallo Martin,
vielen Dank für die Beispiele Jetzt habe ich verstanden, wie die Pipe in mpd.conf zu verwenden ist und dass die Ausgabe ans Sound-Device hw:1,0 nicht in der mpd.conf sondern in der Brutefir Konfig zu finden ist.
Könntest du mir bitte noch erklären, was in der convolver config anzugeben ist? Welche Syntax wird hier verwendet?
Und wie schaffe ich es, ähnlich wie bei jRiver je nach Samplerate die richtige Filterbank zu wählen? Kann man das konfigurieren, dass automatisch das richtige Filter-File verwendet wird?
Viele Grüße
Matthias
vielen Dank für die Beispiele Jetzt habe ich verstanden, wie die Pipe in mpd.conf zu verwenden ist und dass die Ausgabe ans Sound-Device hw:1,0 nicht in der mpd.conf sondern in der Brutefir Konfig zu finden ist.
Code: Alles auswählen
convolver_config: "~/.brutefir_convolver"; # location of convolver config file
Und wie schaffe ich es, ähnlich wie bei jRiver je nach Samplerate die richtige Filterbank zu wählen? Kann man das konfigurieren, dass automatisch das richtige Filter-File verwendet wird?
Viele Grüße
Matthias
-
- Aktiver Hörer
- Beiträge: 81
- Registriert: 18.04.2012, 21:33
- Wohnort: Rheinstetten (bei Karlsruhe)
Hallo Matthias,
die convolver config Datei wird von brutefir selbst angelegt. Darum brauchst Du dich nicht zu kümmern.
Meine Beispielkonfiguration war für 44100 Hz Samplerate ausgelegt. Man könnte jetzt in der mpd.conf noch zusätzliche Ausgänge mit anderen Samplerates definieren und dort jeweils die passende brutefir_config aufrufen. Diesen Weg habe ich gewählt, denn ich habe fast ausschließlich Cd's. Zum Anhören von HighRes Material muss ich dann in MPDroid manuell auf den passenden Ausgang umschalten. Wenn ich das vergesse, aktiviert mpd automatisch den Samplerate-Converter.
Eine vollautomatische Lösung könnte hiermit funktionieren:
https://github.com/hzeller/folve
Hier wird als convolver nicht brutefir sondern jconvolver verwendet. Habe ich aber noch nicht probiert.
Viele Grüße
Martin
die convolver config Datei wird von brutefir selbst angelegt. Darum brauchst Du dich nicht zu kümmern.
Meine Beispielkonfiguration war für 44100 Hz Samplerate ausgelegt. Man könnte jetzt in der mpd.conf noch zusätzliche Ausgänge mit anderen Samplerates definieren und dort jeweils die passende brutefir_config aufrufen. Diesen Weg habe ich gewählt, denn ich habe fast ausschließlich Cd's. Zum Anhören von HighRes Material muss ich dann in MPDroid manuell auf den passenden Ausgang umschalten. Wenn ich das vergesse, aktiviert mpd automatisch den Samplerate-Converter.
Eine vollautomatische Lösung könnte hiermit funktionieren:
https://github.com/hzeller/folve
Hier wird als convolver nicht brutefir sondern jconvolver verwendet. Habe ich aber noch nicht probiert.
Viele Grüße
Martin
-
- Aktiver Hörer
- Beiträge: 81
- Registriert: 18.04.2012, 21:33
- Wohnort: Rheinstetten (bei Karlsruhe)
Ich würde eigentlich vorerst schon gerne bei schlichtem Online-Convolving mit möglicht wenig Overhead und MPD+ALSA bleiben. Kann ich denn nicht von der mpd.conf in ein Shell Script pipen, das zuerst mit sox die Samplerate ausliest und dann Brutefir mit der entsprechenden Konfig für diese Samplerate startet?
Gruß
Matthias
Gruß
Matthias
-
- Aktiver Hörer
- Beiträge: 81
- Registriert: 18.04.2012, 21:33
- Wohnort: Rheinstetten (bei Karlsruhe)
Hallo Martin, Simon und Uli,
ich hätte noch folgende Fragen zur Konfiguration:
(1) Acourate zeigt mir wie unten zu sehen "Taps 131072" für mein Filter-File Cor1L48.dbl an. Heißt das, dass ich in der Brutefir Konfig "filter_length: 8192,16;" setzen muss?
(2) Unter coeff ist in dem Beispiel ein .dbl Filter-File angegeben. Was ist das eigentlich für ein Format? Ich dachte bisher, das sein ein Acourate internes Format?! Ginge hier auch ein .wav Filter-File?
(3) Unter der Input Section ist "sample: "S32_LE";" angegeben. Was muss ich hier für andere Input Sampleraten angeben, z.B. für 48 oder 192 kHz? Wie schon geschrieben würde ich in der mpd.conf ja gerne "format" weg lassen und dann in ein Shell-Script pipen, welches zuerst mit sox die Samplerate ausliest und dann Brutefir mit der entsprechenden Konfig startet.
Tausend Dank für eure tolle Unterstützung
Matthias
ich hätte noch folgende Fragen zur Konfiguration:
(1) Acourate zeigt mir wie unten zu sehen "Taps 131072" für mein Filter-File Cor1L48.dbl an. Heißt das, dass ich in der Brutefir Konfig "filter_length: 8192,16;" setzen muss?
(2) Unter coeff ist in dem Beispiel ein .dbl Filter-File angegeben. Was ist das eigentlich für ein Format? Ich dachte bisher, das sein ein Acourate internes Format?! Ginge hier auch ein .wav Filter-File?
(3) Unter der Input Section ist "sample: "S32_LE";" angegeben. Was muss ich hier für andere Input Sampleraten angeben, z.B. für 48 oder 192 kHz? Wie schon geschrieben würde ich in der mpd.conf ja gerne "format" weg lassen und dann in ein Shell-Script pipen, welches zuerst mit sox die Samplerate ausliest und dann Brutefir mit der entsprechenden Konfig startet.
Tausend Dank für eure tolle Unterstützung
Matthias
Hallo Matthias und Co,matze81479 hat geschrieben:Hallo Martin, Simon und Uli,
ich hätte noch folgende Fragen zur Konfiguration:
(1) Acourate zeigt mir wie unten zu sehen "Taps 131072" für mein Filter-File Cor1L48.dbl an. Heißt das, dass ich in der Brutefir Konfig "filter_length: 8192,16;" setzen muss?
ja, das ist ein vernünftiger Wert für filter_length (16 * 8192 = 131072); wenn das Produkt kleiner als die Filterlänge ist, werden einfach Koeffzienten ignoriert, wenn es größer ist, wird mit Nullen aufgefüllt.
Du kannst auch etwas rumspielen, etwa mit 16384,8 oder 32768,4 und mit 'top' den Speicherbedarf und die CPU-Belastung checken und aussuchen, was Dir am besten passt.
Das sollte natürlich in der Acourate Dokumentation stehen. Bei anderen Programmen deutet .dbl darauf hin, dass die Filterkoeffizienten als Folge von 64-bit Floating-Point-Zahlen ("double" in C-Programmen) in der Datei stehen.matze81479 hat geschrieben: (2) Unter coeff ist in dem Beispiel ein .dbl Filter-File angegeben. Was ist das eigentlich für ein Format? Ich dachte bisher, das sein ein Acourate internes Format?! Ginge hier auch ein .wav Filter-File?
Das "S32_LE" bezieht sich auf das Datenformat eines einzelnen Samples. Hier sind 32-bit signed integer in Little-Endian Byte-Reihenfolge gemeint. (Samples auf einer CD sind im S16_LE Format, also 16-bit signed integers.) Die Samplerate wird so angegeben: "sampling_rate: 192000;".matze81479 hat geschrieben: (3) Unter der Input Section ist "sample: "S32_LE";" angegeben. Was muss ich hier für andere Input Sampleraten angeben, z.B. für 48 oder 192 kHz? Wie schon geschrieben würde ich in der mpd.conf ja gerne "format" weg lassen und dann in ein Shell-Script pipen, welches zuerst mit sox die Samplerate ausliest und dann Brutefir mit der entsprechenden Konfig startet.
Und hier noch ein Hinweis zu:
Das Problem hatten wir neulich schon mal an anderer Stelle angesprochen. In der Release-Version von mpd scheint in der Tat die Information über das Datenformat nicht weitergereicht werden zu können. Es wird nur ein Stream von Rohdaten in die Pipe geschrieben. Es sieht aber so aus, als ob sich da jemand etwas überlegt hat. In der aktuellen Version von mpd ('git clone git://git.musicpd.org/quad/mpd.git') sieht man mitIch würde eigentlich vorerst schon gerne bei schlichtem Online-Convolving mit möglicht wenig Overhead und MPD+ALSA bleiben. Kann ich denn nicht von der mpd.conf in ein Shell Script pipen, das zuerst mit sox die Samplerate ausliest und dann Brutefir mit der entsprechenden Konfig für diese Samplerate startet?
'git log', dass die letzten Änderungen genau das implementieren, was Euch fehlt. Vielleicht schaut sich das mal jemand an und berichtet hier? (Ich selbst benutze mpd nicht.)
Viele Grüße,
Frank
-
- Aktiver Hörer
- Beiträge: 81
- Registriert: 18.04.2012, 21:33
- Wohnort: Rheinstetten (bei Karlsruhe)
Hallo,
seit gestern habe ich nun dank der obigen sehr hilfreichen Erläuterungen ein Ubuntu 13.10 mit mpd und brutefir am laufen und bin sehr angetan von der Schlichtheit dieser Lösung
Nun würde ich das ganze gerne erweitern, dass aus mpd beliebige Samplerates nach Brutefir gepiped werden (d.h. audio_output in mpd.conf ohne „format“ Angabe) und Brutefir bzw. irgendwas zwischen mpd und Brutefir individuelle Filterbänke je Samplerate anwendet.
Die erste Idee war, aus mpd in ein bash-Script zu pipen, das zuerst die ersten 1000 Bytes des Streams durch soxi schiebt und Samplerate, Precision und Channels ermittelt (z.B. 44100 / 16-bit / 2). Anschließend wird je nach Ausprägung Brutefir mit entsprechender Konfig aufgerufen.
Mit soxi funktioniert es jedenfalls schon mal, diese Infos aus den ersten paar Bytes der Pipe zu ermitteln:
Leider sind meine Shell-Programmierkenntnisse aber nicht ausreichend, um den aus mpd gepipeten Stream zu duplizieren, die ersten paar Bytes zuerst an soxi zu senden und danach den gesamten Stream an Brutefir mit entsprechender Konfig zu senden?!
Mir ist auch unklar, wann mpd die Pipe neu initialisiert bzw. wann der o.g. Mechanismus mit soxi überhaupt aktiv werden würde?! Bei jedem Wechsel der 3 o.g. Parameter?
Habt ihr ne Idee, wie das funktionieren könnte?
Gruß
Matthias
seit gestern habe ich nun dank der obigen sehr hilfreichen Erläuterungen ein Ubuntu 13.10 mit mpd und brutefir am laufen und bin sehr angetan von der Schlichtheit dieser Lösung
Nun würde ich das ganze gerne erweitern, dass aus mpd beliebige Samplerates nach Brutefir gepiped werden (d.h. audio_output in mpd.conf ohne „format“ Angabe) und Brutefir bzw. irgendwas zwischen mpd und Brutefir individuelle Filterbänke je Samplerate anwendet.
Die erste Idee war, aus mpd in ein bash-Script zu pipen, das zuerst die ersten 1000 Bytes des Streams durch soxi schiebt und Samplerate, Precision und Channels ermittelt (z.B. 44100 / 16-bit / 2). Anschließend wird je nach Ausprägung Brutefir mit entsprechender Konfig aufgerufen.
Mit soxi funktioniert es jedenfalls schon mal, diese Infos aus den ersten paar Bytes der Pipe zu ermitteln:
Code: Alles auswählen
myuser@MYPC:~$ cut -b 1-1000 Nightingale.flac | soxi -b -
16
myuser@MYPC:~$ cut -b 1-1000 Nightingale.flac | soxi -r -
44100
myuser@MYPC:~$ cut -b 1-1000 Nightingale.flac | soxi -c -
2
Mir ist auch unklar, wann mpd die Pipe neu initialisiert bzw. wann der o.g. Mechanismus mit soxi überhaupt aktiv werden würde?! Bei jedem Wechsel der 3 o.g. Parameter?
Habt ihr ne Idee, wie das funktionieren könnte?
Gruß
Matthias