Jackd+A2J with Systemd startup

I finally managed to get a working startup with systemd.

The setup:
1 alsa card
Load pulseaudio , followed by JackdBus+A2jDbus
(for those who are familiar there’s “a2jmidid -e” which doesn’t run in dbus mode)

The Pros:

  • You can start JackdBus on and off without conflicting with Pulseaudio

The Cons:

  • None! :stuck_out_tongue:

The problem with pulseaudio’s module of jackdbus, is more often than not it doesn’t do its job properly.

With a little tuning of a pre and after of running jackdbus, Systemd allows its unit files to include “ExecStartPre” << which allows one to do things before Jackd tries to grab the Alsa device.

My previous tweaks in getting this setup to work went around to using the “null sink” device with Pulseaudio.

However just recently I found a much better and assuring way that that wasn’t enough for PulseAudio to letting go of the alsa card fully. Despite having module-jackdbus-detect always loaded with pulseaudio, sometimes its default sink (when manually starting jackdbus), would not switch to “jack_out” as the pulseaudio’s jackdbus is designed to do. It maps and detects jackdbus, and immediately makes the sinks available(so pulseaudio’s jackdbus module works half-way), but it sometimes fails to set the sink to jack_out.

My instruction below here, overcomes this problem, and instead uses direct pacmd commands in a dbus-org.jackaudio.service systemd unit file.

The nice thing about it is pulseaudio always gets its sink to jack_out.

The systemd unit file goes into ~/.config/systemd/user (if this path doesn’t exist, the user needs to manually create it)
dbus-org.jackaudio.service
"
[Unit]
Description=JACK 2
After=pulseaudio.service
Requires=dbus.socket
Requires=pulseaudio.service

[Service]
Type=dbus
BusName=org.jackaudio.service

ExecStartPre=-/usr/bin/killall -9 jackdbus
ExecStartPre=-/bin/sleep 2
#ExecStartPre=-/usr/bin/pacmd load-module module-null-sink
#ExecStartPre=-/bin/sleep 2
ExecStartPre=-/usr/bin/pacmd set-default-sink null

ExecStartPre=-/usr/bin/pacmd unload-module module-jackdbus-detect
ExecStartPre=-/bin/sleep 1
ExecStartPre=-/usr/bin/pacmd unload-module module-jack-sink
ExecStartPre=-/usr/bin/pacmd unload-module module-jack-source
ExecStartPre=-/bin/sleep 2

ExecStartPre=-/usr/bin/pacmd suspend 1
ExecStartPre=-/bin/sleep 1

ExecStart=/usr/bin/jackdbus auto

ExecStartPost=-/bin/sleep 6
ExecStartPost=/usr/bin/jack_control ds alsa
ExecStartPost=/usr/bin/jack_control dps device hw:NVidia,7
ExecStartPost=/usr/bin/jack_control dps period 512
ExecStartPost=/usr/bin/jack_control dps nperiods 3
ExecStartPost=/usr/bin/jack_control dps rate 48000
ExecStartPost=/usr/bin/jack_control dps input-latency 32
ExecStartPost=/usr/bin/jack_control dps output-latency 32
ExecStartPost=/usr/bin/jack_control dps midi-driver none
ExecStartPost=/usr/bin/jack_control eps driver alsa
ExecStartPost=/usr/bin/jack_control eps realtime True
ExecStartPost=/usr/bin/jack_control eps realtime-priority 95
ExecStartPost=-/bin/sleep 1

ExecStartPost=-/usr/bin/jack_control start
ExecStartPost=-/bin/sleep 3

ExecStartPost=-/usr/bin/pacmd load-module module-jackdbus-detect channels=2 connect=true
ExecStartPost=-/bin/sleep 3
ExecStartPost=-/usr/bin/pacmd set-default-sink jack_out
ExecStartPost=-/usr/bin/pacmd suspend-sink jack_out 0

ExecStop=-/usr/bin/jack_control exit
ExecStopPost=-/bin/sleep 2
ExecStopPost=-/usr/bin/killall -9 jackdbus
ExecStopPost=-/bin/sleep 1

ExecStopPost=-/usr/bin/pacmd unload-module module-jackdbus-detect
ExecStopPost=-/bin/sleep 1
ExecStopPost=-/usr/bin/pacmd unload-module module-jack-sink
ExecStopPost=-/usr/bin/pacmd unload-module module-jack-source
ExecStopPost=-/bin/sleep 1
ExecStopPost=-/usr/bin/pacmd set-default-sink alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1
ExecStopPost=-/bin/sleep 2
ExecStopPost=-/usr/bin/pacmd suspend 0

