@@ -9,8 +9,6 @@ use alsa::{Direction, ValueOr};
99use std:: process:: exit;
1010use thiserror:: Error ;
1111
12- const MAX_BUFFER : Frames = ( SAMPLE_RATE / 2 ) as Frames ;
13- const MIN_BUFFER : Frames = ( SAMPLE_RATE / 10 ) as Frames ;
1412const ZERO_FRAMES : Frames = 0 ;
1513
1614const MAX_PERIOD_DIVISOR : Frames = 4 ;
@@ -162,7 +160,7 @@ fn list_compatible_devices() -> SinkResult<()> {
162160 Ok ( ( ) )
163161}
164162
165- fn open_device ( dev_name : & str , format : AudioFormat ) -> SinkResult < ( PCM , usize ) > {
163+ fn open_device ( dev_name : & str , format : AudioFormat , sample_rate : u32 ) -> SinkResult < ( PCM , usize ) > {
166164 let pcm = PCM :: new ( dev_name, Direction :: Playback , false ) . map_err ( |e| AlsaError :: PcmSetUp {
167165 device : dev_name. to_string ( ) ,
168166 e,
@@ -187,10 +185,10 @@ fn open_device(dev_name: &str, format: AudioFormat) -> SinkResult<(PCM, usize)>
187185 e,
188186 } ) ?;
189187
190- hwp. set_rate ( SAMPLE_RATE , ValueOr :: Nearest ) . map_err ( |e| {
188+ hwp. set_rate ( sample_rate , ValueOr :: Nearest ) . map_err ( |e| {
191189 AlsaError :: UnsupportedSampleRate {
192190 device : dev_name. to_string ( ) ,
193- samplerate : SAMPLE_RATE ,
191+ samplerate : sample_rate ,
194192 e,
195193 }
196194 } ) ?;
@@ -240,8 +238,11 @@ fn open_device(dev_name: &str, format: AudioFormat) -> SinkResult<(PCM, usize)>
240238 Ok ( s) => s,
241239 } ;
242240
241+ let max_buffer: Frames = ( sample_rate / 2 ) as Frames ;
242+ let min_buffer: Frames = ( sample_rate / 10 ) as Frames ;
243+
243244 let buffer_size = if min < max {
244- match ( MIN_BUFFER ..=MAX_BUFFER )
245+ match ( min_buffer ..=max_buffer )
245246 . rev ( )
246247 . find ( |f| ( min..=max) . contains ( f) )
247248 {
@@ -269,7 +270,7 @@ fn open_device(dev_name: &str, format: AudioFormat) -> SinkResult<(PCM, usize)>
269270 } ;
270271
271272 if buffer_size == ZERO_FRAMES {
272- trace ! ( "Desired Buffer Frame range: {MIN_BUFFER :?} - {MAX_BUFFER :?}" , ) ;
273+ trace ! ( "Desired Buffer Frame range: {min_buffer :?} - {max_buffer :?}" , ) ;
273274
274275 trace ! ( "Actual Buffer Frame range as reported by the device: {min:?} - {max:?}" , ) ;
275276 }
@@ -416,18 +417,7 @@ impl Open for AlsaSink {
416417impl Sink for AlsaSink {
417418 fn start ( & mut self ) -> SinkResult < ( ) > {
418419 if self . pcm . is_none ( ) {
419- let ( pcm, bytes_per_period) = open_device ( & self . device , self . format ) ?;
420- self . pcm = Some ( pcm) ;
421-
422- if self . period_buffer . capacity ( ) != bytes_per_period {
423- self . period_buffer = Vec :: with_capacity ( bytes_per_period) ;
424- }
425-
426- // Should always match the "Period Buffer size in bytes: " trace! message.
427- trace ! (
428- "Period Buffer capacity: {:?}" ,
429- self . period_buffer. capacity( )
430- ) ;
420+ self . start_internal ( SAMPLE_RATE ) ?;
431421 }
432422
433423 Ok ( ( ) )
@@ -448,6 +438,13 @@ impl Sink for AlsaSink {
448438 Ok ( ( ) )
449439 }
450440
441+ fn update_sample_rate ( & mut self , new_sample_rate : u32 ) -> SinkResult < ( ) > {
442+ self . stop ( ) ?;
443+ self . start_internal ( new_sample_rate) ?;
444+
445+ Ok ( ( ) )
446+ }
447+
451448 sink_as_bytes ! ( ) ;
452449}
453450
@@ -483,6 +480,23 @@ impl SinkAsBytes for AlsaSink {
483480impl AlsaSink {
484481 pub const NAME : & ' static str = "alsa" ;
485482
483+ fn start_internal ( & mut self , sample_rate : u32 ) -> SinkResult < ( ) > {
484+ let ( pcm, bytes_per_period) = open_device ( & self . device , self . format , sample_rate) ?;
485+ self . pcm = Some ( pcm) ;
486+
487+ if self . period_buffer . capacity ( ) != bytes_per_period {
488+ self . period_buffer = Vec :: with_capacity ( bytes_per_period) ;
489+ }
490+
491+ // Should always match the "Period Buffer size in bytes: " trace! message.
492+ trace ! (
493+ "Period Buffer capacity: {:?}" ,
494+ self . period_buffer. capacity( )
495+ ) ;
496+
497+ Ok ( ( ) )
498+ }
499+
486500 fn write_buf ( & mut self ) -> SinkResult < ( ) > {
487501 if self . pcm . is_some ( ) {
488502 let write_result = {
0 commit comments