p_chan/
signed.rs

1//! Signed channel newtypes
2
3use crate::ops::Conversion;
4
5macro_rules! midpoint {
6    () => {
7        /// Calculates the middle point of `self` and `rhs`.
8        ///
9        /// `midpoint(a, b)` is `(a + b) / 2` calculated without overflow,
10        /// rounded down.
11        pub const fn midpoint(self, rhs: Self) -> Self {
12            use crate::math::{Signed, Unsigned};
13
14            let this = Unsigned(self.0).reinterpret_with_offset();
15            let rhs = Unsigned(rhs.0).reinterpret_with_offset();
16
17            Self(Signed(this.midpoint(rhs)).reinterpret_with_offset())
18        }
19    };
20}
21
22ch_int!(
23    (Ch8, i8, i16, core::convert::identity, midpoint! {}),
24    doc = "8-bit signed integer (-128 to 127) channel value",
25);
26
27ch_int!(
28    (Ch12, i16, i32, normalize_ch12, midpoint! {}),
29    doc = "12-bit signed integer (-2\\_048 to 2\\_047) channel value",
30);
31
32ch_int!(
33    (Ch16, i16, i32, core::convert::identity, midpoint! {}),
34    doc = "16-bit signed integer (-32\\_768 to 32\\_767) channel value",
35);
36
37ch_int!(
38    (Ch24, i32, i64, normalize_ch24, midpoint! {}),
39    doc =
40        "24-bit signed integer (-8\\_388\\_608 to 8\\_388\\_607) channel value",
41);
42
43ch_float!(
44    (Ch32, f32, crate::math::normalize_f32, -1.0, 0.0),
45    doc = "32-bit float (-1 to 1) channel value",
46);
47
48ch_float!(
49    (Ch64, f64, crate::math::normalize_f64, -1.0, 0.0),
50    doc = "64-bit float (-1 to 1) channel value",
51);
52
53const fn normalize_ch12(mut chan: i16) -> i16 {
54    if chan > 2_i16.pow(11) - 1 {
55        chan = 2_i16.pow(11) - 1;
56    }
57
58    if chan < -2_i16.pow(11) {
59        chan = -2_i16.pow(11);
60    }
61
62    chan
63}
64
65const fn normalize_ch24(mut chan: i32) -> i32 {
66    if chan > 2_i32.pow(23) - 1 {
67        chan = 2_i32.pow(23) - 1;
68    }
69
70    if chan < -2_i32.pow(23) {
71        chan = -2_i32.pow(23);
72    }
73
74    chan
75}
76
77conversion!(Ch8, Ch12);
78conversion!(Ch8, Ch16);
79conversion!(Ch8, Ch24);
80conversion!(Ch8, Ch32);
81conversion!(Ch8, Ch64);
82
83conversion!(Ch12, Ch8);
84conversion!(Ch12, Ch16);
85conversion!(Ch12, Ch24);
86conversion!(Ch12, Ch32);
87conversion!(Ch12, Ch64);
88
89conversion!(Ch16, Ch8);
90conversion!(Ch16, Ch12);
91conversion!(Ch16, Ch24);
92conversion!(Ch16, Ch32);
93conversion!(Ch16, Ch64);
94
95conversion!(Ch24, Ch8);
96conversion!(Ch24, Ch12);
97conversion!(Ch24, Ch16);
98conversion!(Ch24, Ch32);
99conversion!(Ch24, Ch64);
100
101conversion!(Ch32, Ch8);
102conversion!(Ch32, Ch12);
103conversion!(Ch32, Ch16);
104conversion!(Ch32, Ch24);
105conversion!(Ch32, Ch64);
106
107conversion!(Ch64, Ch8);
108conversion!(Ch64, Ch12);
109conversion!(Ch64, Ch16);
110conversion!(Ch64, Ch24);
111conversion!(Ch64, Ch32);
112
113#[cfg(feature = "unsigned")]
114mod unsigned {
115    use super::*;
116    use crate::unsigned;
117
118    conversion!(unsigned::Ch8, Ch12);
119    conversion!(unsigned::Ch8, Ch16);
120    conversion!(unsigned::Ch8, Ch24);
121    conversion!(unsigned::Ch8, Ch32);
122    conversion!(unsigned::Ch8, Ch64);
123
124    conversion!(unsigned::Ch12, Ch8);
125    conversion!(unsigned::Ch12, Ch16);
126    conversion!(unsigned::Ch12, Ch24);
127    conversion!(unsigned::Ch12, Ch32);
128    conversion!(unsigned::Ch12, Ch64);
129
130    conversion!(unsigned::Ch16, Ch8);
131    conversion!(unsigned::Ch16, Ch12);
132    conversion!(unsigned::Ch16, Ch24);
133    conversion!(unsigned::Ch16, Ch32);
134    conversion!(unsigned::Ch16, Ch64);
135
136    conversion!(unsigned::Ch24, Ch8);
137    conversion!(unsigned::Ch24, Ch12);
138    conversion!(unsigned::Ch24, Ch16);
139    conversion!(unsigned::Ch24, Ch32);
140    conversion!(unsigned::Ch24, Ch64);
141
142    conversion!(unsigned::Ch32, Ch8);
143    conversion!(unsigned::Ch32, Ch12);
144    conversion!(unsigned::Ch32, Ch16);
145    conversion!(unsigned::Ch32, Ch24);
146    conversion!(unsigned::Ch32, Ch64);
147
148    conversion!(unsigned::Ch64, Ch8);
149    conversion!(unsigned::Ch64, Ch12);
150    conversion!(unsigned::Ch64, Ch16);
151    conversion!(unsigned::Ch64, Ch24);
152    conversion!(unsigned::Ch64, Ch32);
153
154    conversion!(unsigned::Ch8, Ch8);
155    conversion!(unsigned::Ch12, Ch12);
156    conversion!(unsigned::Ch16, Ch16);
157    conversion!(unsigned::Ch24, Ch24);
158    conversion!(unsigned::Ch32, Ch32);
159    conversion!(unsigned::Ch64, Ch64);
160}