devalang_wasm/engine/audio/
settings.rs

1use std::fmt;
2
3#[cfg(feature = "cli")]
4use clap::ValueEnum;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7#[cfg_attr(feature = "cli", derive(ValueEnum))]
8#[cfg_attr(feature = "cli", clap(rename_all = "lower"))]
9pub enum AudioFormat {
10    Mp3,
11    Wav,
12    Flac,
13    Mid, // MIDI format
14}
15
16impl Default for AudioFormat {
17    fn default() -> Self {
18        AudioFormat::Mp3
19    }
20}
21
22impl AudioFormat {
23    pub fn label(self) -> &'static str {
24        match self {
25            AudioFormat::Mp3 => "mp3",
26            AudioFormat::Wav => "wav",
27            AudioFormat::Flac => "flac",
28            AudioFormat::Mid => "mid",
29        }
30    }
31
32    pub fn file_extension(self) -> &'static str {
33        self.label()
34    }
35
36    /// Parse format from string
37    pub fn from_str(s: &str) -> Option<Self> {
38        match s.to_lowercase().as_str() {
39            "mp3" => Some(AudioFormat::Mp3),
40            "wav" => Some(AudioFormat::Wav),
41            "flac" => Some(AudioFormat::Flac),
42            "mid" | "midi" => Some(AudioFormat::Mid),
43            _ => None,
44        }
45    }
46}
47
48#[derive(Debug, Clone, Copy, PartialEq, Eq)]
49#[cfg_attr(feature = "cli", derive(ValueEnum))]
50#[cfg_attr(feature = "cli", clap(rename_all = "lower"))]
51pub enum AudioBitDepth {
52    #[cfg_attr(feature = "cli", clap(alias = "8"))]
53    Bit8,
54    #[cfg_attr(feature = "cli", clap(alias = "16"))]
55    Bit16,
56    #[cfg_attr(feature = "cli", clap(alias = "24"))]
57    Bit24,
58    #[cfg_attr(feature = "cli", clap(alias = "32"))]
59    Bit32,
60}
61
62impl Default for AudioBitDepth {
63    fn default() -> Self {
64        AudioBitDepth::Bit16
65    }
66}
67
68impl AudioBitDepth {
69    pub fn bits(self) -> u16 {
70        match self {
71            AudioBitDepth::Bit8 => 8,
72            AudioBitDepth::Bit16 => 16,
73            AudioBitDepth::Bit24 => 24,
74            AudioBitDepth::Bit32 => 32,
75        }
76    }
77}
78
79#[derive(Debug, Clone, Copy, PartialEq, Eq)]
80#[cfg_attr(feature = "cli", derive(ValueEnum))]
81#[cfg_attr(feature = "cli", clap(rename_all = "lower"))]
82pub enum AudioChannels {
83    #[cfg_attr(feature = "cli", clap(alias = "1"))]
84    Mono,
85    #[cfg_attr(feature = "cli", clap(alias = "2"))]
86    Stereo,
87}
88
89impl Default for AudioChannels {
90    fn default() -> Self {
91        AudioChannels::Stereo
92    }
93}
94
95impl AudioChannels {
96    pub fn count(self) -> u16 {
97        match self {
98            AudioChannels::Mono => 1,
99            AudioChannels::Stereo => 2,
100        }
101    }
102}
103
104#[derive(Debug, Clone, Copy, PartialEq, Eq)]
105#[cfg_attr(feature = "cli", derive(ValueEnum))]
106#[cfg_attr(feature = "cli", clap(rename_all = "kebab-case"))]
107pub enum ResampleQuality {
108    #[cfg_attr(feature = "cli", clap(alias = "linear"))]
109    Linear2,
110    #[cfg_attr(feature = "cli", clap(alias = "sinc-12"))]
111    Sinc12,
112    Sinc24,
113    Sinc48,
114    Sinc96,
115    Sinc192,
116    Sinc512,
117}
118
119impl Default for ResampleQuality {
120    fn default() -> Self {
121        ResampleQuality::Sinc24
122    }
123}
124
125impl ResampleQuality {
126    pub fn label(self) -> &'static str {
127        match self {
128            ResampleQuality::Linear2 => "2-point linear",
129            ResampleQuality::Sinc12 => "12-point sinc",
130            ResampleQuality::Sinc24 => "24-point sinc",
131            ResampleQuality::Sinc48 => "48-point sinc",
132            ResampleQuality::Sinc96 => "96-point sinc",
133            ResampleQuality::Sinc192 => "192-point sinc",
134            ResampleQuality::Sinc512 => "512-point sinc",
135        }
136    }
137}
138
139impl fmt::Display for ResampleQuality {
140    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
141        f.write_str(self.label())
142    }
143}