@@ -501,14 +501,17 @@ fn make_playback_buffer_attr(
501501 match config. buffer_size {
502502 crate :: BufferSize :: Default => Default :: default ( ) ,
503503 crate :: BufferSize :: Fixed ( frame_count) => {
504- let len = frame_count * config. channels as u32 * format. bytes_per_sample ( ) as u32 ;
504+ let len =
505+ ( frame_count as u64 * config. channels as u64 * format. bytes_per_sample ( ) as u64 )
506+ . min ( u32:: MAX as u64 ) as u32 ;
507+ let double_len = ( len as u64 * 2 ) . min ( u32:: MAX as u64 ) as u32 ;
505508 protocol:: stream:: BufferAttr {
506509 // Double-buffer: total buffer = 2 callback periods. With
507510 // adjust_latency this becomes the end-to-end latency target,
508511 // Minimum request = one callback period, ensuring the server
509512 // always asks for exactly frame_count frames per call.
510- max_length : 2 * len ,
511- target_length : 2 * len ,
513+ max_length : double_len ,
514+ target_length : double_len ,
512515 minimum_request_length : len,
513516 ..Default :: default ( )
514517 }
@@ -523,7 +526,9 @@ fn make_record_buffer_attr(
523526 match config. buffer_size {
524527 crate :: BufferSize :: Default => Default :: default ( ) ,
525528 crate :: BufferSize :: Fixed ( frame_count) => {
526- let len = frame_count * config. channels as u32 * format. bytes_per_sample ( ) as u32 ;
529+ let len =
530+ ( frame_count as u64 * config. channels as u64 * format. bytes_per_sample ( ) as u64 )
531+ . min ( u32:: MAX as u64 ) as u32 ;
527532 protocol:: stream:: BufferAttr {
528533 // fragment_size controls the delivery chunk size for record
529534 // streams; target_length is playback-only and is ignored here.
0 commit comments