SuccessExitStatus=0
RemainAfterExit=yes

[Install]
WantedBy=default.target
"

dbus-org.gna.home.a2jmidid.service
"
[Unit]
Description=alsa2jack dbus
Requires=dbus.socket
Requires=dbus-org.jackaudio.service
After=dbus-org.jackaudio.service

[Service]
Type=dbus
BusName=org.gna.home.a2jmidid

ExecStartPre=-/usr/bin/killall -9 a2jmidid
ExecStartPre=-/bin/sleep 2

ExecStart=/usr/bin/a2jmidid dbus
ExecStartPost=/bin/sleep 3
ExecStartPost=/usr/bin/a2j_control ehw
ExecStartPost=/bin/sleep 5
ExecStartPost=/usr/bin/a2j_control start

ExecStop=/usr/bin/a2j_control exit
ExecStopPost=-/bin/sleep 2
ExecStopPost=-/usr/bin/killall -9 a2jmidid

SuccessExitStatus=0
RemainAfterExit=true

[Install]
WantedBy=default.target
"


these dbus files also need to be changed
(If your distro is using a slightly different name in /usr/share/dbus-1/services, then you need to use that filename in ~/.local/share/dbus-1/services )

~/.local/share/dbus-1/services/org.jackaudio.service
"
[D-BUS Service]
Name=org.jackaudio.service
#Exec=/usr/bin/jackdbus auto

SystemdService=dbus-org.jackaudio.service
"


for dbus unit file org.gna.home.a2jmidid.service
in ~/.local/share/dbus-1/services/ ,
"
[D-BUS Service]
Name=org.gna.home.a2jmidid
#Exec=/usr/bin/a2jmidid dbus

SystemdService=dbus-org.gna.home.a2jmidid.service
"

To prepare these units for auto-startup,

systemctl --user reenable dbus-org.gna.home.a2jmidid.service
systemctl --user reenable dbus-org.jackaudio.service
systemctl --user daemon-reload

The daemon-reload statement may be redundant but isn’t harmful. The "systemctl --user enable __ " statement doesn’t fully create the appropriate symlinks for the .wants folder, that’s why you would need to use “reenable” to ensure the correct symlinks are created under the user’s systemd sub-folders in ~/.config/systemd/user/.

The “reenable” and daemon-reload statements are not enough to ensure that the unit files are stored in .wants folders, you can verify this by using,
systemctl --user list-dependencies default.target

If a user wants to alter the auto-start behaviour of these two service units in ~/.config/systemd/user, they can use
systemctl --user disable dbus-org.gna.home.a2jmidid
systemctl --user disable dbus-org.jackaudio

to start up manually, one can just do
systemctl --user start dbus-org.gna.home.a2jmidid.service
and that should start up the jackaudio service along with it.

The lines with dp, dps and eps in jack.service can be removed if a user wants to use other tools to store jackdbus settings.

Since I don’t trust ~/.config/jack/conf.xml as it could get overwritten by other tools, << this configuration file is where the runtime jackdbus stores it settings.
The thing is jackdbus can be called from different tools. If you’re like me and like to try different jack tools but do not want to worry about your settings getting lost, you can always stick with “qjackctl” or you can ammend jack_control statements in the dbus-org.jackaudio.service file as demonstrated.

For checking what settings are taking place with jackdbus,
“jack_control ep” and “jack_control dp” can be used to show the runtime jackdbus settings…

To verify that pulseaudio is indeed pointing to jack_out,

pacmd list-sinks, and look for “*” on the index/name where it says “<jack_out>”

The “pacmd suspend __” takes a 0 or 1 , and works well enough that the null sink module does not need to be used, but I take just an extra step of precaution as the null sink has worked well for me in the past. The pacmd suspend adds even better assurance pulseaudio and jackd won’t fight for the alsa device…

While jackdbus is running, “pacmd suspend-sink jack_out 0” makes it possible to output to only jack_out with pulseaudio… If another sink needs to be used, a command similar to it can be used, but do not use the alsa device that jackdbus wants to grab onto.

For users who have this systemd file on their linux setup,
/usr/lib/systemd/user/pulseaudio.service

and you do not have “–realtime” applied to the pulseaudio command, you can modify it after copying it to your user’s path of systemd.

