Skip to main content

concinnity_asset/
audio_bus.rs

1// Audio mix-bus schema shared by the audio asset types.
2
3/// A mix bus grouping related sounds under one user volume.
4///
5/// Every sound routes through one of three buses under the master output:
6/// `music` for looping tracks, `sfx` for effects and positional emitters, and
7/// `voice` for dialogue. Each bus has its own volume in the settings menu.
8#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
9#[serde(rename_all = "lowercase")]
10pub enum AudioBus {
11    /// Looping music tracks.
12    Music,
13    /// Sound effects and positional emitters.
14    Sfx,
15    /// Dialogue and narration.
16    Voice,
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22
23    #[test]
24    fn bus_names_parse_lowercase() {
25        for (name, bus) in [
26            ("\"music\"", AudioBus::Music),
27            ("\"sfx\"", AudioBus::Sfx),
28            ("\"voice\"", AudioBus::Voice),
29        ] {
30            let parsed: AudioBus = serde_json::from_str(name).unwrap();
31            assert_eq!(parsed, bus);
32            assert_eq!(serde_json::to_string(&bus).unwrap(), name);
33        }
34    }
35
36    #[test]
37    fn bus_round_trips_through_postcard() {
38        for bus in [AudioBus::Music, AudioBus::Sfx, AudioBus::Voice] {
39            let bytes = postcard::to_allocvec(&bus).unwrap();
40            let back: AudioBus = postcard::from_bytes(&bytes).unwrap();
41            assert_eq!(back, bus);
42        }
43    }
44}