Latency

How much delay JackMoebius adds between an app and JACK: the numbers, how they were measured, on which Mac, and what they mean for your buffer settings.

The short version

JackMoebius adds about 3 ms or less to the round trip of an app: 3.0 ms at 44.1 kHz, 2.7 ms at 48 kHz, and 1.4 to 1.5 ms at 88.2 and 96 kHz. That comes on top of the buffer your app already uses and of the JACK period you choose. An app running a 64-frame buffer at 48 kHz goes into JACK and back in about 4 ms.

Note

Round trip means out of an app into JACK, and back into an app. It is not a one-way figure: do not halve it.

What these numbers are made of

Digital audio is processed in small blocks. The size of a block, in frames, is the buffer. A frame is one sample for each channel, so a “128-sample buffer” in your DAW and a 128-frame buffer in JACK or macOS are the same thing: this page says frames, like JACK and CoreAudio do. The smaller it is, the lower the delay, and the harder the computer has to work to never miss a block. A missed block is a click.

To convert: 64 frames last 1.33 ms at 48 kHz, 128 frames 2.67 ms, 384 frames 8 ms. At 96 kHz the same number of frames lasts half as long.

When an app’s sound goes through JackMoebius into JACK and back, three delays add up:

What Who decides Typical size at 48 kHz
The app’s buffer you, in the app’s audio settings 64 frames = 1.33 ms
The JACK period you, when you start JACK 128 frames = 2.67 ms
JackMoebius the bridge, fixed about 130 frames = 2.7 ms

JackMoebius hands each app’s audio to JACK, and JACK’s audio back to the app, through a shared memory area. So that a block never arrives late, it keeps a small cushion in each direction: 64 frames on the way out and 64 frames on the way back, plus a few frames of transfer. That is its whole cost, about 130 frames, whatever the buffer or the JACK period (up to 1024 frames).

The measurements

The tables and charts below are what we measured. The first chart shows the JACK period next to JackMoebius’s own cost; the tables give the exact values; the four columns show where the cost comes from.

JackMoebius own cost, next to the JACK latency
JACKJACK latency = period / rate
JackMoebiusJackMoebius own cost (round trip, without the app buffer)
JackMoebius own cost, by JACK period and sample rate

What the bridge adds on its own, without the app’s buffer: milliseconds, frames below. Median over the app buffers; hover a cell for the min, the max and each block. The darker the cell, the closer to the lowest value.

JACK period (frames)
16
32
64
128
256
512
1024
2048
4096
44 100 Hz
2.9 ms130 frames
2.9 ms130 frames
3.0 ms133 frames
3.0 ms133 frames
3.0 ms132 frames
3.0 ms130 frames
3.1 ms137 frames
3.2 ms140 frames
3.1 ms138 frames
48 000 Hz
2.7 ms130 frames
2.7 ms129 frames
2.7 ms130 frames
2.7 ms132 frames
2.7 ms132 frames
2.8 ms136 frames
2.8 ms133 frames
2.9 ms138 frames
3.3 ms158 frames
88 200 Hz
—
1.5 ms130 frames
1.5 ms129 frames
1.5 ms129 frames
1.5 ms133 frames
1.5 ms136 frames
1.4 ms126 frames
1.7 ms154 frames
2.5 ms222 frames
96 000 Hz
—
1.5 ms148 frames
1.3 ms126 frames
1.4 ms133 frames
1.4 ms134 frames
1.4 ms135 frames
1.5 ms142 frames
2.0 ms192 frames
2.9 ms282 frames
period
44 100 Hz
48 000 Hz
88 200 Hz
96 000 Hz
16
2.9 ms130 frames
2.7 ms130 frames
—
—
32
2.9 ms130 frames
2.7 ms129 frames
1.5 ms130 frames
1.5 ms148 frames
64
3.0 ms133 frames
2.7 ms130 frames
1.5 ms129 frames
1.3 ms126 frames
128
3.0 ms133 frames
2.7 ms132 frames
1.5 ms129 frames
1.4 ms133 frames
256
3.0 ms132 frames
2.7 ms132 frames
1.5 ms133 frames
1.4 ms134 frames
512
3.0 ms130 frames
2.8 ms136 frames
1.5 ms136 frames
1.4 ms135 frames
1024
3.1 ms137 frames
2.8 ms133 frames
1.4 ms126 frames
1.5 ms142 frames
2048
3.2 ms140 frames
2.9 ms138 frames
1.7 ms154 frames
2.0 ms192 frames
4096
3.1 ms138 frames
3.3 ms158 frames
2.5 ms222 frames
2.9 ms282 frames
Where the cost comes from, by the buffer the app was granted

JackMoebius’s own cost is two jitter pads, one in each direction, plus a few frames. Each column is drawn to scale; the yellow mark is what was measured (the median, with its standard deviation below) over every sample rate and every JACK period up to 1024.

16 frames
80forward pad
64reverse pad
◆ 145
80 + 64 + 1 measured 145 (median), stdev 3
64 frames
64forward pad
64reverse pad
◆ 128
64 + 64 + 0 measured 128 (median), stdev 8
128 frames
64forward pad
64reverse pad
◆ 130
64 + 64 + 2 measured 130 (median), stdev 10
384 frames
64forward pad
64reverse pad
◆ 134
64 + 64 + 6 measured 134 (median), stdev 8
forward pad (lag target − block)reverse pad (reader margin − block − period)the rest (publication delay, noise)measured
Round trip through an app, by the buffer it runs at

