Linux Network Audio Using JACK
There are two JACK-over-network implementations, netJACK1 and netJACK2. The differences between them are described in this FAQ. I chose to use netJACK2 which I think is a better starting point.
netJACK2 is part of JACK2 (at least on Debian) and does not require installation of additional software.
How to use netJACK2 is described in its README here. This walkthrough can also be helpful though I used it as a reference for specific issues rather than following it as a walkthrough.
There are two netJACK2 terms to know: master and slave. Master is the
machine that receives the audio over the network and outputs it to the audio
hardware. Slave is the machine that sends the audio over the network and
that runs the audio-producing applications (e.g. mpv
). I will use sink
and source instead, respectively, since I think these terms are more clear.
On the sink machine, run:
jackd -d alsa
The explicit launch of jackd
is not necessary, as jack_load
will start
jackd
automatically if needed. However an explicit launch may be needed
if you wish to adjust jackd
parameters, or look at its verbose output
(-v
option).
Also on the sink machine, run:
jack_load netmanager -i -c
This loads the netJACK2 componentry and gets JACK to listen for network
traffic on a predefined multicast address (225.3.19.154:19000
in my case).
It also causes the ports to be automatically connected on the sink,
meaning audio incoming over the network will actually be routed to the
audio hardware. Without the -c
option the network connections will be
reported as successful but you wouldn't hear any sound output.
On the source machine, run:
jackd -d net
This causes jackd
on the source to route the audio to the jackd
that
is listening on the network on the predefined multicast address.
This is where the README for netJACK2 ends, but if you only go this far you won't have any audio output on the sink to the sound card. For this to happen, the ports need to be connected on the sink machine.
netmanager Options
Since these are awkward to retrieve, here is a copy of them for JACK 1.9.21:
Internal client parameters:
-a, --multicast-ip Multicast address (default: 225.3.19.154)
-p, --udp-net-port UDP port (default: 19000)
-c, --auto-connect Auto connect netmaster to system ports (default: false)
-s, --auto-save Save/restore netmaster connection state when restarted (default: false)
Explicit netJACK2 Address
The predefined multicast address works when there is exactly one sink on the network, and avoids having to specify the sink's address to the source in this case. However I have multiple sink machines and thus they need to be configured with explicit addresses:
jack_load netmanager -i '-a 225.1.1.21'
Note that this must be a multicast address, i.e. it can't be the normal unicast IP address of the host machine. I obtained a multicast address by replacing the first octet of the machine's IP address with 225.
To connect to the particular sink, the source executes:
jackd -d net -a 225.1.1.21
Port Connection
One of JACK's features is the ability to set up arbitrary audio routing. While this is beneficial in advanced use cases, it can cause a problem for beginners because netJACK2 by default does not connect incoming network audio on the sink to the audio hardware, resulting in no sound output.
netmanager
can perform this connection automatically if it is started with
the -c
option. Alternatively, the following tools provide more control
over the connection logic:
- jack-matchmaker - looks to be mature, unfortunately not packaged for Debian.
- jack-autoconnect - smaller application, looks to be less mature, depends on QT toolkit.
The connections can be verified using qjackctl
. The following screenshot
shows established connections from the incoming network audio to the
audio hardware, if these are not present they can be created in qjackctl
by dragging one port to another using the mouse:
Troubleshooting
Test Client
To check that everything is working, you will need a client with JACK output capability. I used mpv:
mpv -ao jack path/to/file.webm
Verify Local Audio Output
Verify that local audio output via JACK is working. I do not use PulseAudio and thus need to send the audio to ALSA. Start a JACK server with ALSA output:
jackd -d alsa
Then use the above mpv
command to play something. If you have no sound
output, check alsamixer
and verify that master and PCM channels are unmuted
and have non-zero volume.
I performed the local test on both computers (source and sink) to be used for networked audio.
netmanager Options
netmanager
options are obtained by running:
jack_load netmanager -i -h
Note that the output will be printed in jackd
console, not in the console
that executed jack_load
. If you do not launch jackd
separately like
I have been doing, you may have both outputs in the same console.
Reloading netmanager
To reload netmanager
, first unload it with jack_unload
:
jack_unload netmanager
Check Audio Presence
I use jackmeter to see whether a port has any audio playing on it. For example:
jack_meter octopus:from_slave_1
jack_meter system:playback_1
This is helpful to determine, for example, that the sink has incoming audio
from the network, but this audio isn't rendered to the audio hardware
(because the two ports aren't connected, e.g. because the -c
option was
not given to netmanager
).
To see what ports exist on a machine, run:
jack_lsp
To see ports together with their connections, run:
jack_lsp -c