diff --git a/desktop/src-tauri/src/cmd/audio.rs b/desktop/src-tauri/src/cmd/audio.rs index ffe2672a..68844ce2 100644 --- a/desktop/src-tauri/src/cmd/audio.rs +++ b/desktop/src-tauri/src/cmd/audio.rs @@ -76,8 +76,12 @@ pub async fn start_record( tracing::debug!("Device ID: {}", device.id); let is_input = device.is_input; - let device_id: usize = device.id.parse().context("Failed to parse device ID")?; - let device = host.devices()?.nth(device_id).context("Failed to get device by ID")?; + let device_name = device.name.clone(); + let device = host + .devices()? + .find(|d| d.description().ok().map(|desc| desc.name() == device_name).unwrap_or(false)) + .with_context(|| format!("Audio device '{}' is no longer available.", device_name))?; + let config = if is_input { device.default_input_config().context("Failed to get default input config")? } else { @@ -100,47 +104,97 @@ pub async fn start_record( tracing::error!("An error occurred on stream: {}", err); }; - let stream = match config.sample_format() { - cpal::SampleFormat::I8 => device.build_input_stream( - &config.into(), - move |data, _: &_| { - tracing::trace!("Writing input data (I8)"); - write_input_data::(data, &writer_2) - }, - err_fn, - None, - )?, - cpal::SampleFormat::I16 => device.build_input_stream( - &config.into(), - move |data, _: &_| { - tracing::trace!("Writing input data (I16)"); - write_input_data::(data, &writer_2) - }, - err_fn, - None, - )?, - cpal::SampleFormat::I32 => device.build_input_stream( - &config.into(), - move |data, _: &_| { - tracing::trace!("Writing input data (I32)"); - write_input_data::(data, &writer_2) - }, - err_fn, - None, - )?, - cpal::SampleFormat::F32 => device.build_input_stream( - &config.into(), - move |data, _: &_| { - tracing::trace!("Writing input data (F32)"); - write_input_data::(data, &writer_2) - }, - err_fn, - None, - )?, - sample_format => { - bail!("Unsupported sample format '{}'", sample_format) + let build_result = if is_input { + match config.sample_format() { + cpal::SampleFormat::I8 => device.build_input_stream( + &config.into(), + move |data, _: &_| { + tracing::trace!("Writing input data (I8)"); + write_input_data::(data, &writer_2) + }, + err_fn, + None, + ), + cpal::SampleFormat::I16 => device.build_input_stream( + &config.into(), + move |data, _: &_| { + tracing::trace!("Writing input data (I16)"); + write_input_data::(data, &writer_2) + }, + err_fn, + None, + ), + cpal::SampleFormat::I32 => device.build_input_stream( + &config.into(), + move |data, _: &_| { + tracing::trace!("Writing input data (I32)"); + write_input_data::(data, &writer_2) + }, + err_fn, + None, + ), + cpal::SampleFormat::F32 => device.build_input_stream( + &config.into(), + move |data, _: &_| { + tracing::trace!("Writing input data (F32)"); + write_input_data::(data, &writer_2) + }, + err_fn, + None, + ), + sample_format => { + bail!("Unsupported sample format '{}'", sample_format) + } + } + } else { + match config.sample_format() { + cpal::SampleFormat::I8 => device.build_output_stream( + &config.into(), + move |data, _: &_| { + tracing::trace!("Capturing output data (I8)"); + write_input_data::(data, &writer_2) + }, + err_fn, + None, + ), + cpal::SampleFormat::I16 => device.build_output_stream( + &config.into(), + move |data, _: &_| { + tracing::trace!("Capturing output data (I16)"); + write_input_data::(data, &writer_2) + }, + err_fn, + None, + ), + cpal::SampleFormat::I32 => device.build_output_stream( + &config.into(), + move |data, _: &_| { + tracing::trace!("Capturing output data (I32)"); + write_input_data::(data, &writer_2) + }, + err_fn, + None, + ), + cpal::SampleFormat::F32 => device.build_output_stream( + &config.into(), + move |data, _: &_| { + tracing::trace!("Capturing output data (F32)"); + write_input_data::(data, &writer_2) + }, + err_fn, + None, + ), + sample_format => { + bail!("Unsupported sample format '{}'", sample_format) + } } }; + let stream = build_result.with_context(|| { + format!( + "Failed to open audio stream for device '{}'. The device may have been disconnected or is in use by another application. Try re-selecting the device.", + device_name + ) + })?; stream.play()?; tracing::debug!("Stream started playing"); diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json index b7586466..19767810 100644 --- a/desktop/src-tauri/tauri.conf.json +++ b/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "./gen/schemas/desktop-schema.json", "productName": "vibe", - "version": "3.0.15", + "version": "3.0.16", "identifier": "github.zerozr99.workers.dev.thewh1teagle.vibe", "app": { "windows": [],