@@ -517,7 +517,7 @@ impl EventLoop {
517
517
}
518
518
519
519
// Determine the number of samples that are available to read/write.
520
- let available = {
520
+ let available_samples = {
521
521
let available = alsa:: snd_pcm_avail ( stream_inner. channel ) ; // TODO: what about snd_pcm_avail_update?
522
522
523
523
if available == -32 {
@@ -533,27 +533,27 @@ impl EventLoop {
533
533
}
534
534
} ;
535
535
536
- if available < stream_inner. period_len {
536
+ if available_samples < stream_inner. period_len {
537
537
i_descriptor += stream_inner. num_descriptors as isize ;
538
538
i_stream += 1 ;
539
539
continue ;
540
540
}
541
541
542
542
let stream_id = stream_inner. id . clone ( ) ;
543
543
544
+ let available_frames = available_samples / stream_inner. num_channels as usize ;
545
+
544
546
match stream_type {
545
547
StreamType :: Input => {
546
548
// Simplify shared logic across the sample format branches.
547
549
macro_rules! read_buffer {
548
550
( $T: ty, $Variant: ident) => { {
549
551
// 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] ;
553
553
let err = alsa:: snd_pcm_readi(
554
554
stream_inner. channel,
555
555
buffer. as_mut_ptr( ) as * mut _,
556
- available as _ ,
556
+ available_frames as alsa :: snd_pcm_uframes_t ,
557
557
) ;
558
558
check_errors( err as _) . expect( "snd_pcm_readi error" ) ;
559
559
let input_buffer = InputBuffer {
@@ -579,28 +579,23 @@ impl EventLoop {
579
579
SampleFormat :: I16 => {
580
580
let buffer = OutputBuffer {
581
581
stream_inner : stream_inner,
582
- buffer : iter:: repeat ( mem:: uninitialized ( ) )
583
- . take ( available)
584
- . collect ( ) ,
582
+ buffer : vec ! [ Default :: default ( ) ; available_samples] ,
585
583
} ;
586
584
587
585
UnknownTypeOutputBuffer :: I16 ( :: OutputBuffer { target : Some ( buffer) } )
588
586
} ,
589
587
SampleFormat :: U16 => {
590
588
let buffer = OutputBuffer {
591
589
stream_inner : stream_inner,
592
- buffer : iter:: repeat ( mem:: uninitialized ( ) )
593
- . take ( available)
594
- . collect ( ) ,
590
+ buffer : vec ! [ Default :: default ( ) ; available_samples] ,
595
591
} ;
596
592
597
593
UnknownTypeOutputBuffer :: U16 ( :: OutputBuffer { target : Some ( buffer) } )
598
594
} ,
599
595
SampleFormat :: F32 => {
600
596
let buffer = OutputBuffer {
601
597
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]
604
599
} ;
605
600
606
601
UnknownTypeOutputBuffer :: F32 ( :: OutputBuffer { target : Some ( buffer) } )
0 commit comments