rich_sdl2_rust/audio/
format.rs1use bitflags::bitflags;
4
5use crate::bind;
6
7bitflags! {
8 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10 pub struct AudioFormatFlag: u8 {
11 const FLOAT = 1 << 0;
13 const BIG_ENDIAN = 1 << 4;
15 const SIGNED = 1 << 7;
17 }
18}
19
20#[must_use]
22#[derive(Debug, Clone, Copy, PartialEq, Eq)]
23pub struct AudioFormat {
24 pub flag: AudioFormatFlag,
26 pub bit_size: u8,
28}
29
30impl AudioFormat {
31 pub const fn signed8() -> Self {
33 Self {
34 flag: AudioFormatFlag::SIGNED,
35 bit_size: 8,
36 }
37 }
38
39 pub const fn unsigned8() -> Self {
41 Self {
42 flag: AudioFormatFlag::empty(),
43 bit_size: 8,
44 }
45 }
46
47 pub const fn signed16_lsb() -> Self {
49 Self {
50 flag: AudioFormatFlag::SIGNED,
51 bit_size: 16,
52 }
53 }
54
55 pub const fn unsigned16_lsb() -> Self {
57 Self {
58 flag: AudioFormatFlag::empty(),
59 bit_size: 16,
60 }
61 }
62
63 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 pub const fn unsigned16_msb() -> Self {
73 Self {
74 flag: AudioFormatFlag::BIG_ENDIAN,
75 bit_size: 16,
76 }
77 }
78
79 pub const fn signed32_lsb() -> Self {
81 Self {
82 flag: AudioFormatFlag::SIGNED,
83 bit_size: 32,
84 }
85 }
86
87 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 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 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}