JackMoebius’s own cost plus the app’s buffer, in milliseconds (frames below), and the share of it that is JackMoebius’s own cost; the rest is the app’s buffer. The JACK period comes on top. Median over JACK periods up to 1024. “not granted”: CoreAudio gave the app a bigger buffer than the one it asked for.

app buffer
44 100 Hz
48 000 Hz
88 200 Hz
96 000 Hz
16 frames
3.7 ms161 frames
3.4 ms161 frames
not granted
not granted
64 frames
4.4 ms193 frames
4.0 ms192 frames
2.1 ms189 frames
2.0 ms194 frames
128 frames
5.9 ms258 frames
5.4 ms257 frames
2.9 ms258 frames
2.7 ms262 frames
384 frames
11.7 ms516 frames
10.8 ms516 frames
5.9 ms520 frames
5.5 ms524 frames
16 frames
44 100 Hz3.7 ms 161 frames90 % JackMoebius · 10 % app buffer
48 000 Hz3.4 ms 161 frames90 % JackMoebius · 10 % app buffer
88 200 Hznot granted
96 000 Hznot granted
64 frames
44 100 Hz4.4 ms 193 frames67 % JackMoebius · 33 % app buffer
48 000 Hz4.0 ms 192 frames67 % JackMoebius · 33 % app buffer
88 200 Hz2.1 ms 189 frames66 % JackMoebius · 34 % app buffer
96 000 Hz2.0 ms 194 frames67 % JackMoebius · 33 % app buffer
128 frames
44 100 Hz5.9 ms 258 frames50 % JackMoebius · 50 % app buffer
48 000 Hz5.4 ms 257 frames50 % JackMoebius · 50 % app buffer
88 200 Hz2.9 ms 258 frames50 % JackMoebius · 50 % app buffer
96 000 Hz2.7 ms 262 frames51 % JackMoebius · 49 % app buffer
384 frames
44 100 Hz11.7 ms 516 frames26 % JackMoebius · 74 % app buffer
48 000 Hz10.8 ms 516 frames26 % JackMoebius · 74 % app buffer
88 200 Hz5.9 ms 520 frames26 % JackMoebius · 74 % app buffer
96 000 Hz5.5 ms 524 frames27 % JackMoebius · 73 % app buffer

How we measured it

The tool. jack_iodelay ships with JACK. It sends a test signal into the graph and measures how long it takes to come back, in frames. It measures what really happens, not what a device announces about itself.

Two loops. For each setting we measure twice:

  1. a direct loop: the signal leaves jack_iodelay and returns to it inside JACK. The result is the JACK period itself, and it is our reference;
  2. a loop through JackMoebius: the signal goes into JackMoebius’s shared input, through a test app, and the app’s output comes back into JACK.

The difference between the two is the cost of the trip through JackMoebius and the app.

The test app. A minimal CoreAudio app built with Faust whose output is simply its input. It does nothing to the sound and handles input and output in the same callback, so it adds no delay of its own. We run it with an audio buffer of 16, 64, 128 and 384 frames.

Isolating JackMoebius. CoreAudio tells us which buffer it really granted to the app, and that buffer is not JackMoebius’s. We subtract it from the difference above: what remains is JackMoebius’s own cost, the part the tables call “own cost”.

The grid. Four sample rates (44.1, 48, 88.2 and 96 kHz), nine JACK periods (16 to 4096 frames) and four app buffers make 144 settings. 138 were measured: at 88.2 and 96 kHz, JACK itself would not start with a 16-frame period. For each setting, JACK and JackMoebius are restarted, we wait a few seconds, then jack_iodelay runs for 16 seconds and we keep the median of its last five readings. The test app is the only app using the shared JackMoebius device: that device runs at the smallest buffer any of its apps asks for, so another app would change the result.

What was not measured. The devices of their own (JackMoebius for <App>) follow the same design but were not measured separately. One-way latencies, plug-ins, and the delay of a physical audio interface are not included either.

The machine

Computer MacBook Pro (model Mac17,8), Apple M5 Pro
macOS 26.7
JackMoebius 1.1.0, default settings (safety offset 64)
JACK JACK 2 (jackdmp 1.9.22), the Mac’s built-in microphone and speakers as its audio devices
Date 22 October 2026

These are measurements from one Mac. Yours may differ a little, especially with heavy plug-ins and very small buffers. The raw data is available: the measurements (CSV) and the machine and settings.

What it means for your settings

  • The best way to lower the delay is the app’s buffer, not JackMoebius, whose share is fixed. With a 384-frame buffer JackMoebius is a quarter of the total; with 16 frames it is nine tenths of a much smaller total.
  • Apps that share the JackMoebius device run at the smallest buffer any of them asks for. A device of its own (JackMoebius for <App>) keeps its own buffer.
  • At 88.2 and 96 kHz CoreAudio did not grant a 16-frame buffer in our tests: the smallest we obtained was 64 frames.
  • A small buffer costs CPU and leaves less margin. If you hear clicks, raise the buffer first.
  • The JACK period is yours too. JackMoebius’s cost does not depend on it up to 1024 frames. At 88.2 and 96 kHz with periods of 2048 and more, it grows.
  • For comparison, with a 384-frame buffer the bridge of JackMoebius 1.0 added about 123 ms in the same kind of test. Version 1.1.0 adds 10.7 ms with the same buffer, and 4 ms with a 64-frame buffer.

The safety offset

The safety offset is a value the JackMoebius devices announce to macOS. It is 64 frames by default, and jackmoebius safety changes it (see the command line reference); the change applies the next time the daemon starts. We measured 0, 64 and 128 frames, at 48 kHz with a JACK period of 128 and app buffers of 64 and 384: the round trip did not change, so it is not a latency setting.

Back to top