cd ~/.config/systemd/user
cp /usr/lib/systemd/user/pulseaudio.service .

and edit the line containing ExecStart=
eg,
from “ExecStart=/usr/bin/pulseaudio --daemonize=no” from the system’s default
to something similar to
“ExecStart=/usr/bin/pulseaudio --daemonize=no --realtime --no-cpu-limit”

If you use jackdbus, don’t use jackd. That’s the easiest way to go about it…

If you do use jackd, then make sure you do the same check, suspend pulseaudio’s sinks, etc… and it should work the same…

For those who use jackd:
-> the command for a2jmidid with hardware-redirected ports is -> “a2jmidid -e”

A user would notice that I use “jack_control exit” and “a2j_control exit”. The reason why I use this is because “jack_control stop” and “a2j_control stop” do not work perfectly sometimes when their dbus activation is still on.

Issuing start/stop with jack_control and/or a2j_control does not always work and so the only way for the two to cooperate again is to bring down the dbus activation and then later reactivate.

It’s flakey, so it’s best to do a full kill switch on both and that always solves it.

It’s a little instructive, but basically you are making just four files and not changing anything outside the user home folder.

good luck

I suggest to use jack_wait -w instead of sleep.

Well really, for Ardour, I’d highly recommend to just use Ardour/ALSA and avoid jack, especially if you use live MIDI, but that’s a different story.

I have found with using a2j_control that if anything goes wrong The log file fills my disk up quite quickly. So I gave up on the a2jmidid dbus version and just use a2jmidid -e &

I have also found that if pulse can see any alsa device, the sample clock of that device will cause xruns with jack if the pulse-jack brdige is used. There for I unload any pulse alsa modules at pulse startup as well as the pulse udev module (which loads alsa modules in automatically). This makes for a stable pulse jack system.

Do be aware that some pulse only software (like skype) will choke on lower latencies in jack.

Amended these changes for the service unit files, as well as implementing “SystemdService=” in the dbus files meant I had to remove “Exec=” from these units.

~/.config/systemd/user/dbus-org.jackaudio.service
"
[Unit]
Description=JACK 2
After=pulseaudio.service
Requires=dbus.socket
Requires=pulseaudio.service

[Service]
Type=dbus
BusName=org.jackaudio.service

ExecStartPre=-/usr/bin/killall -9 jackdbus
ExecStartPre=-/bin/sleep 2
#ExecStartPre=-/usr/bin/pacmd load-module module-null-sink
#ExecStartPre=-/bin/sleep 2
ExecStartPre=-/usr/bin/pacmd set-default-sink null

ExecStartPre=-/usr/bin/pacmd unload-module module-jackdbus-detect
ExecStartPre=-/bin/sleep 1
ExecStartPre=-/usr/bin/pacmd unload-module module-jack-sink
ExecStartPre=-/usr/bin/pacmd unload-module module-jack-source
ExecStartPre=-/bin/sleep 2

ExecStartPre=-/usr/bin/pacmd suspend 1
ExecStartPre=-/bin/sleep 1

ExecStart=/usr/bin/jackdbus auto

ExecStartPost=-/bin/sleep 6
ExecStartPost=/usr/bin/jack_control ds alsa
ExecStartPost=/usr/bin/jack_control dps device hw:NVidia,7
ExecStartPost=/usr/bin/jack_control dps period 512
ExecStartPost=/usr/bin/jack_control dps nperiods 3
ExecStartPost=/usr/bin/jack_control dps rate 48000
ExecStartPost=/usr/bin/jack_control dps input-latency 32
ExecStartPost=/usr/bin/jack_control dps output-latency 32
ExecStartPost=/usr/bin/jack_control dps midi-driver none
ExecStartPost=/usr/bin/jack_control eps driver alsa
ExecStartPost=/usr/bin/jack_control eps realtime True
ExecStartPost=/usr/bin/jack_control eps realtime-priority 95
ExecStartPost=-/bin/sleep 1

ExecStartPost=-/usr/bin/jack_control start
ExecStartPost=-/bin/sleep 3

ExecStartPost=-/usr/bin/pacmd load-module module-jackdbus-detect channels=2 connect=true
ExecStartPost=-/bin/sleep 3
ExecStartPost=-/usr/bin/pacmd set-default-sink jack_out
ExecStartPost=-/usr/bin/pacmd suspend-sink jack_out 0

ExecStop=-/usr/bin/jack_control exit
ExecStopPost=-/bin/sleep 2
ExecStopPost=-/usr/bin/killall -9 jackdbus
ExecStopPost=-/bin/sleep 1

