@@ -148,7 +148,8 @@ fn write_samples_direct(
148
148
if !matches ! ( stream. state, PCMState :: Start ) {
149
149
return Ok ( false ) ;
150
150
}
151
- let mut buf = vec ! [ 0 ; buffer. data_descriptor. len( ) as usize ] ;
151
+ let n_bytes = buffer. data_descriptor . len ( ) as usize - buffer. pos ;
152
+ let mut buf = vec ! [ 0 ; n_bytes] ;
152
153
let read_bytes = match buffer. consume ( & mut buf) {
153
154
Err ( err) => {
154
155
log:: error!(
@@ -209,10 +210,14 @@ fn write_samples_io(
209
210
stream. buffers . pop_front ( ) ;
210
211
return 0 ;
211
212
}
212
- let mut data = vec ! [ 0 ; buffer. data_descriptor. len( ) as usize ] ;
213
+
214
+ let n_bytes = std:: cmp:: min (
215
+ buf. len ( ) ,
216
+ buffer. data_descriptor . len ( ) as usize - buffer. pos ,
217
+ ) ;
213
218
// consume() always reads (buffer.data_descriptor.len() -
214
219
// buffer.pos) bytes
215
- let read_bytes = match buffer. consume ( & mut data ) {
220
+ let read_bytes = match buffer. consume ( & mut buf [ 0 ..n_bytes ] ) {
216
221
Ok ( v) => v,
217
222
Err ( err) => {
218
223
log:: error!( "Could not read TX buffer, dropping it immediately: {}" , err) ;
@@ -221,18 +226,11 @@ fn write_samples_io(
221
226
}
222
227
} ;
223
228
224
- let mut iter = data[ 0 ..read_bytes as usize ] . iter ( ) . cloned ( ) ;
225
-
226
- let mut written_bytes = 0 ;
227
- for ( sample, byte) in buf. iter_mut ( ) . zip ( & mut iter) {
228
- * sample = byte;
229
- written_bytes += 1 ;
230
- }
231
- buffer. pos += written_bytes as usize ;
229
+ buffer. pos += read_bytes as usize ;
232
230
if buffer. pos >= buffer. data_descriptor . len ( ) as usize {
233
231
stream. buffers . pop_front ( ) ;
234
232
}
235
- p. bytes_to_frames ( written_bytes )
233
+ p. bytes_to_frames ( read_bytes as isize )
236
234
. try_into ( )
237
235
. unwrap_or_default ( )
238
236
} ) ?;
0 commit comments