diff options
| author | rt-rtos <[email protected]> | 2026-08-04 21:09:20 +0200 |
|---|---|---|
| committer | rt-rtos <[email protected]> | 2026-08-04 21:09:20 +0200 |
| commit | b0738b5949130d5ab175835d72bb793830d09bc9 (patch) | |
| tree | af477ed87f4cf569a46d36c10066f30d06b0a299 /src | |
| parent | f3021b337fcea154b898489c417d428c92f88e92 (diff) | |
audio_device: enforce the documented FIFO minimum in the EP-IN flow-control guard
The comment above audiod_tx_packet_size() states flow control needs a FIFO
of at least 4*Navg, but the guard tests nominal_size[1] <= fifo_depth * 4 -
true for any FIFO larger than a quarter packet - instead of
nominal_size[1] * 4 <= fifo_depth. As written, flow control engages on
FIFOs far below its own documented minimum, where the depth/2 setpoint sits
within one packet of empty and the packet_size = 0 branch (a zero-length
packet, i.e. an audible 1 ms dropout for audio-class hosts) is reachable
from ordinary scheduling jitter rather than only from gross clock
deviation. With the guard corrected, undersized FIFOs fall back to the
plain min(count, max) path as intended.
Diffstat (limited to 'src')
| -rw-r--r-- | src/class/audio/audio_device.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/class/audio/audio_device.c b/src/class/audio/audio_device.c index 94881521a..bc4c7e544 100644 --- a/src/class/audio/audio_device.c +++ b/src/class/audio/audio_device.c @@ -1841,7 +1841,7 @@ static bool audiod_calc_tx_packet_sz(audiod_function_t *audio) { static uint16_t audiod_tx_packet_size(const uint16_t *nominal_size, uint16_t data_count, uint16_t fifo_depth, uint16_t fifo_threshold, uint16_t max_depth) { // Flow control need a FIFO size of at least 4*Navg - if (nominal_size[1] && nominal_size[1] <= fifo_depth * 4) { + if (nominal_size[1] && nominal_size[1] * 4 <= fifo_depth) { // Use blackout to prioritize normal size packet static int ctrl_blackout = 0; uint16_t packet_size; |
