@@ -2,6 +2,7 @@ use cap_media_info::{AudioInfo, ffmpeg_sample_format_for};
22use cap_timestamp:: Timestamp ;
33use cpal:: {
44 Device , InputCallbackInfo , SampleFormat , StreamError , SupportedStreamConfig ,
5+ SupportedStreamConfigRange ,
56 traits:: { DeviceTrait , HostTrait , StreamTrait } ,
67} ;
78use flume:: TrySendError ;
@@ -146,16 +147,25 @@ fn get_usable_device(device: Device) -> Option<(String, Device, SupportedStreamC
146147 . then ( b. max_sample_rate ( ) . cmp ( & a. max_sample_rate ( ) ) )
147148 } ) ;
148149
149- configs
150- . into_iter ( )
151- . filter ( |c| c . min_sample_rate ( ) . 0 <= 48000 && c . max_sample_rate ( ) . 0 >= 48000 )
152- . find ( |c| ffmpeg_sample_format_for ( c . sample_format ( ) ) . is_some ( ) )
150+ configs. into_iter ( ) . find_map ( |config| {
151+ ffmpeg_sample_format_for ( config . sample_format ( ) )
152+ . map ( |_| config . with_sample_rate ( select_sample_rate ( & config ) ) )
153+ } )
153154 } ) ;
154155
155- result. and_then ( |config| {
156- let final_config = config. with_sample_rate ( cpal:: SampleRate ( 48000 ) ) ;
157- device. name ( ) . ok ( ) . map ( |name| ( name, device, final_config) )
158- } )
156+ result. and_then ( |config| device. name ( ) . ok ( ) . map ( |name| ( name, device, config) ) )
157+ }
158+
159+ fn select_sample_rate ( config : & SupportedStreamConfigRange ) -> cpal:: SampleRate {
160+ const PREFERRED_RATES : [ u32 ; 2 ] = [ 48_000 , 44_100 ] ;
161+
162+ for rate in PREFERRED_RATES {
163+ if config. min_sample_rate ( ) . 0 <= rate && config. max_sample_rate ( ) . 0 >= rate {
164+ return cpal:: SampleRate ( rate) ;
165+ }
166+ }
167+
168+ cpal:: SampleRate ( config. max_sample_rate ( ) . 0 )
159169}
160170
161171#[ derive( Reply ) ]
0 commit comments