Why Dedicated Hardware for Jamulus Client

Jamulus is very sensitive to latency. A computer running Jamulus may be very powerful, but if the computer is running a lot of background tasks in parallel, its CPUs will have to time slice the tasks. This may be a problem for Jamulus. If the Jamulus audio is not processed in near real time, there will be delay causing ugly popping and cracking sound.

Ideally, all resources in a computer should be dedicated to run Jamulus Client application during a live session to minimize the latency. That is why we are looking into using dedicated Single Board Computer (SBC) to run Jamulus Client.

Odroid U3 for Jamulus Client

We are using SBC Odroid U3 for Jamulus Client. I am aware that this is a discontinued product. But I have a few of them lying around. The CPU is very powerful, it is a Samsung Exynos4412 Prime Cortex-A9. You definitely can find equivalent or better SBC for this purpose. For sure, I know Raspberry Pi 4 can do the job equally well.

Odroid U3 is capable to operate full fledged operating systems such as Ubuntu. I have tried running Jamulus on Odroid U3 with Ubuntu 20 LTS. There is no issue running. However, the "Delay" shown on the Jamulus GUI is not very pretty. I am getting > 30 ms delay most of the time, even with my Jamulus server sitting in the same house using the same network. The jitter occasionally flashes red.

I decided to run Jamulus client on Odroid U3 with a very lightweight ArchLinux operating system. With ArchLinux, I can choose to install the minimum software needed.

  • Jamulus -> self compiled
  • qjackctl -> self compiled
  • LXDE -> for debugging
  • tigervnc -> for debugging

I am overjoy with the result. The Delay is at 20 ms most of the time. It even drop lower than 20 ms occasionally. Very little jitter. Ping time is always good.

It is important to point out that the GUI applications here are merely for testing and debugging purpose. To reduce latency to the minimum, only non GUI applications are allowed.

During the test, the Odroid U3 is only connected to the home router via an Ethernet LAN cable, and Odroid U3 is only connected to an audio interface hardware via an USB cable. No monitor, mouse or keyboard are connected to Odriod U3.

The GUI applications as shown in the following diagram are run via VNC on another computer. The GUI is needed in this case, so that the Delay, Ping Time can be read. Unfortunately, these GUI applications incur popping and cracking sound on Jamulus audio during live jamming.

 

 

 

Plug and Play Headless Jamulus Client

During actual live jamming Jamulus Client and jackd serve have to be run in non GUI mode to reduce popping and cracking sound.

The intention of building a headless Jamulus client is because there is a real since a lot of musicians out there do not know much about computer. Running Jamulus can be a very daunting task to them.

To implement the Plug and Play, I have created systemd tasks to start "jackd" and Jamulus Client automatically when the device is powered up with audio interface and ethernet connected. The following are examples of the scripts that may be modified to fit your requirement.

start_jackd.service

[Unit]
Description=Start Jackd
After=network-online.target
Requires=network-online.target

[Service]
Type=simple
User=khngai
Environment=JACK_NO_AUDIO_RESERVATION=1
LimitMEMLOCK=infinity
LimitRTPRIO=95
WorkingDirectory=/tmp
ExecStart=/bin/bash -c '$$(cat /home/khngai/.jackdrc)'

[Install]
WantedBy=multi-user.target

start_jamulus.service

[Unit]
Description=Start Jamulus
After=network-online.target start_jackd.service
Requires=network-online.target start_jackd.service
## A unit that must be in an active non-erroring state
## and combos great with After=
BindsTo=start_jackd.service

[Service]
Type=simple
User=khngai
Environment=JACK_NO_AUDIO_RESERVATION=1
LimitMEMLOCK=infinity
LimitRTPRIO=95
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/start_jamulus.sh

[Install]
WantedBy=multi-user.target

/usr/local/bin/start_jamulus.sh

#!/bin/bash

echo Starting jackd and Jamulus ...
sleep 10
/usr/local/bin/Jamulus --nogui -c xxx.yyy.com -i /home/khngai/.config/Jamulus/layguat.ini

Dedicated SBC not only takes away the connection complexity, it also eliminates the contention of resources in a computer.

ArchLinux Setup Tips

I have omitted most of the technical details on the setup. I trust you can find relevant information from Mr Google. However, just some tips to save you some time.

To compile both Jamulus and Qjackctl, you need to install the following packages on ArchLinux. Some of these pre-requisites may not be obvious.

sudo pacman -S gcc cmake make git pkg-config jack libffado qt5

Another note is that Jamulus has to be run with elevated real time priority. You can configure that with the following steps.

sudo pacman -S rtaudio

sudo usermod -a -G audio <username>     // add your user name to the audio group

Then create a file "/etc/security/limits.d/audio.conf" with the following content.

@audio - rtprio 95
@audio - memlock unlimited

Logout and login for the real time priority to take effect.

Other Single Board Computers

As pointed our earlier in this article, Odoid U3 can only run Jamulus with good latency performance in command line mode. We have also tested the following boards

  • Odroid XU4 = able to run with GUI
  • Raspberry Pi 4B = able to run with GUI
  • Orange Pi Zero LTS, with Armbian Image = GUI mode is not recommended

 

Our Facebook Live Setup

You may be interested in our over setup in this article, Jamulus, Zoom and OBS Setup for Facebook Live.