Disclaimer

This how I configure Linux workstations for real-time audio using Debian 12 and Jack. If you’re thinking about doing any of this to your Desktop PC, don’t.


Why Debian?

Production systems should be predictable and stable. Debian manages both. The last thing you want is a package update to knacker your carefully crafted setup. If you’re running a rolling release Linux distribution, this is a matter of when, not if. Unfortunately, this is something people fail to understand until they experience it themselves.

If you’re looking for OS Recommendations, have a look at Debian, Rocky, or Ubuntu LTS.


What about PipeWire?

While I believe PipeWire holds promise for the future of Linux audio, it’s still under active development. This guide will utilize the mature and stable Jack server for a reliable experience.


So it begins 

0. Disable global c-state control and configure the all-core frequency. This keeps the CPU locked at the selected frequency.   


1. Disable hyper-threading (HT) or simultaneous multithreading (SMT). Hyperthreading increases contention on processor resources leading to increased jitter.


2. During the installation, I select the XFCE Desktop Manager. This prevents Debian from installing Wayland and PipeWire by default.


3. After the initial install, it’s time to get a real-time kernel. If you’re on AMD / Intel, this process is relatively straightforward. NVIDIA users will need to download and install the *.run driver package directly from NVIDIA.

Find the current Linux kernel version.

uname -a 

Locate the matching real-time kernel 

apt search linux-image-KERNELVERSION

Install the real-time kernel 

sudo apt install linux-image-KERNELVERSION-rt-amd64

4. Disable the swap file to prevent the system from swapping to disk.

sudo nano /etc/fstab

5. Remove any traces of PipeWire 

sudo apt purge pipewire*

6. Install Jack, Pulseaudio Bridge, nonfree firmware, and rtirq. 

sudo apt install jackd2 qjackctl pulseaudio-module-jack firmware-linux-nonfree rtirq-init

7. Enable threadirqs and disable Spectre / Meltdown mitigations. 

sudo nano /etc/default/grub

8. Hardware timers

sudo nano  /etc/udev/rules.d/40-timer-permissions.rules

Add the following

KERNEL=="rtc0", GROUP="audio"
KERNEL=="hpet", GROUP="audio"

9. Set max user frequency 

sudo nano /etc/tmpfiles.d/maxfreq.conf

Add the following

w    /sys/class/rtc/rtc0/max_user_freq     -    -    -    -   3072

10. Max user watches. 

sudo nano /etc/sysctl.d/99-sysctl.conf

Add the following

fs.inotify.max_user_watches = 524288

11. Setting resource limits

sudo nano /etc/security/limits.conf

Add the following 

@audio - rtprio 99
@audio - memlock unlimited

12. Add the user to the audio group

sudo usermod -a -G audio replacethiswithyourusername

13. Default values for Pulseaudio

nano ~/.config/pulse/daemon.conf

Add the following 

default-sample-format = float32le
default-sample-rate = 48000
alternate-sample-rate = 44100
default-sample-channels = 2
default-channel-map = front-left,front-right
resample-method = speex-float-10
enable-lfe-remixing = no
high-priority = yes
nice-level = -11
realtime-scheduling = yes
realtime-priority = 70
rlimit-rtprio = 90
daemonize = no

14. Update initramfs and reboot the system

sudo update-initramfs -u

15. Plugging your audio interface into USB ports directly connected to the CPU will result in lower latency.


And that’s how I configure workstations for real-time audio using Debian 12 and Jack. You can watch the system in action live on Twitch.

Have questions about your setup? Ask in our forums.

VennStone

View all posts

8 comments

  • The stock Debian RT kernel handles all the audio over IP and NDI video traffic in my production studio. It should be more than capable of handling a typical home recording setup.

    I’m familiar with the Liquorix Kernel but have never used it. Growing up with Linux in the 90s, building custom kernels was just something you did if you wanted a working system. So when I need something custom, I tend to build it myself.

  • Hi there, I would like to share this with you about FFADO/JACK/PulseAudio X Pipewire

    I’ve been using Linux since 2015 to record and mix. I have used Profire2626, I have where I work a Focusrite Pro40, and my main interface is an RME Hammerfall Fireface 800 (which sounds amazing). I love both of them.
    Until early this year I used Linux Mint with most of your recommendations for Debian. A friend of mine wrote a script that does almost all of that. The only difference is the Low Latency Kernel which is not supported by Debian. But It worked fine until Linux Mint uploaded a new FFADO mixer version 2.5.1 or something and it does not work with the RME Fireface.

    Because of that, I installed Ubuntu Studio and recently, started experimenting with pipewire. With that, I can use the real Jack (not its emulation). It allows me to use QjackCtl just like in FFADO/Jack. The downside is that I can not use it for general purposes (which is bad…).
    Then I switched back to FFADO/QjackCtl/Pulse Audio and everything went back to normality.
    Everything works fine

    About FFADO and PipeWire, I just saw some new recommendations for loading the PipeWire FFADO modules and being ready to use them for general usage. I haven’t tried that as of yet. I am just waiting for a new Iocrest PCIe card to arrive to experiment with that
    Because my setup is working just fine.

    Your stuff is great thank you

      • @vennmints Thanks !! Unfortunately, PipeWire is giving me a hard time with FireFace 800 and Focusrite PRO 40. Using pipewire version 1.0.5 running on Ubuntu Studio 24.04. AlSA drivers don’t go well with both interfaces. But when I blacklist the snd_dice chip, FFADO modules don’t load. I got some advice from the Ardour forum to create 10-ffado.conf in ~/.config/pipewire/pipewire.conf.d/  which I did 
        10-ffado.conf example: 
        context.modules = [
        { name = libpipewire-module-ffado-driver
        args = {
        #driver.mode = duplex
        #ffado.devices = [ “hw:0" ]
        #ffado.period-size = 1024
        #ffado.period-num = 3
        #ffado.sample-rate = 48000
        #ffado.slave-mode = false
        #ffado.snoop-mode = false
        #ffado.verbose = 0
        #latency.internal.input = 0
        #latency.internal.output = 0
        #audio.position = [ FL FR ]
        source.props = {
        # extra sink properties
        }
        sink.props = {
        # extra sink properties
        }
        }
        }
        ]
         
        Then I got two scenarios: 1.  creating the “10-ffado.conf in ~/.config/pipewire/pipewire.conf.d/" file as is, pipewire doesn’t start 
         
        2. creating the “10-ffado.conf in ~/.config/pipewire" pipewire starts but the FFADO modules won’t start and qpwgraph does not display the FFADO interfaces.. Its a mess. Anyway, I will keep trying. Meawhile, my recording machine is running Jack/Pulse Audio
         
         

        • I forgot,
          When you have time, please let me know if this protocol would work on Linux Mint ok ?
          Second, how would you set RME/Focusrite Pro 40 on Debian/Linux Mint? I’ve been doing it for a while but I’m quite sure you have a better way to do it.

          Last question:

          The FFADO Mixer version on LM 21.3 does not load. I just get the following message: “Bus reconfiguration in process, please wait…"
          But the mixer never loads. Have you seen this message before ?

          In your experience, is there something to be done to get it fixed or is there a way to install a newer FFADO mixer version
          (e.g. 2.4.8)?

          Again, thanks for the attention


          • @basstrombone I’m happy to chime in, but you will need to create a new topic for additional questions in the forums.
            Makes it a lot easier than digging around in one big thread.

             
            Thanks for getting back ! and, will do! 
             

You can support my little Linux A/V documentation project on Ko-fi.

Recent Posts