Skip to content

Commit 8177f11

Browse files
committed
Merge branch 'main' into fix-nrf-list
2 parents c285df4 + efe19d2 commit 8177f11

2 files changed

Lines changed: 48 additions & 26 deletions

File tree

crates/recording/src/sources/audio_mixer.rs

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -282,33 +282,39 @@ impl AudioMixer {
282282

283283
if let Some(diff) =
284284
elapsed_since_last_frame.checked_sub(buffer_last_duration)
285-
&& diff >= Duration::from_millis(1)
286285
{
287-
let gap = diff;
286+
let min_gap = if buffer_last_duration.is_zero() {
287+
Duration::from_micros(1)
288+
} else {
289+
buffer_last_duration
290+
};
288291

289-
print!("Gap between last buffer frame, inserting {gap:?} of silence");
292+
if diff >= min_gap {
293+
let gap = diff;
290294

291-
let silence_samples_needed = (gap.as_secs_f64()) * rate as f64;
292-
let silence_samples_count = silence_samples_needed.ceil() as usize;
295+
debug!(?gap, "Gap between last buffer frame, inserting silence");
293296

294-
let mut frame = ffmpeg::frame::Audio::new(
295-
source.info.sample_format,
296-
silence_samples_count,
297-
source.info.channel_layout(),
298-
);
297+
let silence_samples_needed = (gap.as_secs_f64()) * rate as f64;
298+
let silence_samples_count = silence_samples_needed.ceil() as usize;
299299

300-
for i in 0..frame.planes() {
301-
frame.data_mut(i).fill(0);
302-
}
300+
let mut frame = ffmpeg::frame::Audio::new(
301+
source.info.sample_format,
302+
silence_samples_count,
303+
source.info.channel_layout(),
304+
);
303305

304-
frame.set_rate(source.info.rate() as u32);
306+
for i in 0..frame.planes() {
307+
frame.data_mut(i).fill(0);
308+
}
309+
310+
frame.set_rate(source.info.rate() as u32);
305311

306-
let timestamp = buffer_last_timestamp + gap;
307-
source.buffer_last = Some((
308-
timestamp,
309-
Duration::from_secs_f64(silence_samples_count as f64 / rate as f64),
310-
));
311-
source.buffer.push_back(AudioFrame::new(frame, timestamp));
312+
let silence_duration =
313+
Duration::from_secs_f64(silence_samples_count as f64 / rate as f64);
314+
let timestamp = buffer_last_timestamp + buffer_last_duration;
315+
source.buffer_last = Some((timestamp, silence_duration));
316+
source.buffer.push_back(AudioFrame::new(frame, timestamp));
317+
}
312318
}
313319
}
314320
}
@@ -681,3 +687,4 @@ mod test {
681687
}
682688
}
683689
}
690+

crates/scap-ffmpeg/src/cpal.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ impl DataExt for ::cpal::Data {
1010
let format_typ = sample::Type::Packed;
1111

1212
let sample_size = self.sample_format().sample_size();
13-
let sample_count = self.bytes().len() / (sample_size * config.channels as usize);
13+
let bytes = self.bytes();
14+
let sample_count = bytes.len() / (sample_size * config.channels as usize);
1415

1516
let mut ffmpeg_frame = ffmpeg::frame::Audio::new(
1617
match self.sample_format() {
@@ -29,13 +30,27 @@ impl DataExt for ::cpal::Data {
2930
for i in 0..config.channels {
3031
let plane_size = sample_count * sample_size;
3132
let base = (i as usize) * plane_size;
32-
33-
ffmpeg_frame
34-
.data_mut(i as usize)
35-
.copy_from_slice(&self.bytes()[base..base + plane_size]);
33+
let end = (base + plane_size).min(bytes.len());
34+
if end <= base {
35+
continue;
36+
}
37+
let src = &bytes[base..end];
38+
let dst = ffmpeg_frame.data_mut(i as usize);
39+
debug_assert!(
40+
dst.len() >= src.len(),
41+
"FFmpeg plane smaller than CPAL buffer"
42+
);
43+
let copy_len = dst.len().min(src.len());
44+
dst[..copy_len].copy_from_slice(&src[..copy_len]);
3645
}
3746
} else {
38-
ffmpeg_frame.data_mut(0).copy_from_slice(self.bytes());
47+
let dst = ffmpeg_frame.data_mut(0);
48+
debug_assert!(
49+
dst.len() >= bytes.len(),
50+
"FFmpeg buffer smaller than CPAL buffer"
51+
);
52+
let copy_len = dst.len().min(bytes.len());
53+
dst[..copy_len].copy_from_slice(&bytes[..copy_len]);
3954
}
4055

4156
ffmpeg_frame.set_rate(config.sample_rate.0);

0 commit comments

Comments
 (0)