Skip to content

Commit 8df11f9

Browse files
committed
chore: move fill_with_equilibrium to src/host/mod.rs and use it
use fill_with_equilibrium() to fill equilibrium in output capture
1 parent fe87df3 commit 8df11f9

File tree

3 files changed

+62
-59
lines changed

3 files changed

+62
-59
lines changed

src/host/alsa/mod.rs

Lines changed: 4 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@ use self::alsa::poll::Descriptors;
2020
pub use self::enumerate::Devices;
2121

2222
use crate::{
23+
host::fill_with_equilibrium,
2324
iter::{SupportedInputConfigs, SupportedOutputConfigs},
2425
traits::{DeviceTrait, HostTrait, StreamTrait},
2526
BackendSpecificError, BufferSize, BuildStreamError, ChannelCount, Data,
2627
DefaultStreamConfigError, DeviceDescription, DeviceDescriptionBuilder, DeviceDirection,
2728
DeviceId, DeviceIdError, DeviceNameError, DevicesError, FrameCount, InputCallbackInfo,
28-
OutputCallbackInfo, PauseStreamError, PlayStreamError, Sample, SampleFormat, SampleRate,
29-
StreamConfig, StreamError, SupportedBufferSize, SupportedStreamConfig,
30-
SupportedStreamConfigRange, SupportedStreamConfigsError, I24, U24,
29+
OutputCallbackInfo, PauseStreamError, PlayStreamError, SampleFormat, SampleRate, StreamConfig,
30+
StreamError, SupportedBufferSize, SupportedStreamConfig, SupportedStreamConfigRange,
31+
SupportedStreamConfigsError,
3132
};
3233

3334
mod enumerate;
@@ -1239,59 +1240,6 @@ fn hw_params_buffer_size_min_max(hw_params: &alsa::pcm::HwParams) -> (FrameCount
12391240
(min_buf, max_buf)
12401241
}
12411242

1242-
// Fill a buffer with equilibrium values for any sample format.
1243-
// Works with any buffer size, even if not perfectly aligned to sample boundaries.
1244-
fn fill_with_equilibrium(buffer: &mut [u8], sample_format: SampleFormat) {
1245-
macro_rules! fill_typed {
1246-
($sample_type:ty) => {{
1247-
let sample_size = std::mem::size_of::<$sample_type>();
1248-
1249-
assert_eq!(
1250-
buffer.len() % sample_size,
1251-
0,
1252-
"Buffer size must be aligned to sample size for format {:?}",
1253-
sample_format
1254-
);
1255-
1256-
let num_samples = buffer.len() / sample_size;
1257-
let equilibrium = <$sample_type as Sample>::EQUILIBRIUM;
1258-
1259-
// Safety: We verified the buffer size is correctly aligned for the sample type
1260-
let samples = unsafe {
1261-
std::slice::from_raw_parts_mut(
1262-
buffer.as_mut_ptr() as *mut $sample_type,
1263-
num_samples,
1264-
)
1265-
};
1266-
1267-
for sample in samples {
1268-
*sample = equilibrium;
1269-
}
1270-
}};
1271-
}
1272-
const DSD_SILENCE_BYTE: u8 = 0x69;
1273-
1274-
match sample_format {
1275-
SampleFormat::I8 => fill_typed!(i8),
1276-
SampleFormat::I16 => fill_typed!(i16),
1277-
SampleFormat::I24 => fill_typed!(I24),
1278-
SampleFormat::I32 => fill_typed!(i32),
1279-
// SampleFormat::I48 => fill_typed!(I48),
1280-
SampleFormat::I64 => fill_typed!(i64),
1281-
SampleFormat::U8 => fill_typed!(u8),
1282-
SampleFormat::U16 => fill_typed!(u16),
1283-
SampleFormat::U24 => fill_typed!(U24),
1284-
SampleFormat::U32 => fill_typed!(u32),
1285-
// SampleFormat::U48 => fill_typed!(U48),
1286-
SampleFormat::U64 => fill_typed!(u64),
1287-
SampleFormat::F32 => fill_typed!(f32),
1288-
SampleFormat::F64 => fill_typed!(f64),
1289-
SampleFormat::DsdU8 | SampleFormat::DsdU16 | SampleFormat::DsdU32 => {
1290-
buffer.fill(DSD_SILENCE_BYTE)
1291-
}
1292-
}
1293-
}
1294-
12951243
fn init_hw_params<'a>(
12961244
pcm_handle: &'a alsa::pcm::PCM,
12971245
config: &StreamConfig,