ExecStopPost=-/usr/bin/pacmd unload-module module-jackdbus-detect
ExecStopPost=-/bin/sleep 1
ExecStopPost=-/usr/bin/pacmd unload-module module-jack-sink
ExecStopPost=-/usr/bin/pacmd unload-module module-jack-source
ExecStopPost=-/bin/sleep 1
ExecStopPost=-/usr/bin/pacmd set-default-sink alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1
ExecStopPost=-/bin/sleep 2
ExecStopPost=-/usr/bin/pacmd suspend 0

SuccessExitStatus=0
RemainAfterExit=yes

[Install]
WantedBy=default.target

"

~/.local/share/dbus-1/services/org.jackaudio.service
"
[D-BUS Service]
Name=org.jackaudio.service
#Exec=/usr/bin/jackdbus auto

SystemdService=dbus-org.jackaudio.service
"

~/.local/share/dbus-1/services/dbus-org.gna.home.a2jmidid.service
"
[Unit]
Description=alsa2jack dbus
Requires=dbus.socket
Requires=dbus-org.jackaudio.service
After=dbus-org.jackaudio.service

[Service]
Type=dbus
BusName=org.gna.home.a2jmidid

ExecStartPre=-/usr/bin/killall -9 a2jmidid
ExecStartPre=-/bin/sleep 2

ExecStart=/usr/bin/a2jmidid dbus
ExecStartPost=/bin/sleep 3
ExecStartPost=/usr/bin/a2j_control ehw
ExecStartPost=/bin/sleep 5
ExecStartPost=/usr/bin/a2j_control start

ExecStop=/usr/bin/a2j_control exit
ExecStopPost=-/bin/sleep 2
ExecStopPost=-/usr/bin/killall -9 a2jmidid

SuccessExitStatus=0
RemainAfterExit=true

[Install]
WantedBy=default.target
"


~/.local/share/dbus-1/services/org.gna.home.a2jmidid.service
"
[D-BUS Service]
Name=org.gna.home.a2jmidid
#Exec=/usr/bin/a2jmidid dbus

SystemdService=dbus-org.gna.home.a2jmidid.service
"

commands:

systemctl --user reenable dbus-org.gna.home.a2jmidid.service
systemctl --user reenable dbus-org.jackaudio.service
systemctl --user daemon-reload

These commands recreate the symlinks for the startup under ~/.config/systemd/user for these two new unit files,
On the next bootup these can be verified as working, by verifying with,

systemctl --user list-dependencies default.target

if any of the services failed, there would be a red marker showing which one.

should work better having dbus startup inside ~/.config/systemd/user

It would be cool to manage this in some repository, perhaps https://gist.github.com/ – that allows for updates and it can also easily be picked up by jack-packagers

A forum isn’t really suitable for long scripts and code dumps.

You might also want to ping http://lists.jackaudio.org/listinfo.cgi/jack-devel-jackaudio.org
or some Linux specific list: https://lists.linuxaudio.org/listinfo/linux-audio-user

To help troubleshoot for anyone stuck with this a2jmidid -e /a2jmidid dbus mess,

a2jmidid -e or ‘a2jmidid dbus’ can both connect to either jackd or jackdbus…

however, “a2j_control” statements only work against a2jmidid_dbus.

In order to use a2jmidid dbus, it takes 2 or 3 commands, but with “a2jmidid -e” runs by itself…

The instructions I provided treats things so if the time comes “a2jmidid -e” and “a2jmidid dbus” cannot cross paths to jackdbus and jackd transparently, it is better to say

  1. Ok I want non-dbus, so try to use “non-dbus” things, that means-> jackd + a2jmidid -e

or 2) I rather have only dbus services, then fine stick with -> jackdbus + a2jmidid dbus

Further notes, there are users not knowing the difference between a2jmidid -e and a2jmidid dbus,

a2j_control -> is for a2jmidid dbus, not a2jimidi -e

You can verify if you are using a2jmidid’s bridge by using
a2j_control status,

It can also be determined if a2jmidid dbus is being used by checking ~/.log/a2j/a2j.log , afaik this log only fills up when a2jmidid dbus is being used, and not a2jmidid -e …
(issuing a2j_control statements also adds more logging to this file, also confirming that a2jmidid dbus is being used)

