Skip to content

Commit fc1549f

Browse files
committed
Intial support for 24 bits sample format
1 parent 634b0f3 commit fc1549f

File tree

2 files changed

+27
-15
lines changed

2 files changed

+27
-15
lines changed

src/host/alsa/mod.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -324,16 +324,17 @@ impl Device {
324324
let hw_params = alsa::pcm::HwParams::any(handle)?;
325325

326326
// TODO: check endianness
327-
const FORMATS: [(SampleFormat, alsa::pcm::Format); 8] = [
327+
const FORMATS: [(SampleFormat, alsa::pcm::Format); 12] = [
328328
(SampleFormat::I8, alsa::pcm::Format::S8),
329329
(SampleFormat::U8, alsa::pcm::Format::U8),
330330
(SampleFormat::I16, alsa::pcm::Format::S16LE),
331331
//SND_PCM_FORMAT_S16_BE,
332332
(SampleFormat::U16, alsa::pcm::Format::U16LE),
333333
//SND_PCM_FORMAT_U16_BE,
334334
//SND_PCM_FORMAT_S24_LE,
335+
(SampleFormat::I24, alsa::pcm::Format::S24LE),
335336
//SND_PCM_FORMAT_S24_BE,
336-
//SND_PCM_FORMAT_U24_LE,
337+
(SampleFormat::U24, alsa::pcm::Format::U24LE),
337338
//SND_PCM_FORMAT_U24_BE,
338339
(SampleFormat::I32, alsa::pcm::Format::S32LE),
339340
//SND_PCM_FORMAT_S32_BE,
@@ -351,9 +352,9 @@ impl Device {
351352
//SND_PCM_FORMAT_MPEG,
352353
//SND_PCM_FORMAT_GSM,
353354
//SND_PCM_FORMAT_SPECIAL,
354-
//SND_PCM_FORMAT_S24_3LE,
355+
(SampleFormat::I24_3, alsa::pcm::Format::S243LE),
355356
//SND_PCM_FORMAT_S24_3BE,
356-
//SND_PCM_FORMAT_U24_3LE,
357+
(SampleFormat::U24_3, alsa::pcm::Format::U243LE),
357358
//SND_PCM_FORMAT_U24_3BE,
358359
//SND_PCM_FORMAT_S20_3LE,
359360
//SND_PCM_FORMAT_S20_3BE,
@@ -1010,13 +1011,15 @@ fn set_hw_params_from_format(
10101011
match sample_format {
10111012
SampleFormat::I8 => alsa::pcm::Format::S8,
10121013
SampleFormat::I16 => alsa::pcm::Format::S16BE,
1013-
// SampleFormat::I24 => alsa::pcm::Format::S24BE,
1014+
SampleFormat::I24 => alsa::pcm::Format::S24BE,
1015+
SampleFormat::I24_3 => alsa::pcm::Format::S243BE,
10141016
SampleFormat::I32 => alsa::pcm::Format::S32BE,
10151017
// SampleFormat::I48 => alsa::pcm::Format::S48BE,
10161018
// SampleFormat::I64 => alsa::pcm::Format::S64BE,
10171019
SampleFormat::U8 => alsa::pcm::Format::U8,
10181020
SampleFormat::U16 => alsa::pcm::Format::U16BE,
1019-
// SampleFormat::U24 => alsa::pcm::Format::U24BE,
1021+
SampleFormat::U24 => alsa::pcm::Format::U24BE,
1022+
SampleFormat::U24_3 => alsa::pcm::Format::U243BE,
10201023
SampleFormat::U32 => alsa::pcm::Format::U32BE,
10211024
// SampleFormat::U48 => alsa::pcm::Format::U48BE,
10221025
// SampleFormat::U64 => alsa::pcm::Format::U64BE,
@@ -1035,13 +1038,15 @@ fn set_hw_params_from_format(
10351038
match sample_format {
10361039
SampleFormat::I8 => alsa::pcm::Format::S8,
10371040
SampleFormat::I16 => alsa::pcm::Format::S16LE,
1038-
// SampleFormat::I24 => alsa::pcm::Format::S24LE,
1041+
SampleFormat::I24 => alsa::pcm::Format::S24LE,
1042+
SampleFormat::I24_3 => alsa::pcm::Format::S243LE,
10391043
SampleFormat::I32 => alsa::pcm::Format::S32LE,
10401044
// SampleFormat::I48 => alsa::pcm::Format::S48LE,
10411045
// SampleFormat::I64 => alsa::pcm::Format::S64LE,
10421046
SampleFormat::U8 => alsa::pcm::Format::U8,
10431047
SampleFormat::U16 => alsa::pcm::Format::U16LE,
1044-
// SampleFormat::U24 => alsa::pcm::Format::U24LE,
1048+
SampleFormat::U24 => alsa::pcm::Format::U24LE,
1049+
SampleFormat::U24_3 => alsa::pcm::Format::U243LE,
10451050
SampleFormat::U32 => alsa::pcm::Format::U32LE,
10461051
// SampleFormat::U48 => alsa::pcm::Format::U48LE,
10471052
// SampleFormat::U64 => alsa::pcm::Format::U64LE,

src/samples_formats.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ pub enum SampleFormat {
3030
I16,
3131

3232
// /// `I24` with a valid range of '-(1 << 23)..(1 << 23)' with `0` being the origin
33-
// I24,
33+
I24,
34+
I24_3,
35+
3436
/// `i32` with a valid range of `i32::MIN..=i32::MAX` with `0` being the origin.
3537
I32,
3638

@@ -46,7 +48,9 @@ pub enum SampleFormat {
4648
U16,
4749

4850
// /// `U24` with a valid range of '0..16777216' with `1 << 23 == 8388608` being the origin
49-
// U24,
51+
U24,
52+
U24_3,
53+
5054
/// `u32` with a valid range of `u32::MIN..=u32::MAX` with `1 << 31` being the origin.
5155
U32,
5256

@@ -70,7 +74,8 @@ impl SampleFormat {
7074
match *self {
7175
SampleFormat::I8 | SampleFormat::U8 => mem::size_of::<i8>(),
7276
SampleFormat::I16 | SampleFormat::U16 => mem::size_of::<i16>(),
73-
// SampleFormat::I24 | SampleFormat::U24 => 3,
77+
SampleFormat::I24_3 | SampleFormat::U24_3 => 3,
78+
SampleFormat::I24 | SampleFormat::U24 => 4,
7479
SampleFormat::I32 | SampleFormat::U32 => mem::size_of::<i32>(),
7580
// SampleFormat::I48 | SampleFormat::U48 => 6,
7681
SampleFormat::I64 | SampleFormat::U64 => mem::size_of::<i64>(),
@@ -85,7 +90,7 @@ impl SampleFormat {
8590
//matches!(*self, SampleFormat::I8 | SampleFormat::I16 | SampleFormat::I24 | SampleFormat::I32 | SampleFormat::I48 | SampleFormat::I64)
8691
matches!(
8792
*self,
88-
SampleFormat::I8 | SampleFormat::I16 | SampleFormat::I32 | SampleFormat::I64
93+
SampleFormat::I8 | SampleFormat::I16 | SampleFormat::I24 | SampleFormat::I24_3 | SampleFormat::I32 | SampleFormat::I64
8994
)
9095
}
9196

@@ -95,7 +100,7 @@ impl SampleFormat {
95100
//matches!(*self, SampleFormat::U8 | SampleFormat::U16 | SampleFormat::U24 | SampleFormat::U32 | SampleFormat::U48 | SampleFormat::U64)
96101
matches!(
97102
*self,
98-
SampleFormat::U8 | SampleFormat::U16 | SampleFormat::U32 | SampleFormat::U64
103+
SampleFormat::U8 | SampleFormat::U16 | SampleFormat::U24 | SampleFormat::U24_3 | SampleFormat::U32 | SampleFormat::U64
99104
)
100105
}
101106

@@ -111,13 +116,15 @@ impl Display for SampleFormat {
111116
match *self {
112117
SampleFormat::I8 => "i8",
113118
SampleFormat::I16 => "i16",
114-
// SampleFormat::I24 => "i24",
119+
SampleFormat::I24 => "i24",
120+
SampleFormat::I24_3 => "i24_3",
115121
SampleFormat::I32 => "i32",
116122
// SampleFormat::I48 => "i48",
117123
SampleFormat::I64 => "i64",
118124
SampleFormat::U8 => "u8",
119125
SampleFormat::U16 => "u16",
120-
// SampleFormat::U24 => "u24",
126+
SampleFormat::U24 => "u24",
127+
SampleFormat::U24_3 => "u24_3",
121128
SampleFormat::U32 => "u32",
122129
// SampleFormat::U48 => "u48",
123130
SampleFormat::U64 => "u64",

0 commit comments

Comments
 (0)