@@ -61,37 +61,34 @@ impl Device {
6161 return Err ( BuildStreamError :: StreamConfigNotSupported ) ;
6262 }
6363
64- let num_channels = config. channels ;
65- let buffer_size = self . get_or_create_input_stream ( config, sample_format) ?;
66- let cpal_num_samples = buffer_size * num_channels as usize ;
67-
68- // Create the buffer depending on the size of the data type.
69- let len_bytes = cpal_num_samples * sample_format. sample_size ( ) ;
70- let mut interleaved = vec ! [ 0u8 ; len_bytes] ;
71-
72- let stream_playing = Arc :: new ( AtomicBool :: new ( false ) ) ;
73- let playing = Arc :: clone ( & stream_playing) ;
74- let asio_streams = self . asio_streams . clone ( ) ;
75-
76- // Wrap the error_callback in an Arc<Mutex<...>> so it can be shared with the static ASIO callback.
77- // The ASIO message callback is Fn (shared), but the user error callback is FnMut.
64+ // Register the message callback with the driver
7865 let error_callback_shared = Arc :: new ( Mutex :: new ( error_callback) ) ;
79- let error_cb_for_asio = error_callback_shared. clone ( ) ;
8066
81- // Register the message callback with the driver
8267 let message_callback_id = self . driver . add_message_callback ( move |msg| {
8368 // Check specifically for ResetRequest
8469 if let sys:: AsioMessageSelectors :: kAsioResetRequest = msg {
85- if let Ok ( mut cb) = error_cb_for_asio . lock ( ) {
70+ if let Ok ( mut cb) = error_callback_shared . lock ( ) {
8671 cb ( StreamError :: BackendSpecific {
8772 err : BackendSpecificError {
88- description : "ASIO Reset Request: The driver requests a reset. Please drop and recreate the stream ." . to_string ( ) ,
73+ description : "ASIO reset request ." . to_string ( ) ,
8974 } ,
9075 } ) ;
9176 }
9277 }
9378 } ) ;
9479
80+ let num_channels = config. channels ;
81+ let buffer_size = self . get_or_create_input_stream ( config, sample_format) ?;
82+ let cpal_num_samples = buffer_size * num_channels as usize ;
83+
84+ // Create the buffer depending on the size of the data type.
85+ let len_bytes = cpal_num_samples * sample_format. sample_size ( ) ;
86+ let mut interleaved = vec ! [ 0u8 ; len_bytes] ;
87+
88+ let stream_playing = Arc :: new ( AtomicBool :: new ( false ) ) ;
89+ let playing = Arc :: clone ( & stream_playing) ;
90+ let asio_streams = self . asio_streams . clone ( ) ;
91+
9592 // Set the input callback.
9693 // This is most performance critical part of the ASIO bindings.
9794 let config = config. clone ( ) ;
@@ -305,38 +302,35 @@ impl Device {
305302 return Err ( BuildStreamError :: StreamConfigNotSupported ) ;
306303 }
307304
308- let num_channels = config. channels ;
309- let buffer_size = self . get_or_create_output_stream ( config, sample_format) ?;
310- let cpal_num_samples = buffer_size * num_channels as usize ;
311-
312- // Create buffers depending on data type.
313- let len_bytes = cpal_num_samples * sample_format. sample_size ( ) ;
314- let mut interleaved = vec ! [ 0u8 ; len_bytes] ;
315- let current_buffer_index = self . current_buffer_index . clone ( ) ;
316-
317- let stream_playing = Arc :: new ( AtomicBool :: new ( false ) ) ;
318- let playing = Arc :: clone ( & stream_playing) ;
319- let asio_streams = self . asio_streams . clone ( ) ;
320-
321- // Wrap the error_callback in an Arc<Mutex<...>> so it can be shared with the static ASIO callback.
322- // The ASIO message callback is Fn (shared), but the user error callback is FnMut.
305+ // Register the message callback with the driver
323306 let error_callback_shared = Arc :: new ( Mutex :: new ( error_callback) ) ;
324- let error_cb_for_asio = error_callback_shared. clone ( ) ;
325307
326- // Register the message callback with the driver
327308 let message_callback_id = self . driver . add_message_callback ( move |msg| {
328309 // Check specifically for ResetRequest
329310 if let sys:: AsioMessageSelectors :: kAsioResetRequest = msg {
330- if let Ok ( mut cb) = error_cb_for_asio . lock ( ) {
311+ if let Ok ( mut cb) = error_callback_shared . lock ( ) {
331312 cb ( StreamError :: BackendSpecific {
332313 err : BackendSpecificError {
333- description : "ASIO Reset Request: The driver requests a reset. Please drop and recreate the stream ." . to_string ( ) ,
314+ description : "ASIO reset request ." . to_string ( ) ,
334315 } ,
335316 } ) ;
336317 }
337318 }
338319 } ) ;
339320
321+ let num_channels = config. channels ;
322+ let buffer_size = self . get_or_create_output_stream ( config, sample_format) ?;
323+ let cpal_num_samples = buffer_size * num_channels as usize ;
324+
325+ // Create buffers depending on data type.
326+ let len_bytes = cpal_num_samples * sample_format. sample_size ( ) ;
327+ let mut interleaved = vec ! [ 0u8 ; len_bytes] ;
328+ let current_buffer_index = self . current_buffer_index . clone ( ) ;
329+
330+ let stream_playing = Arc :: new ( AtomicBool :: new ( false ) ) ;
331+ let playing = Arc :: clone ( & stream_playing) ;
332+ let asio_streams = self . asio_streams . clone ( ) ;
333+
340334 let config = config. clone ( ) ;
341335 let callback_id = self . driver . add_callback ( move |callback_info| unsafe {
342336 // If not playing, return early.
@@ -678,7 +672,6 @@ impl Device {
678672impl Drop for Stream {
679673 fn drop ( & mut self ) {
680674 self . driver . remove_callback ( self . callback_id ) ;
681- // Unregister the message callback to prevent memory leaks and calling dropped callbacks
682675 self . driver
683676 . remove_message_callback ( self . message_callback_id ) ;
684677 }
0 commit comments