cpal/
samples_formats.rs
1use std::{fmt::Display, mem};
2#[cfg(target_os = "emscripten")]
3use wasm_bindgen::prelude::*;
4
5pub use dasp_sample::{FromSample, Sample, I24, I48, U24, U48};
6
7#[cfg_attr(target_os = "emscripten", wasm_bindgen)]
9#[derive(Clone, Copy, Debug, PartialEq, Eq)]
10#[non_exhaustive]
11pub enum SampleFormat {
12 I8,
14
15 I16,
17
18 I32,
22
23 I64,
27
28 U8,
30
31 U16,
33
34 U32,
38
39 U64,
43
44 F32,
46
47 F64,
49}
50
51impl SampleFormat {
52 #[inline]
54 #[must_use]
55 pub fn sample_size(&self) -> usize {
56 match *self {
57 SampleFormat::I8 | SampleFormat::U8 => mem::size_of::<i8>(),
58 SampleFormat::I16 | SampleFormat::U16 => mem::size_of::<i16>(),
59 SampleFormat::I32 | SampleFormat::U32 => mem::size_of::<i32>(),
61 SampleFormat::I64 | SampleFormat::U64 => mem::size_of::<i64>(),
63 SampleFormat::F32 => mem::size_of::<f32>(),
64 SampleFormat::F64 => mem::size_of::<f64>(),
65 }
66 }
67
68 #[inline]
69 #[must_use]
70 pub fn is_int(&self) -> bool {
71 matches!(
73 *self,
74 SampleFormat::I8 | SampleFormat::I16 | SampleFormat::I32 | SampleFormat::I64
75 )
76 }
77
78 #[inline]
79 #[must_use]
80 pub fn is_uint(&self) -> bool {
81 matches!(
83 *self,
84 SampleFormat::U8 | SampleFormat::U16 | SampleFormat::U32 | SampleFormat::U64
85 )
86 }
87
88 #[inline]
89 #[must_use]
90 pub fn is_float(&self) -> bool {
91 matches!(*self, SampleFormat::F32 | SampleFormat::F64)
92 }
93}
94
95impl Display for SampleFormat {
96 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
97 match *self {
98 SampleFormat::I8 => "i8",
99 SampleFormat::I16 => "i16",
100 SampleFormat::I32 => "i32",
102 SampleFormat::I64 => "i64",
104 SampleFormat::U8 => "u8",
105 SampleFormat::U16 => "u16",
106 SampleFormat::U32 => "u32",
108 SampleFormat::U64 => "u64",
110 SampleFormat::F32 => "f32",
111 SampleFormat::F64 => "f64",
112 }
113 .fmt(f)
114 }
115}
116
117pub trait SizedSample: Sample {
118 const FORMAT: SampleFormat;
119}
120
121impl SizedSample for i8 {
122 const FORMAT: SampleFormat = SampleFormat::I8;
123}
124
125impl SizedSample for i16 {
126 const FORMAT: SampleFormat = SampleFormat::I16;
127}
128
129impl SizedSample for i32 {
132 const FORMAT: SampleFormat = SampleFormat::I32;
133}
134
135impl SizedSample for i64 {
138 const FORMAT: SampleFormat = SampleFormat::I64;
139}
140
141impl SizedSample for u8 {
142 const FORMAT: SampleFormat = SampleFormat::U8;
143}
144
145impl SizedSample for u16 {
146 const FORMAT: SampleFormat = SampleFormat::U16;
147}
148
149impl SizedSample for u32 {
152 const FORMAT: SampleFormat = SampleFormat::U32;
153}
154
155impl SizedSample for u64 {
158 const FORMAT: SampleFormat = SampleFormat::U64;
159}
160
161impl SizedSample for f32 {
162 const FORMAT: SampleFormat = SampleFormat::F32;
163}
164
165impl SizedSample for f64 {
166 const FORMAT: SampleFormat = SampleFormat::F64;
167}