Skip to content

Commit 8343d34

Browse files
committed
reuse buffers for directaudio
1 parent 19dd8dd commit 8343d34

File tree

1 file changed

+18
-18
lines changed

1 file changed

+18
-18
lines changed

src/directsound.rs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,9 @@ impl AudioOutputDevice for DirectSoundDevice {
218218
DataSender {
219219
buffer,
220220
notify_points,
221+
data_buffer: vec![0.0; channel_sample_count * channels_count]
222+
.into_boxed_slice(),
221223
data_callback,
222-
channels_count,
223-
channel_sample_count,
224224
is_running: is_running.clone(),
225225
}
226226
.run_in_thread(),
@@ -257,9 +257,8 @@ impl Drop for DirectSoundDevice {
257257
struct DataSender<C> {
258258
buffer: *mut IDirectSoundBuffer,
259259
notify_points: [*mut c_void; 2],
260+
data_buffer: Box<[f32]>,
260261
data_callback: C,
261-
channels_count: usize,
262-
channel_sample_count: usize,
263262
is_running: Arc<AtomicBool>,
264263
}
265264

@@ -278,27 +277,25 @@ where
278277
}
279278

280279
unsafe fn run_send_loop(&mut self) {
281-
let mut data_buffer = vec![0.0; self.channel_sample_count * self.channels_count];
282-
let device_buffer_half_len_bytes = (data_buffer.len() * size_of::<DeviceSample>()) as DWORD;
280+
let device_buffer_half_len_bytes =
281+
(self.data_buffer.len() * size_of::<DeviceSample>()) as DWORD;
283282

284283
while self.is_running.load(Ordering::SeqCst) {
285-
(self.data_callback)(&mut data_buffer);
284+
(self.data_callback)(&mut self.data_buffer);
286285

287286
// Wait and send.
288287
const WAIT_OBJECT_1: u32 = WAIT_OBJECT_0 + 1;
289288
match WaitForMultipleObjects(2, self.notify_points.as_ptr(), 0, INFINITE) {
290-
WAIT_OBJECT_0 => self.write(
291-
device_buffer_half_len_bytes,
292-
device_buffer_half_len_bytes,
293-
&data_buffer,
294-
),
295-
WAIT_OBJECT_1 => self.write(0, device_buffer_half_len_bytes, &data_buffer),
289+
WAIT_OBJECT_0 => {
290+
self.write(device_buffer_half_len_bytes, device_buffer_half_len_bytes)
291+
}
292+
WAIT_OBJECT_1 => self.write(0, device_buffer_half_len_bytes),
296293
_ => panic!("Unknown buffer point!"),
297294
}
298295
}
299296
}
300297

301-
unsafe fn write(&self, offset_bytes: DWORD, len_bytes: DWORD, data_buffer: &[f32]) {
298+
unsafe fn write(&self, offset_bytes: DWORD, len_bytes: DWORD) {
302299
let mut size = 0;
303300
let mut device_buffer = null_mut();
304301
check(
@@ -317,12 +314,15 @@ where
317314

318315
let device_buffer_slice = std::slice::from_raw_parts_mut::<DeviceSample>(
319316
device_buffer as *mut _,
320-
data_buffer.len(),
317+
self.data_buffer.len(),
321318
);
322319

323-
debug_assert_eq!(size as usize, data_buffer.len() * size_of::<DeviceSample>());
324-
debug_assert_eq!(device_buffer_slice.len(), data_buffer.len());
325-
for (in_sample, out_sample) in data_buffer.iter().zip(device_buffer_slice) {
320+
debug_assert_eq!(
321+
size as usize,
322+
self.data_buffer.len() * size_of::<DeviceSample>()
323+
);
324+
debug_assert_eq!(device_buffer_slice.len(), self.data_buffer.len());
325+
for (in_sample, out_sample) in self.data_buffer.iter().zip(device_buffer_slice) {
326326
*out_sample = (in_sample * DeviceSample::MAX as f32) as DeviceSample;
327327
}
328328

0 commit comments

Comments
 (0)