From 910e0ba3510a6f837313fb33e2d2d071e829dff5 Mon Sep 17 00:00:00 2001 From: Tom Gowan Date: Fri, 12 Oct 2018 20:26:25 +1100 Subject: [PATCH] working record wav --- .../windows/asio/asio_utils/src/lib.rs | 26 +++++++++++++++++++ src/platform/windows/asio/stream.rs | 5 +++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/platform/windows/asio/asio_utils/src/lib.rs b/src/platform/windows/asio/asio_utils/src/lib.rs index 050079f..765ce6f 100644 --- a/src/platform/windows/asio/asio_utils/src/lib.rs +++ b/src/platform/windows/asio/asio_utils/src/lib.rs @@ -13,6 +13,16 @@ mod tests; /// cpal: 123123123123 /// cpal buffer must have a length of exactly sum( all asio channel lengths ) /// this check is ommited for performance +pub fn interleave(channels: &[Vec], target: &mut Vec) +where + T: std::marker::Copy, +{ + assert!(!channels.is_empty()); + target.clear(); + let frames = channels[0].len(); + target.extend((0 .. frames).flat_map(|f| channels.iter().map(move |ch| ch[f]))); +} +/* pub fn interleave(channel_buffer: &[Vec], cpal_buffer: &mut [T]) where T: std::marker::Copy, @@ -32,6 +42,7 @@ where } } } +*/ /// Function for deinterleaving because /// cpal writes to buffer interleaved @@ -41,6 +52,20 @@ where /// cpal: 123123123123 /// asio: 111122223333 pub fn deinterleave(cpal_buffer: &[T], asio_channels: &mut [Vec]) +where + T: std::marker::Copy, +{ + for ch in asio_channels.iter_mut() { + ch.clear(); + } + let num_channels = asio_channels.len(); + let mut ch = (0 .. num_channels).cycle(); + for &sample in cpal_buffer.iter() { + asio_channels[ch.next().unwrap()].push(sample); + } +} +/* +pub fn deinterleave(cpal_buffer: &[T], asio_channels: &mut [Vec]) where T: std::marker::Copy, { @@ -58,3 +83,4 @@ where } } } +*/ diff --git a/src/platform/windows/asio/stream.rs b/src/platform/windows/asio/stream.rs index 5f8023e..fa1cd9c 100644 --- a/src/platform/windows/asio/stream.rs +++ b/src/platform/windows/asio/stream.rs @@ -181,9 +181,12 @@ impl EventLoop { { let $BuffersTypeIdent { cpal: ref mut c_buffer, - channel: ref channels, + channel: ref mut channels, } = $Buffers; au::interleave(&channels, c_buffer); + for c in channels.iter_mut() { + c.clear(); + } }