tauri_plugin_audio_recorder/
models.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default)]
5#[serde(rename_all = "lowercase")]
6pub enum AudioFormat {
7 #[default]
8 Wav,
9 }
11
12#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default)]
14#[serde(rename_all = "lowercase")]
15pub enum AudioQuality {
16 Low,
18 #[default]
19 Medium,
21 High,
23}
24
25impl AudioQuality {
26 pub fn sample_rate(&self) -> u32 {
27 match self {
28 AudioQuality::Low => 16000,
29 AudioQuality::Medium => 44100,
30 AudioQuality::High => 48000,
31 }
32 }
33
34 pub fn channels(&self) -> u16 {
35 match self {
36 AudioQuality::Low | AudioQuality::Medium => 1,
37 AudioQuality::High => 2,
38 }
39 }
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize)]
44#[serde(rename_all = "camelCase")]
45pub struct RecordingConfig {
46 pub output_path: String,
48 #[serde(default)]
50 pub format: AudioFormat,
51 #[serde(default)]
53 pub quality: AudioQuality,
54 #[serde(default)]
56 pub max_duration: u32,
57}
58
59#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
61#[serde(rename_all = "lowercase")]
62pub enum RecordingState {
63 Idle,
64 Recording,
65 Paused,
66}
67
68impl Default for RecordingState {
69 fn default() -> Self {
70 Self::Idle
71 }
72}
73
74#[derive(Debug, Clone, Serialize, Deserialize)]
76#[serde(rename_all = "camelCase")]
77pub struct RecordingStatus {
78 pub state: RecordingState,
80 pub duration_ms: u64,
82 pub output_path: Option<String>,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize)]
88#[serde(rename_all = "camelCase")]
89pub struct RecordingResult {
90 pub file_path: String,
92 pub duration_ms: u64,
94 pub file_size: u64,
96 pub sample_rate: u32,
98 pub channels: u16,
100}
101
102#[derive(Debug, Clone, Serialize, Deserialize)]
104#[serde(rename_all = "camelCase")]
105pub struct AudioDevice {
106 pub id: String,
108 pub name: String,
110 pub is_default: bool,
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize)]
116#[serde(rename_all = "camelCase")]
117pub struct AudioDevicesResponse {
118 pub devices: Vec<AudioDevice>,
119}
120
121#[derive(Debug, Clone, Serialize, Deserialize)]
123#[serde(rename_all = "camelCase")]
124pub struct PermissionStatus {
125 pub granted: bool,
127 pub can_request: bool,
129}
130
131#[cfg(test)]
132mod tests {
133 use super::*;
134
135 #[test]
136 fn test_audio_quality_sample_rate() {
137 assert_eq!(AudioQuality::Low.sample_rate(), 16000);
138 assert_eq!(AudioQuality::Medium.sample_rate(), 44100);
139 assert_eq!(AudioQuality::High.sample_rate(), 48000);
140 }
141
142 #[test]
143 fn test_audio_quality_channels() {
144 assert_eq!(AudioQuality::Low.channels(), 1);
145 assert_eq!(AudioQuality::Medium.channels(), 1);
146 assert_eq!(AudioQuality::High.channels(), 2);
147 }
148
149 #[test]
150 fn test_recording_state_serialization() {
151 assert_eq!(
152 serde_json::to_string(&RecordingState::Idle).unwrap(),
153 "\"idle\""
154 );
155 assert_eq!(
156 serde_json::to_string(&RecordingState::Recording).unwrap(),
157 "\"recording\""
158 );
159 assert_eq!(
160 serde_json::to_string(&RecordingState::Paused).unwrap(),
161 "\"paused\""
162 );
163 }
164
165 #[test]
166 fn test_recording_config_deserialization() {
167 let json = r#"{
168 "outputPath": "/path/to/recording",
169 "quality": "high"
170 }"#;
171
172 let config: RecordingConfig = serde_json::from_str(json).unwrap();
173 assert_eq!(config.output_path, "/path/to/recording");
174 assert!(matches!(config.quality, AudioQuality::High));
175 assert!(matches!(config.format, AudioFormat::Wav));
176 assert_eq!(config.max_duration, 0);
177 }
178
179 #[test]
180 fn test_recording_config_defaults() {
181 let json = r#"{"outputPath": "/test"}"#;
182 let config: RecordingConfig = serde_json::from_str(json).unwrap();
183
184 assert!(matches!(config.format, AudioFormat::Wav));
185 assert!(matches!(config.quality, AudioQuality::Medium));
186 assert_eq!(config.max_duration, 0);
187 }
188}