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})