#!/bin/bash # This script is intended to setup a clean Raspberry Pi system for running Jamulus OPUS="opus-1.3.1" NCORES=$(nproc) # install required packages pkgs='alsamixergui build-essential qt5-default libasound2-dev cmake libglib2.0-dev' 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 # 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 wget https://archive.mozilla.org/pub/opus/${OPUS}.tar.gz tar -xzf ${OPUS}.tar.gz rm ${OPUS}.tar.gz cd ${OPUS} 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 ./configure --enable-custom-modes --enable-fixed-point make -j${NCORES} mkdir include/opus cp include/*.h include/opus cd .. fi # 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 ./waf configure --alsa --prefix=/usr/local --libdir=$(pwd)/build ./waf -j${NCORES} mkdir build/jack cp build/*.so build/jack cp build/common/*.so build/jack cp build/example-clients/*.so build/jack cd .. # 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 fi # compile Jamulus with external Opus library cd .. 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 make -j${NCORES} # get first USB audio sound card device ADEVICE=$(aplay -l|grep "USB Audio"|tail -1|cut -d' ' -f3) echo "Using USB audio device: ${ADEVICE}" # 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 JAMULUSINIFILE="Jamulus.ini" NAME64=$(echo "Raspi $(hostname)"|cut -c -16|tr -d $'\n'|base64) if [ "$NCORES" -gt "1" ]; then echo -e "\n ${NAME64}" > ${JAMULUSINIFILE} echo -e " 1\n 3\n 3" >> ${JAMULUSINIFILE} echo -e " 2\n 1\n" >> ${JAMULUSINIFILE} else echo -e "\n ${NAME64}" > ${JAMULUSINIFILE} echo -e " 1\n 3\n 3" >> ${JAMULUSINIFILE} echo -e " 0\n 1\n" >> ${JAMULUSINIFILE} fi # 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 # start Jack2 and Jamulus in headless mode export LD_LIBRARY_PATH="distributions/${OPUS}/.libs:distributions/jack2/build:distributions/jack2/build/common" 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 & echo "###---------- PRESS ANY KEY TO TERMINATE THE JAMULUS SESSION ---------###" read -n 1 -s -r -p "" killall Jamulus