From 244a99e623749ab4d1dcb36dd46afc1db9921def Mon Sep 17 00:00:00 2001 From: mg-dev25 <102437792+mg-dev25@users.noreply.github.com> Date: Sun, 30 Nov 2025 09:59:54 +0100 Subject: [PATCH] feat(audio): prioritize F32 sample format for better quality (#390) (#393) --- src-tauri/src/audio_toolkit/audio/recorder.rs | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/audio_toolkit/audio/recorder.rs b/src-tauri/src/audio_toolkit/audio/recorder.rs index cb203d2..c3f23ad 100644 --- a/src-tauri/src/audio_toolkit/audio/recorder.rs +++ b/src-tauri/src/audio_toolkit/audio/recorder.rs @@ -204,19 +204,36 @@ impl AudioRecorder { device: &cpal::Device, ) -> Result> { let supported_configs = device.supported_input_configs()?; + let mut best_config: Option = None; - // Try to find a config that supports 16kHz + // Try to find a config that supports 16kHz, prioritizing better formats for config_range in supported_configs { if config_range.min_sample_rate().0 <= constants::WHISPER_SAMPLE_RATE && config_range.max_sample_rate().0 >= constants::WHISPER_SAMPLE_RATE { - // Found a config that supports 16kHz, use it - return Ok( - config_range.with_sample_rate(cpal::SampleRate(constants::WHISPER_SAMPLE_RATE)) - ); + match best_config { + None => best_config = Some(config_range), + Some(ref current) => { + // Prioritize F32 > I16 > I32 > others + let score = |fmt: cpal::SampleFormat| match fmt { + cpal::SampleFormat::F32 => 4, + cpal::SampleFormat::I16 => 3, + cpal::SampleFormat::I32 => 2, + _ => 1, + }; + + if score(config_range.sample_format()) > score(current.sample_format()) { + best_config = Some(config_range); + } + } + } } } + if let Some(config) = best_config { + return Ok(config.with_sample_rate(cpal::SampleRate(constants::WHISPER_SAMPLE_RATE))); + } + // If no config supports 16kHz, fall back to default Ok(device.default_input_config()?) }