src/host/mod.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use crate::{Sample, SampleFormat, I24, U24};
2+
13
#[cfg(target_os = "android")]
24
pub(crate) mod aaudio;
35
#[cfg(any(
@@ -71,3 +73,56 @@ pub(crate) mod custom;
7173
all(target_arch = "wasm32", feature = "wasm-bindgen"),
7274
)))]
7375
pub(crate) mod null;
76+
77+
// Fill a buffer with equilibrium values for any sample format.
78+
// Works with any buffer size, even if not perfectly aligned to sample boundaries.
79+
pub(crate) fn fill_with_equilibrium(buffer: &mut [u8], sample_format: SampleFormat) {
80+
macro_rules! fill_typed {
81+
($sample_type:ty) => {{
82+
let sample_size = std::mem::size_of::<$sample_type>();
83+
84+
assert_eq!(
85+
buffer.len() % sample_size,
86+
0,
87+
"Buffer size must be aligned to sample size for format {:?}",
88+
sample_format
89+
);
90+
91+
let num_samples = buffer.len() / sample_size;
92+
let equilibrium = <$sample_type as Sample>::EQUILIBRIUM;
93+
94+
// Safety: We verified the buffer size is correctly aligned for the sample type
95+
let samples = unsafe {
96+
std::slice::from_raw_parts_mut(
97+
buffer.as_mut_ptr() as *mut $sample_type,
98+
num_samples,
99+
)
100+
};
101+
102+
for sample in samples {
103+
*sample = equilibrium;
104+
}
105+
}};
106+
}
107+
const DSD_SILENCE_BYTE: u8 = 0x69;
108+
109+
match sample_format {
110+
SampleFormat::I8 => fill_typed!(i8),
111+
SampleFormat::I16 => fill_typed!(i16),
112+
SampleFormat::I24 => fill_typed!(I24),
113+
SampleFormat::I32 => fill_typed!(i32),
114+
// SampleFormat::I48 => fill_typed!(I48),
115+
SampleFormat::I64 => fill_typed!(i64),
116+
SampleFormat::U8 => fill_typed!(u8),
117+
SampleFormat::U16 => fill_typed!(u16),
118+
SampleFormat::U24 => fill_typed!(U24),
119+
SampleFormat::U32 => fill_typed!(u32),
120+
// SampleFormat::U48 => fill_typed!(U48),
121+
SampleFormat::U64 => fill_typed!(u64),
122+
SampleFormat::F32 => fill_typed!(f32),
123+
SampleFormat::F64 => fill_typed!(f64),
124+
SampleFormat::DsdU8 | SampleFormat::DsdU16 | SampleFormat::DsdU32 => {
125+
buffer.fill(DSD_SILENCE_BYTE)
126+
}
127+
}
128+
}

src/host/pipewire/stream.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use std::{thread::JoinHandle, time::Instant};
22

33
use crate::{
4-
traits::StreamTrait, BackendSpecificError, InputCallbackInfo, OutputCallbackInfo, SampleFormat,
5-
StreamConfig, StreamError, StreamInstant,
4+
host::fill_with_equilibrium, traits::StreamTrait, BackendSpecificError, InputCallbackInfo,
5+
OutputCallbackInfo, SampleFormat, StreamConfig, StreamError, StreamInstant,
66
};
77
use pipewire::{
88
self as pw,
@@ -377,7 +377,7 @@ where
377377
};
378378

379379
// set buffers to zero
380-
samples.fill(crate::Sample::EQUILIBRIUM);
380+
fill_with_equilibrium(samples, user_data.sample_format);
381381

382382
// samples = frames * channels or samples = data_len / sample_size
383383
let n_samples = frames * n_channels as usize;

0 commit comments

Comments
 (0)