Skip to content

Commit 1ce8585

Browse files
committed
slight refactor
1 parent 35299a6 commit 1ce8585

File tree

1 file changed

+31
-38
lines changed

1 file changed

+31
-38
lines changed

src/host/asio/stream.rs

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {
678672
impl 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

Comments
 (0)