If you’re like me and want to make sure ‘a2jmidid -e’ and a2jmidid dbus cannot ever run at the same time, then make sure a2jmidid dbus cannot become auto-activated…

You can prevent “a2jmidid dbus” from becoming auto-activated by using a false Exec= for its server binary…

~/.local/share/dbus-1/services/org.gna.home.a2jmidid.service
"
[D-BUS Service]
Name=org.gna.home.a2jmidid
Exec=/bin/false
"
That should be the same filename as /usr/share/dbus-1/services/org.gna.home.a2jmidid.service (otherwise use the same filename that comes with your distribution)

After creating this dbus unit, you do killall -9 a2jmidid, pgrep -fa a2jmidid to see if it is gone… then see if “a2j_control status” works.

If the a2j_control command fails, then the override worked and you never have to worry about “a2jmidid dbus” and “a2jmidid -e” from ever trying fighting one another and trying to grab the same hardware ports…


If a user on the other wants to use dbus,

they can use either
-> a2jmidid -e &
or
-> a2j_control ehw, a2j_control start,

The dbus-compliant way to work with “a2jmidid dbus” is to have its dbus activation triggered by an a2j_control statement, and not to ever use “a2jmidid -e”…

You can see if your commands are taking effect by checking ~/.log/a2j/a2j.conf – if this is getting filled up, you are using a2jmidid dbus, and not a2midid -e…
(note: everytime you issue “a2j_control” or an a2j-dbus aware command, you are auto-loading “a2jmidid dbus”

So if you use “a2jmidid -e”, and then you are using a2j_control commands, then you are doing things wrongly and may cause conflicts between these two…
To be safe, it is better imho to “block” out from accidentally firing up “a2jmidid dbus” by using that setting override in ~/.local/share/dbus-1/services/org.gna.home.a2jmidid.service
)

for pulseaudio, you’ll need to use --realtime applied to it, otherwise you’ll have all kinds of xruns with it
(I mention above how to override the default pulseaudio unit file)

fwiw, users should be trying to go towards jackdbus, which is why distros have left these in their auto-configuration state. Since some users do not know how to deactivate or prevent them from auto-activating them, I’m posting this here and there on the web…

I’ve been learning a lot the last couple days on how to disactivate dbus, the documentation on it is quite scattered making it difficult to put it together, so I’m posting it at a few places.
Despite the saying of disactivating a2j/jack dbus, I think it is better that I adjust to using it as that’s likely where things are going.

I see a lot of users typing commands that do not go against the dbus process counterpart and there’s a lot of circling advice about how to fix things…

Instead of applying removing systemd unit files, might as well keep the overriding unit files in ~, and do things by working with unit files in simple paths where systemd expects them. My workaround is probably not the best way about it for all users, but a system upgrade should generally not break these custom settings as they are all in ~, and not in places like /lib/systemd/system, or /usr/share/dbus-1/services where they get overwritten by system upgrades. (avoiding system paths)


The best way about all of this is if developers can come together to combat this issue, many of us users(including me as well) fall for going with the instruction of doing “a2jmidid -e” when it is not necessary in a dbus-aware system and only adding more confusion to it by trying things like “a2j_control” which is not doing anything against “a2jmidid -e”(and rather it is only meant to work with “a2jmidid dbus”)

afaict either form can work with jackd/jackdbus transparently, but I don’t think they should be running (a2jmidid -e + a2jmidid dbus) at the same time. (In the future that may change however, so it’s better to either stick with dbus-only or non-dbus setups to make things easier)

The problem with a2jmidid’s dbus activation file, is you can’t have more than 1 Exec= line…(or for any dbus activation file), …

Also, undocumented is the “~/.config/a2j/a2j.conf” file that is supposed to get parsed, I tried using that instead of relying on typing “a2j_control ehw”, “a2j_control start” … it would be better if a2j.conf actually worked… I don’t think it does, maybe my syntax was not xml-compliant, but I looked at the code and gave it a try… I’ll have to complain to the a2j developers on that…

a2j is difficult to work with… so I just threw that into a systemd unit file, but the mistake many users make here is thinking a2j_control takes care of “a2jmidid -e”, what they end up doing is to call up “a2midid dbus”, and as a result that may also call up jackdbus, when the user only wants to stick with jackd.

Takes less gray out of the equation–> don’t use a2j_control unless you are working with a2jmidid dbus.

You can use “a2jmidid -e” instead of the “a2jmidid dbus” as I have set in the provided examples. If going this route, then I would suggest to block out “a2jmidid dbus” with a simple override which is merely 2 or 3 lines in a dbus unit file.

