From 9d9dd5be38f260dadeb2002134850a7e0c766a7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Forment?= Date: Tue, 3 Feb 2026 14:04:34 +0100 Subject: [PATCH] Fix Linux audio: enable JACK support and RT priority for audio callback --- Cargo.toml | 2 +- src/engine/audio.rs | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8aa67aa..2bd1ab6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,7 +53,7 @@ doux = { git = "https://github.com/sova-org/doux", features = ["native"] } rusty_link = "0.4" ratatui = "0.30" crossterm = "0.29" -cpal = "0.17" +cpal = { version = "0.17", features = ["jack"] } clap = { version = "4", features = ["derive"] } rand = "0.8" serde = { version = "1", features = ["derive"] } diff --git a/src/engine/audio.rs b/src/engine/audio.rs index 2b42ad1..ed5a3e9 100644 --- a/src/engine/audio.rs +++ b/src/engine/audio.rs @@ -1,4 +1,4 @@ -use cpal::traits::{DeviceTrait, HostTrait, StreamTrait}; +use cpal::traits::{DeviceTrait, StreamTrait}; use cpal::Stream; use crossbeam_channel::Receiver; use doux::{Engine, EngineMetrics}; @@ -246,14 +246,10 @@ pub fn build_stream( initial_samples: Vec, audio_sample_pos: Arc, ) -> Result<(Stream, f32, AnalysisHandle), String> { - let host = cpal::default_host(); - let device = match &config.output_device { Some(name) => doux::audio::find_output_device(name) .ok_or_else(|| format!("Device not found: {name}"))?, - None => host - .default_output_device() - .ok_or("No default output device")?, + None => doux::audio::default_output_device().ok_or("No default output device")?, }; let default_config = device.default_output_config().map_err(|e| e.to_string())?; @@ -282,11 +278,17 @@ pub fn build_stream( let (mut fft_producer, analysis_handle) = spawn_analysis_thread(sample_rate, spectrum_buffer); let mut cmd_buffer = String::with_capacity(256); + let mut rt_set = false; let stream = device .build_output_stream( &stream_config, move |data: &mut [f32], _| { + if !rt_set { + super::realtime::set_realtime_priority(); + rt_set = true; + } + let buffer_samples = data.len() / channels; let buffer_time_ns = (buffer_samples as f64 / sr as f64 * 1e9) as u64;