Handy/src-tauri/src/commands/audio.rs

124 lines
3.6 KiB
Rust

use crate::audio_toolkit::audio::{list_input_devices, list_output_devices};
use crate::managers::audio::{AudioRecordingManager, MicrophoneMode};
use crate::settings::{get_settings, write_settings};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
use tauri::{AppHandle, Manager};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AudioDevice {
pub index: String,
pub name: String,
pub is_default: bool,
}
#[tauri::command]
pub fn update_microphone_mode(app: AppHandle, always_on: bool) -> Result<(), String> {
// Update settings
let mut settings = get_settings(&app);
settings.always_on_microphone = always_on;
write_settings(&app, settings);
// Update the audio manager mode
let rm = app.state::<Arc<AudioRecordingManager>>();
let new_mode = if always_on {
MicrophoneMode::AlwaysOn
} else {
MicrophoneMode::OnDemand
};
rm.update_mode(new_mode)
.map_err(|e| format!("Failed to update microphone mode: {}", e))
}
#[tauri::command]
pub fn get_microphone_mode(app: AppHandle) -> Result<bool, String> {
let settings = get_settings(&app);
Ok(settings.always_on_microphone)
}
#[tauri::command]
pub fn get_available_microphones() -> Result<Vec<AudioDevice>, String> {
let devices =
list_input_devices().map_err(|e| format!("Failed to list audio devices: {}", e))?;
let mut result = vec![AudioDevice {
index: "default".to_string(),
name: "Default".to_string(),
is_default: true,
}];
result.extend(devices.into_iter().map(|d| AudioDevice {
index: d.index,
name: d.name,
is_default: false, // The explicit default is handled separately
}));
Ok(result)
}
#[tauri::command]
pub fn set_selected_microphone(app: AppHandle, device_name: String) -> Result<(), String> {
let mut settings = get_settings(&app);
settings.selected_microphone = if device_name == "default" {
None
} else {
Some(device_name)
};
write_settings(&app, settings);
// Update the audio manager to use the new device
let rm = app.state::<Arc<AudioRecordingManager>>();
rm.update_selected_device()
.map_err(|e| format!("Failed to update selected device: {}", e))?;
Ok(())
}
#[tauri::command]
pub fn get_selected_microphone(app: AppHandle) -> Result<String, String> {
let settings = get_settings(&app);
Ok(settings
.selected_microphone
.unwrap_or_else(|| "default".to_string()))
}
#[tauri::command]
pub fn get_available_output_devices() -> Result<Vec<AudioDevice>, String> {
let devices =
list_output_devices().map_err(|e| format!("Failed to list output devices: {}", e))?;
let mut result = vec![AudioDevice {
index: "default".to_string(),
name: "Default".to_string(),
is_default: true,
}];
result.extend(devices.into_iter().map(|d| AudioDevice {
index: d.index,
name: d.name,
is_default: false, // The explicit default is handled separately
}));
Ok(result)
}
#[tauri::command]
pub fn set_selected_output_device(app: AppHandle, device_name: String) -> Result<(), String> {
let mut settings = get_settings(&app);
settings.selected_output_device = if device_name == "default" {
None
} else {
Some(device_name)
};
write_settings(&app, settings);
Ok(())
}
#[tauri::command]
pub fn get_selected_output_device(app: AppHandle) -> Result<String, String> {
let settings = get_settings(&app);
Ok(settings
.selected_output_device
.unwrap_or_else(|| "default".to_string()))
}