2019-09-21 09:15:08 +02:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
# This script is intended to setup a clean Raspberry Pi system for running Jamulus
|
2020-06-01 22:31:52 +02:00
|
|
|
OPUS="opus-1.3.1"
|
2019-09-21 17:57:41 +02:00
|
|
|
NCORES=$(nproc)
|
2019-09-21 10:23:39 +02:00
|
|
|
|
2019-09-25 18:06:54 +02:00
|
|
|
# install required packages
|
2019-09-28 07:23:11 +02:00
|
|
|
pkgs='alsamixergui build-essential qt5-default libasound2-dev cmake libglib2.0-dev'
|
2019-09-25 18:06:54 +02:00
|
|
|
if ! dpkg -s $pkgs >/dev/null 2>&1; then
|
|
|
|
read -p "Do you want to install missing packages? " -n 1 -r
|
|
|
|
echo
|
|
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
|
|
sudo apt-get install $pkgs -y
|
|
|
|
fi
|
|
|
|
fi
|
2019-09-21 10:23:39 +02:00
|
|
|
|
|
|
|
# Opus audio codec, custom compilation with custom modes and fixed point support
|
|
|
|
if [ -d "${OPUS}" ]; then
|
|
|
|
echo "The Opus directory is present, we assume it is compiled and ready to use. If not, delete the opus directory and call this script again."
|
|
|
|
else
|
2019-09-21 09:15:08 +02:00
|
|
|
wget https://archive.mozilla.org/pub/opus/${OPUS}.tar.gz
|
|
|
|
tar -xzf ${OPUS}.tar.gz
|
|
|
|
rm ${OPUS}.tar.gz
|
|
|
|
cd ${OPUS}
|
2020-06-01 22:31:52 +02:00
|
|
|
if [ ${OPUS} == "opus-1.3.1" ]; then
|
|
|
|
echo "@@ -117,13 +117,19 @@ void validate_celt_decoder(CELTDecoder *st)
|
|
|
|
#ifndef CUSTOM_MODES
|
|
|
|
celt_assert(st->mode == opus_custom_mode_create(48000, 960, NULL));
|
|
|
|
celt_assert(st->overlap == 120);
|
|
|
|
+ celt_assert(st->end <= 21);
|
|
|
|
+#else
|
|
|
|
+/* From Section 4.3 in the spec: The normal CELT layer uses 21 of those bands,
|
|
|
|
+ though Opus Custom (see Section 6.2) may use a different number of bands
|
|
|
|
+
|
|
|
|
+ Check if it's within the maximum number of Bark frequency bands instead */
|
|
|
|
+ celt_assert(st->end <= 25);
|
|
|
|
#endif
|
|
|
|
celt_assert(st->channels == 1 || st->channels == 2);
|
|
|
|
celt_assert(st->stream_channels == 1 || st->stream_channels == 2);
|
|
|
|
celt_assert(st->downsample > 0);
|
|
|
|
celt_assert(st->start == 0 || st->start == 17);
|
|
|
|
celt_assert(st->start < st->end);
|
|
|
|
- celt_assert(st->end <= 21);
|
|
|
|
#ifdef OPUS_ARCHMASK
|
|
|
|
celt_assert(st->arch >= 0);
|
|
|
|
celt_assert(st->arch <= OPUS_ARCHMASK);" >> opus_patch_file.diff
|
|
|
|
patch celt/celt_decoder.c opus_patch_file.diff
|
|
|
|
fi
|
2019-09-21 10:23:39 +02:00
|
|
|
./configure --enable-custom-modes --enable-fixed-point
|
2019-09-21 17:57:41 +02:00
|
|
|
make -j${NCORES}
|
2019-09-21 18:18:29 +02:00
|
|
|
mkdir include/opus
|
|
|
|
cp include/*.h include/opus
|
2019-09-21 12:47:58 +02:00
|
|
|
cd ..
|
|
|
|
fi
|
|
|
|
|
2019-09-21 17:57:41 +02:00
|
|
|
# Jack audio without DBUS support
|
|
|
|
if [ -d "jack2" ]; then
|
|
|
|
echo "The Jack2 directory is present, we assume it is compiled and ready to use. If not, delete the jack2 directory and call this script again."
|
|
|
|
else
|
|
|
|
git clone https://github.com/jackaudio/jack2.git
|
|
|
|
cd jack2
|
|
|
|
git checkout v1.9.12
|
2019-09-22 09:33:01 +02:00
|
|
|
./waf configure --alsa --prefix=/usr/local --libdir=$(pwd)/build
|
2019-09-21 17:57:41 +02:00
|
|
|
./waf -j${NCORES}
|
2019-09-22 09:33:01 +02:00
|
|
|
mkdir build/jack
|
|
|
|
cp build/*.so build/jack
|
|
|
|
cp build/common/*.so build/jack
|
|
|
|
cp build/example-clients/*.so build/jack
|
2019-09-21 17:57:41 +02:00
|
|
|
cd ..
|
2019-09-28 09:30:04 +02:00
|
|
|
|
|
|
|
# give audio group rights to do realtime
|
|
|
|
if grep -Fq "@audio" /etc/security/limits.conf; then
|
|
|
|
echo "audio group already has realtime rights"
|
|
|
|
else
|
|
|
|
sudo sh -c 'echo "@audio - rtprio 95" >> /etc/security/limits.conf'
|
|
|
|
sudo sh -c 'echo "@audio - memlock unlimited" >> /etc/security/limits.conf'
|
|
|
|
fi
|
2019-09-21 17:57:41 +02:00
|
|
|
fi
|
2019-09-21 09:15:08 +02:00
|
|
|
|
2019-09-21 10:23:39 +02:00
|
|
|
# compile Jamulus with external Opus library
|
|
|
|
cd ..
|
2020-06-20 21:20:32 +02:00
|
|
|
qmake "CONFIG+=opus_shared_lib raspijamulus headless" "INCLUDEPATH+=distributions/${OPUS}/include" "QMAKE_LIBDIR+=distributions/${OPUS}/.libs" "INCLUDEPATH+=distributions/jack2/common" "QMAKE_LIBDIR+=distributions/jack2/build/common" Jamulus.pro
|
2019-09-21 17:57:41 +02:00
|
|
|
make -j${NCORES}
|
2019-09-21 12:47:58 +02:00
|
|
|
|
2019-09-21 15:08:56 +02:00
|
|
|
# get first USB audio sound card device
|
2020-03-09 21:19:45 +01:00
|
|
|
ADEVICE=$(aplay -l|grep "USB Audio"|tail -1|cut -d' ' -f3)
|
2019-09-21 15:08:56 +02:00
|
|
|
echo "Using USB audio device: ${ADEVICE}"
|
|
|
|
|
2020-06-11 08:35:10 +02:00
|
|
|
# write Jamulus ini file for setting the client name and buffer settings, if there is
|
|
|
|
# just one CPU core, we assume that we are running on a Raspberry Pi Zero
|
2019-09-23 19:57:28 +02:00
|
|
|
JAMULUSINIFILE="Jamulus.ini"
|
2019-10-05 13:06:12 +02:00
|
|
|
NAME64=$(echo "Raspi $(hostname)"|cut -c -16|tr -d $'\n'|base64)
|
2019-10-01 16:50:47 +02:00
|
|
|
if [ "$NCORES" -gt "1" ]; then
|
|
|
|
echo -e "<client>\n <name_base64>${NAME64}</name_base64>" > ${JAMULUSINIFILE}
|
|
|
|
echo -e " <autojitbuf>1</autojitbuf>\n <jitbuf>3</jitbuf>\n <jitbufserver>3</jitbufserver>" >> ${JAMULUSINIFILE}
|
|
|
|
echo -e " <audiochannels>2</audiochannels>\n <audioquality>1</audioquality>\n</client>" >> ${JAMULUSINIFILE}
|
|
|
|
else
|
|
|
|
echo -e "<client>\n <name_base64>${NAME64}</name_base64>" > ${JAMULUSINIFILE}
|
|
|
|
echo -e " <autojitbuf>1</autojitbuf>\n <jitbuf>3</jitbuf>\n <jitbufserver>3</jitbufserver>" >> ${JAMULUSINIFILE}
|
2020-06-11 10:25:49 +02:00
|
|
|
echo -e " <audiochannels>0</audiochannels>\n <audioquality>1</audioquality>\n</client>" >> ${JAMULUSINIFILE}
|
2019-10-01 16:50:47 +02:00
|
|
|
fi
|
2019-09-23 19:34:12 +02:00
|
|
|
|
2019-09-28 21:11:31 +02:00
|
|
|
# taken from "Raspberry Pi and realtime, low-latency audio" homepage at wiki.linuxaudio.org
|
|
|
|
#sudo service triggerhappy stop
|
|
|
|
#sudo service dbus stop
|
|
|
|
#sudo mount -o remount,size=128M /dev/shm
|
|
|
|
|
2019-09-21 12:47:58 +02:00
|
|
|
# start Jack2 and Jamulus in headless mode
|
2019-09-21 21:18:34 +02:00
|
|
|
export LD_LIBRARY_PATH="distributions/${OPUS}/.libs:distributions/jack2/build:distributions/jack2/build/common"
|
2020-08-01 09:23:54 +02:00
|
|
|
distributions/jack2/build/jackd -R -T --silent -P70 -p16 -t2000 -d alsa -dhw:${ADEVICE} -p 128 -n 3 -r 48000 -s &
|
|
|
|
./Jamulus -n -i ${JAMULUSINIFILE} -c jamulus.fischvolk.de &
|
2019-09-21 10:23:39 +02:00
|
|
|
|
2020-08-01 09:23:54 +02:00
|
|
|
echo "###---------- PRESS ANY KEY TO TERMINATE THE JAMULUS SESSION ---------###"
|
|
|
|
read -n 1 -s -r -p ""
|
|
|
|
killall Jamulus
|