Fix Linux audio: enable JACK support and RT priority for audio callback
This commit is contained in:
@@ -53,7 +53,7 @@ doux = { git = "https://github.com/sova-org/doux", features = ["native"] }
|
|||||||
rusty_link = "0.4"
|
rusty_link = "0.4"
|
||||||
ratatui = "0.30"
|
ratatui = "0.30"
|
||||||
crossterm = "0.29"
|
crossterm = "0.29"
|
||||||
cpal = "0.17"
|
cpal = { version = "0.17", features = ["jack"] }
|
||||||
clap = { version = "4", features = ["derive"] }
|
clap = { version = "4", features = ["derive"] }
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
use cpal::traits::{DeviceTrait, StreamTrait};
|
||||||
use cpal::Stream;
|
use cpal::Stream;
|
||||||
use crossbeam_channel::Receiver;
|
use crossbeam_channel::Receiver;
|
||||||
use doux::{Engine, EngineMetrics};
|
use doux::{Engine, EngineMetrics};
|
||||||
@@ -246,14 +246,10 @@ pub fn build_stream(
|
|||||||
initial_samples: Vec<doux::sampling::SampleEntry>,
|
initial_samples: Vec<doux::sampling::SampleEntry>,
|
||||||
audio_sample_pos: Arc<AtomicU64>,
|
audio_sample_pos: Arc<AtomicU64>,
|
||||||
) -> Result<(Stream, f32, AnalysisHandle), String> {
|
) -> Result<(Stream, f32, AnalysisHandle), String> {
|
||||||
let host = cpal::default_host();
|
|
||||||
|
|
||||||
let device = match &config.output_device {
|
let device = match &config.output_device {
|
||||||
Some(name) => doux::audio::find_output_device(name)
|
Some(name) => doux::audio::find_output_device(name)
|
||||||
.ok_or_else(|| format!("Device not found: {name}"))?,
|
.ok_or_else(|| format!("Device not found: {name}"))?,
|
||||||
None => host
|
None => doux::audio::default_output_device().ok_or("No default output device")?,
|
||||||
.default_output_device()
|
|
||||||
.ok_or("No default output device")?,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let default_config = device.default_output_config().map_err(|e| e.to_string())?;
|
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 fft_producer, analysis_handle) = spawn_analysis_thread(sample_rate, spectrum_buffer);
|
||||||
|
|
||||||
let mut cmd_buffer = String::with_capacity(256);
|
let mut cmd_buffer = String::with_capacity(256);
|
||||||
|
let mut rt_set = false;
|
||||||
|
|
||||||
let stream = device
|
let stream = device
|
||||||
.build_output_stream(
|
.build_output_stream(
|
||||||
&stream_config,
|
&stream_config,
|
||||||
move |data: &mut [f32], _| {
|
move |data: &mut [f32], _| {
|
||||||
|
if !rt_set {
|
||||||
|
super::realtime::set_realtime_priority();
|
||||||
|
rt_set = true;
|
||||||
|
}
|
||||||
|
|
||||||
let buffer_samples = data.len() / channels;
|
let buffer_samples = data.len() / channels;
|
||||||
let buffer_time_ns = (buffer_samples as f64 / sr as f64 * 1e9) as u64;
|
let buffer_time_ns = (buffer_samples as f64 / sr as f64 * 1e9) as u64;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user