From d602a3a8e2c057b1fd84e89f018a48f97b2c5721 Mon Sep 17 00:00:00 2001 From: CJ Pais Date: Wed, 8 Oct 2025 17:47:10 -0700 Subject: [PATCH] use alsa by default on linux (#190) * use alsa by default on linux * only import trait when needed --- src-tauri/src/audio_feedback.rs | 2 +- src-tauri/src/audio_toolkit/audio/device.rs | 4 ++-- src-tauri/src/audio_toolkit/audio/recorder.rs | 2 +- src-tauri/src/audio_toolkit/mod.rs | 2 ++ src-tauri/src/audio_toolkit/utils.rs | 13 +++++++++++++ 5 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 src-tauri/src/audio_toolkit/utils.rs diff --git a/src-tauri/src/audio_feedback.rs b/src-tauri/src/audio_feedback.rs index feaa00f..eb2749f 100644 --- a/src-tauri/src/audio_feedback.rs +++ b/src-tauri/src/audio_feedback.rs @@ -67,7 +67,7 @@ fn play_audio_file( OutputStreamBuilder::from_default_device()? } else { // Try to find the device by name - let host = cpal::default_host(); + let host = crate::audio_toolkit::get_cpal_host(); let devices = host.output_devices()?; let mut found_device = None; diff --git a/src-tauri/src/audio_toolkit/audio/device.rs b/src-tauri/src/audio_toolkit/audio/device.rs index fbe2dec..61e8fcc 100644 --- a/src-tauri/src/audio_toolkit/audio/device.rs +++ b/src-tauri/src/audio_toolkit/audio/device.rs @@ -8,7 +8,7 @@ pub struct CpalDeviceInfo { } pub fn list_input_devices() -> Result, Box> { - let host = cpal::default_host(); + let host = crate::audio_toolkit::get_cpal_host(); let default_name = host.default_input_device().and_then(|d| d.name().ok()); let mut out = Vec::::new(); @@ -30,7 +30,7 @@ pub fn list_input_devices() -> Result, Box Result, Box> { - let host = cpal::default_host(); + let host = crate::audio_toolkit::get_cpal_host(); let default_name = host.default_output_device().and_then(|d| d.name().ok()); let mut out = Vec::::new(); diff --git a/src-tauri/src/audio_toolkit/audio/recorder.rs b/src-tauri/src/audio_toolkit/audio/recorder.rs index a3fb159..5c58d4a 100644 --- a/src-tauri/src/audio_toolkit/audio/recorder.rs +++ b/src-tauri/src/audio_toolkit/audio/recorder.rs @@ -62,7 +62,7 @@ impl AudioRecorder { let (sample_tx, sample_rx) = mpsc::channel::>(); let (cmd_tx, cmd_rx) = mpsc::channel::(); - let host = cpal::default_host(); + let host = crate::audio_toolkit::get_cpal_host(); let device = match device { Some(dev) => dev, None => host diff --git a/src-tauri/src/audio_toolkit/mod.rs b/src-tauri/src/audio_toolkit/mod.rs index 54c648c..6975fd9 100644 --- a/src-tauri/src/audio_toolkit/mod.rs +++ b/src-tauri/src/audio_toolkit/mod.rs @@ -1,10 +1,12 @@ pub mod audio; pub mod constants; pub mod text; +pub mod utils; pub mod vad; pub use audio::{ list_input_devices, list_output_devices, save_wav_file, AudioRecorder, CpalDeviceInfo, }; pub use text::apply_custom_words; +pub use utils::get_cpal_host; pub use vad::{SileroVad, VoiceActivityDetector}; diff --git a/src-tauri/src/audio_toolkit/utils.rs b/src-tauri/src/audio_toolkit/utils.rs new file mode 100644 index 0000000..1173e84 --- /dev/null +++ b/src-tauri/src/audio_toolkit/utils.rs @@ -0,0 +1,13 @@ +/// Returns the appropriate CPAL host for the current platform. +/// On Linux, uses ALSA host. On other platforms, uses the default host. +pub fn get_cpal_host() -> cpal::Host { + #[cfg(target_os = "linux")] + { + cpal::host_from_id(cpal::HostId::Alsa).unwrap_or_else(|_| cpal::default_host()) + } + #[cfg(not(target_os = "linux"))] + { + use cpal::traits::HostTrait; + cpal::default_host() + } +}