124 lines
3.6 KiB
Rust
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()))
|
|
}
|