rich_sdl2_rust/audio/
format.rs

1//! Type definitions for a format of audio data.
2
3use bitflags::bitflags;
4
5use crate::bind;
6
7bitflags! {
8    /// A flag to represent what type is used in audio data.
9    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10    pub struct AudioFormatFlag: u8 {
11        /// Whether a type is floating-point number.
12        const FLOAT = 1 << 0;
13        /// Whether a type is big endian.
14        const BIG_ENDIAN = 1 << 4;
15        /// Whether a type is signed.
16        const SIGNED = 1 << 7;
17    }
18}
19
20/// A format to represent how is stored samples in audio data.
21#[must_use]
22#[derive(Debug, Clone, Copy, PartialEq, Eq)]
23pub struct AudioFormat {
24    /// A flag to represent characteristics of a type.
25    pub flag: AudioFormatFlag,
26    /// A size in bits of a type.
27    pub bit_size: u8,
28}
29
30impl AudioFormat {
31    /// A format for signed 8-bit data.
32    pub const fn signed8() -> Self {
33        Self {
34            flag: AudioFormatFlag::SIGNED,
35            bit_size: 8,
36        }
37    }
38
39    /// A format for unsigned 8-bit data.
40    pub const fn unsigned8() -> Self {
41        Self {
42            flag: AudioFormatFlag::empty(),
43            bit_size: 8,
44        }
45    }
46
47    /// A format for signed little endian 16-bit data.
48    pub const fn signed16_lsb() -> Self {
49        Self {
50            flag: AudioFormatFlag::SIGNED,
51            bit_size: 16,
52        }
53    }
54
55    /// A format for unsigned little endian 16-bit data.
56    pub const fn unsigned16_lsb() -> Self {
57        Self {
58            flag: AudioFormatFlag::empty(),
59            bit_size: 16,
60        }
61    }
62
63    /// A format for signed big endian 16-bit data.
64    pub const fn signed16_msb() -> Self {
65        Self {
66            flag: AudioFormatFlag::from_bits_truncate(1 << 4 | 1 << 7),
67            bit_size: 16,
68        }
69    }
70
71    /// A format for unsigned big endian 16-bit data.
72    pub const fn unsigned16_msb() -> Self {
73        Self {
74            flag: AudioFormatFlag::BIG_ENDIAN,
75            bit_size: 16,
76        }
77    }
78
79    /// A format for signed little endian 32-bit data.
80    pub const fn signed32_lsb() -> Self {
81        Self {
82            flag: AudioFormatFlag::SIGNED,
83            bit_size: 32,
84        }
85    }
86
87    /// A format for signed big endian 32-bit data.
88    pub const fn signed32_msb() -> Self {
89        Self {
90            flag: AudioFormatFlag::from_bits_truncate(1 << 4 | 1 << 7),
91            bit_size: 32,
92        }
93    }
94
95    /// A format for floating-point little endian 32-bit data.
96    pub const fn float32_lsb() -> Self {
97        Self {
98            flag: AudioFormatFlag::from_bits_truncate(1 << 0 | 1 << 7),
99            bit_size: 32,
100        }
101    }
102
103    /// A format for floating-point big endian 32-bit data.
104    pub const fn float32_msb() -> Self {
105        Self {
106            flag: AudioFormatFlag::from_bits_truncate(1 << 0 | 1 << 4 | 1 << 7),
107            bit_size: 32,
108        }
109    }
110
111    pub(super) fn as_raw(self) -> u16 {
112        (self.flag.bits() as u16) << 8 | self.bit_size as u16
113    }
114}
115
116impl From<u16> for AudioFormat {
117    fn from(raw: u16) -> Self {
118        Self {
119            flag: AudioFormatFlag::from_bits((raw >> 8) as u8).unwrap(),
120            bit_size: (raw & 0xff) as u8,
121        }
122    }
123}