use std::path::PathBuf; use tauri::Manager; use kon_core::types::AudioSamples; /// Save PCM f32 samples as a WAV file. Returns the file path. #[tauri::command] pub async fn save_audio( app: tauri::AppHandle, samples: Vec, output_folder: Option, ) -> Result { let recordings_dir = if let Some(ref folder) = output_folder { if !folder.is_empty() { PathBuf::from(folder) } else { app.path() .app_local_data_dir() .map_err(|e: tauri::Error| e.to_string())? .join("recordings") } } else { app.path() .app_local_data_dir() .map_err(|e: tauri::Error| e.to_string())? .join("recordings") }; std::fs::create_dir_all(&recordings_dir) .map_err(|e| format!("Failed to create recordings dir: {e}"))?; let timestamp = std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) .unwrap_or_default() .as_secs(); let filename = format!("kon-{timestamp}.wav"); let path = recordings_dir.join(&filename); let path_clone = path.clone(); tokio::task::spawn_blocking(move || { let audio = AudioSamples::mono_16khz(samples); kon_audio::write_wav(&path_clone, &audio).map_err(|e| e.to_string()) }) .await .map_err(|e| e.to_string())??; Ok(path.to_string_lossy().to_string()) }