Skip to content

Commit 0354548

Browse files
Merge pull request #267 from ishitatsuyuki/254-segfault
Fix #254, logic error in frame/sample size
2 parents 0b6df67 + af88cd8 commit 0354548

File tree

1 file changed

+9
-14
lines changed

1 file changed

+9
-14
lines changed

src/alsa/mod.rs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ impl EventLoop {
517517
}
518518

519519
// Determine the number of samples that are available to read/write.
520-
let available = {
520+
let available_samples = {
521521
let available = alsa::snd_pcm_avail(stream_inner.channel); // TODO: what about snd_pcm_avail_update?
522522

523523
if available == -32 {
@@ -533,27 +533,27 @@ impl EventLoop {
533533
}
534534
};
535535

536-
if available < stream_inner.period_len {
536+
if available_samples < stream_inner.period_len {
537537
i_descriptor += stream_inner.num_descriptors as isize;
538538
i_stream += 1;
539539
continue;
540540
}
541541

542542
let stream_id = stream_inner.id.clone();
543543

544+
let available_frames = available_samples / stream_inner.num_channels as usize;
545+
544546
match stream_type {
545547
StreamType::Input => {
546548
// Simplify shared logic across the sample format branches.
547549
macro_rules! read_buffer {
548550
($T:ty, $Variant:ident) => {{
549551
// The buffer to read into.
550-
let mut buffer: Vec<$T> = iter::repeat(mem::uninitialized())
551-
.take(available)
552-
.collect();
552+
let mut buffer: Vec<$T> = vec![Default::default(); available_samples];
553553
let err = alsa::snd_pcm_readi(
554554
stream_inner.channel,
555555
buffer.as_mut_ptr() as *mut _,
556-
available as _,
556+
available_frames as alsa::snd_pcm_uframes_t,
557557
);
558558
check_errors(err as _).expect("snd_pcm_readi error");
559559
let input_buffer = InputBuffer {
@@ -579,28 +579,23 @@ impl EventLoop {
579579
SampleFormat::I16 => {
580580
let buffer = OutputBuffer {
581581
stream_inner: stream_inner,
582-
buffer: iter::repeat(mem::uninitialized())
583-
.take(available)
584-
.collect(),
582+
buffer: vec![Default::default(); available_samples],
585583
};
586584

587585
UnknownTypeOutputBuffer::I16(::OutputBuffer { target: Some(buffer) })
588586
},
589587
SampleFormat::U16 => {
590588
let buffer = OutputBuffer {
591589
stream_inner: stream_inner,
592-
buffer: iter::repeat(mem::uninitialized())
593-
.take(available)
594-
.collect(),
590+
buffer: vec![Default::default(); available_samples],
595591
};
596592

597593
UnknownTypeOutputBuffer::U16(::OutputBuffer { target: Some(buffer) })
598594
},
599595
SampleFormat::F32 => {
600596
let buffer = OutputBuffer {
601597
stream_inner: stream_inner,
602-
// Note that we don't use `mem::uninitialized` because of sNaN.
603-
buffer: iter::repeat(0.0).take(available).collect(),
598+
buffer: vec![Default::default(); available_samples]
604599
};
605600

606601
UnknownTypeOutputBuffer::F32(::OutputBuffer { target: Some(buffer) })

0 commit comments

Comments
 (0)