From 8343d3440fd4c9ae28e7a478e836b2a8c09c9a45 Mon Sep 17 00:00:00 2001 From: oliped Date: Tue, 14 Jan 2025 16:41:18 +0300 Subject: [PATCH 1/2] reuse buffers for directaudio --- src/directsound.rs | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/directsound.rs b/src/directsound.rs index 35aba57..b9f567b 100644 --- a/src/directsound.rs +++ b/src/directsound.rs @@ -218,9 +218,9 @@ impl AudioOutputDevice for DirectSoundDevice { DataSender { buffer, notify_points, + data_buffer: vec![0.0; channel_sample_count * channels_count] + .into_boxed_slice(), data_callback, - channels_count, - channel_sample_count, is_running: is_running.clone(), } .run_in_thread(), @@ -257,9 +257,8 @@ impl Drop for DirectSoundDevice { struct DataSender { buffer: *mut IDirectSoundBuffer, notify_points: [*mut c_void; 2], + data_buffer: Box<[f32]>, data_callback: C, - channels_count: usize, - channel_sample_count: usize, is_running: Arc, } @@ -278,27 +277,25 @@ where } unsafe fn run_send_loop(&mut self) { - let mut data_buffer = vec![0.0; self.channel_sample_count * self.channels_count]; - let device_buffer_half_len_bytes = (data_buffer.len() * size_of::()) as DWORD; + let device_buffer_half_len_bytes = + (self.data_buffer.len() * size_of::()) as DWORD; while self.is_running.load(Ordering::SeqCst) { - (self.data_callback)(&mut data_buffer); + (self.data_callback)(&mut self.data_buffer); // Wait and send. const WAIT_OBJECT_1: u32 = WAIT_OBJECT_0 + 1; match WaitForMultipleObjects(2, self.notify_points.as_ptr(), 0, INFINITE) { - WAIT_OBJECT_0 => self.write( - device_buffer_half_len_bytes, - device_buffer_half_len_bytes, - &data_buffer, - ), - WAIT_OBJECT_1 => self.write(0, device_buffer_half_len_bytes, &data_buffer), + WAIT_OBJECT_0 => { + self.write(device_buffer_half_len_bytes, device_buffer_half_len_bytes) + } + WAIT_OBJECT_1 => self.write(0, device_buffer_half_len_bytes), _ => panic!("Unknown buffer point!"), } } } - unsafe fn write(&self, offset_bytes: DWORD, len_bytes: DWORD, data_buffer: &[f32]) { + unsafe fn write(&self, offset_bytes: DWORD, len_bytes: DWORD) { let mut size = 0; let mut device_buffer = null_mut(); check( @@ -317,12 +314,15 @@ where let device_buffer_slice = std::slice::from_raw_parts_mut::( device_buffer as *mut _, - data_buffer.len(), + self.data_buffer.len(), ); - debug_assert_eq!(size as usize, data_buffer.len() * size_of::()); - debug_assert_eq!(device_buffer_slice.len(), data_buffer.len()); - for (in_sample, out_sample) in data_buffer.iter().zip(device_buffer_slice) { + debug_assert_eq!( + size as usize, + self.data_buffer.len() * size_of::() + ); + debug_assert_eq!(device_buffer_slice.len(), self.data_buffer.len()); + for (in_sample, out_sample) in self.data_buffer.iter().zip(device_buffer_slice) { *out_sample = (in_sample * DeviceSample::MAX as f32) as DeviceSample; } From 38396456d0d5e001ae1248e83e89a16fe2ef338d Mon Sep 17 00:00:00 2001 From: oliped Date: Wed, 15 Jan 2025 15:15:45 +0300 Subject: [PATCH 2/2] reset buffer to zero --- src/directsound.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/directsound.rs b/src/directsound.rs index b9f567b..77a9089 100644 --- a/src/directsound.rs +++ b/src/directsound.rs @@ -281,6 +281,7 @@ where (self.data_buffer.len() * size_of::()) as DWORD; while self.is_running.load(Ordering::SeqCst) { + self.data_buffer.fill(0.0); (self.data_callback)(&mut self.data_buffer); // Wait and send.