Einfache Anleitung für Linux MPD+Brutefir gesucht

Antworten
matze81479
Aktiver Hörer
Beiträge: 81
Registriert: 18.04.2012, 21:33
Wohnort: Rheinstetten (bei Karlsruhe)

Einfache Anleitung für Linux MPD+Brutefir gesucht

Beitrag von matze81479 »

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 :D

Gruß
Matthias
Bild
uli.brueggemann
Aktiver Hersteller
Beiträge: 4658
Registriert: 23.03.2009, 15:58
Wohnort: 33649
Kontaktdaten:

Beitrag von uli.brueggemann »

Bild
matze81479
Aktiver Hörer
Beiträge: 81
Registriert: 18.04.2012, 21:33
Wohnort: Rheinstetten (bei Karlsruhe)

Beitrag von matze81479 »

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
Bild
uli.brueggemann
Aktiver Hersteller
Beiträge: 4658
Registriert: 23.03.2009, 15:58
Wohnort: 33649
Kontaktdaten:

Beitrag von uli.brueggemann »

Hallo Matthias,

ich hoffe dass Simon mitliest. Ich bin selbst völlig ab von Linux. Und habe früher mit Brutefir direkt an Alsa ausgegeben und kein Jack verwendet. Ebenfalls nie mpd.

Grüsse
Uli
Bild
Martin
Aktiver Hörer
Beiträge: 116
Registriert: 15.03.2012, 14:23

Beitrag von Martin »

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:

Code: Alles auswählen

audio_output {
	type		"pipe"
	name		"brutefir pipe"
	command		"brutefir -nodefault /Pfad/zu/brutefir_config"
	format		"44100:32:2"
}
Die brutefir_config sollte etwa so aussehen:

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";
};
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
Bild
Daihedz
Aktiver Hörer
Beiträge: 793
Registriert: 25.06.2010, 15:09

Beitrag von Daihedz »

Hallo Uli
uli.brueggemann hat geschrieben:... dass Simon mitliest ...
Alles klar. Der Interrupt ist angekommen.

Hallo Martin
martin hat geschrieben: safety_limit: 20; # if non-zero max dB in output before aborting
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: dither: true;
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 ...

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
Skript für die Installation von Brutefir

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
Skript für die Installation eines abgemagerten MPD

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})
Bild
matze81479
Aktiver Hörer
Beiträge: 81
Registriert: 18.04.2012, 21:33
Wohnort: Rheinstetten (bei Karlsruhe)

Beitrag von matze81479 »

Hallo Martin,

vielen Dank für die Beispiele :D 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
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
Bild
matze81479
Aktiver Hörer
Beiträge: 81
Registriert: 18.04.2012, 21:33
Wohnort: Rheinstetten (bei Karlsruhe)

Beitrag von matze81479 »

Hallo Simon,

vielen Dank auch für deine ausführlichen Erläuterungen und Skripts. V.a. für Tipps wie das Ausschalten des Ditherings bin ich so dankbar, weil ich meine MEGs auf keinen Fall mit irgendwelchen Spielereien zerschießen möchte.

Gruß
Matthias
Bild
Martin
Aktiver Hörer
Beiträge: 116
Registriert: 15.03.2012, 14:23

Beitrag von Martin »

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
Bild
matze81479
Aktiver Hörer
Beiträge: 81
Registriert: 18.04.2012, 21:33
Wohnort: Rheinstetten (bei Karlsruhe)

Beitrag von matze81479 »

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
Bild
matze81479
Aktiver Hörer
Beiträge: 81
Registriert: 18.04.2012, 21:33
Wohnort: Rheinstetten (bei Karlsruhe)

Beitrag von matze81479 »

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?

Bild

(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 :D

Matthias
Bild
frankl
Aktiver Hörer
Beiträge: 486
Registriert: 20.01.2013, 01:43
Wohnort: Aachen

Beitrag von frankl »

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?
Hallo Matthias und Co,

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.
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 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: (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.
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;".

Und hier noch ein Hinweis zu:
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?
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 mit
'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
Bild
matze81479
Aktiver Hörer
Beiträge: 81
Registriert: 18.04.2012, 21:33
Wohnort: Rheinstetten (bei Karlsruhe)

Beitrag von matze81479 »

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:

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
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
Bild
Antworten