makes sense at least for me, for both long term and short term, … I just want this to work without conflicts, and I finally got this pieced together tehehe

gl&hf peeeps

yes I’ll do that, thanks

you should also ensure that pulseaudio is running realtime (you can apply --realtime to its unit command, or verify that the realtime settings are set in its configuration files),

as for the a2j dbus & non-dbus(when using -e), I find that they both actually work with Jackd and JackDbus. It doesn’t matter which one you use they will work everywhere.

I think the problem comes down to when users start running both a2j dbus and a2j non-dbus at the same time…

a2j_control __ , using this command in itself automatically starts a2jmidid dbus, … and there’s a number of instances that users think this is for a2jmidid -e , so this is incorrect.

This stirs a lot of discussion online, the documentation is not very good in a2j… The most favorable thing to do is to block one of them, use dbus-only or jackd+nondbus things…

A2jmidid -e and A2jmidid dbus << work equally well across all jack servers, … the thing is I don’t think users realize this, but perhaps in the future these two will not be cross-over compatible…

I suspect both should not work together so I am treating them as incompatible for all instances just to be safe.

In this case, I don’t agree. a2j is a jack client. Jack does not care if it is started by dbus or from command line. Jack and a2j do not ever use dbus to talk to each other. The problem with the dbus version of a2jmidi is that it logs everything. I have had it stop working and then my disk fill up with Gb a2j logging. Maybe this is only a problem with the particular debian version I am using. Having my recording session quit with out of disk space because of a2jmidi is not acceptable. Dbus is certainly handy for controlling things, but with a2jmidi-dbus I have found out the hard way that it is better to just use the commandline a2jmidid version. Unlike jack, a2jmidid does not get auto started by some application that needs it. It has to be started manually and so the problem of having both running at the same time would be a user error.
What is likely to happen in the future is that a2jmidi will end up being wrapped up as a part of jackd/jackdbus as it has with jackd1.

a2j_control ehw start
works just fine no need for two lines.
same with jack_control, more than one command per line is ok. I do use more than one line, however, just to make things more readable, I have found that if the user has ever used qjackctl, it is best to set the playback and record devices to none first then set the overall device. people with USB mics in general have this problem, they use qjackctl to try and set usbmic for input and internal audio for output. this locks jackdbus up as unusable until capture and playback are set to none. Even restarting jackdbus does not help because it remembers how it has been used before.

I use the xdg autostart method of starting jackdbus, a2jmidid, changing pulse settings and unloading/loading modules, adding zita-ajbridge instances (for people who must use usbmicvs) and doing some jack port connections so that sound from pulse goes to the right ports (in case they are not 1 + 2. This is controlled by a background daemon that has the advantage that the user can use a GUI applet to talk to the daemon (using dbus as happens) to make changes on the fly. No systemd required.

I would add:
/usr/bin/pacmd unload-module module-udev-detect
/usr/bin/pacmd unload-module module-alsa-card

While running jack, this will allow jack to run in freerun mode. (like when Ardour is exporting)
So long as Pulse can access any alsa device at all (even if it is not being used) the sync from that device will affect jack through the pulse jack bridge causing the odd xrun and on some systems crashing applications that try to use freerun. There is also the added advantage that jack will be the default device for pulse by virtue of being it’s only option :slight_smile:

Overall, using systemd for at least some use cases is a great idea. I also agree with setting all config each and every time jack is started and not using a config file, one use of qjackctl or other jack controller can leave one with lots of head scratching.

Unlike jack, a2jmidid does not get auto started by some application that needs it.

Actually a2jmidid dbus is activated every time a user uses “a2j_control”, you can verify this with using pgrep and just issuing a2j_control status… < user error? Maybe. But more often than not many users make the mistake they are querying the status of “a2jmidid -e” but instead just opening/loading another instance of a2jmidid.(via dbus)

When you say “freeruns”, I suppose you mean “free of xruns” , there’s xruns throughout the system, particularly with how well the CFS scheduler is setup… The better the scheduler is tuned, the better it will run, and therefore the less changes of encountering xruns, … and as in anything there’s more than 1 thing that contributes to xruns…

From context “(like when Ardour is exporting)”, he means freewheeling.

ie, disconnect from the soundcard and run as fast as possible, but as slow as needed. In freewheel mode, jack cannot xrun. – you can manually en/disable it using the jack_freewheel commandline tool for testing.