diff --git a/asio-sys/asio-link/helpers.cpp b/asio-sys/asio-link/helpers.cpp index 39c703d..79ec8bb 100644 --- a/asio-sys/asio-link/helpers.cpp +++ b/asio-sys/asio-link/helpers.cpp @@ -1,4 +1,5 @@ #include "helpers.hpp" +#include extern "C" ASIOError get_sample_rate(double * rate){ return ASIOGetSampleRate(reinterpret_cast(rate)); diff --git a/asio-sys/src/lib.rs b/asio-sys/src/lib.rs index c68fb8c..a9859b8 100644 --- a/asio-sys/src/lib.rs +++ b/asio-sys/src/lib.rs @@ -71,7 +71,6 @@ enum AsioState { Running, } - pub struct AsioStreams { pub input: Option, pub output: Option, @@ -282,14 +281,15 @@ impl Drivers { } pub fn prepare_input_stream(&self, output: Option, num_channels: usize) -> Result { - let buffer_infos = vec![ - AsioBufferInfo { - is_input: 1, - channel_num: 0, - buffers: [std::ptr::null_mut(); 2], - }; - num_channels - ]; + let buffer_infos = (0..num_channels) + .map(|i| { + AsioBufferInfo { + is_input: 1, + channel_num: i as c_long, + buffers: [std::ptr::null_mut(); 2], + } + }) + .collect(); let streams = AsioStreams{input: Some(AsioStream{buffer_infos, buffer_size: 0}), output}; self.create_streams(streams) @@ -298,14 +298,15 @@ impl Drivers { /// Creates the output stream pub fn prepare_output_stream(&self, input: Option, num_channels: usize) -> Result { // Initialize data for FFI - let buffer_infos = vec![ - AsioBufferInfo { - is_input: 0, - channel_num: 0, - buffers: [std::ptr::null_mut(); 2], - }; - num_channels - ]; + let buffer_infos = (0..num_channels) + .map(|i| { + AsioBufferInfo { + is_input: 0, + channel_num: i as c_long, + buffers: [std::ptr::null_mut(); 2], + } + }) + .collect(); let streams = AsioStreams{output: Some(AsioStream{buffer_infos, buffer_size: 0}), input}; self.create_streams(streams) } @@ -397,10 +398,13 @@ impl Drivers { &mut grans, ).expect("Failed getting buffers"); if pref_b_size > 0 { + /* let mut buffer_info_convert: Vec = buffer_infos .into_iter() .map(|bi| mem::transmute::(bi)) .collect(); + */ + let mut buffer_info_convert = mem::transmute::, Vec>(buffer_infos); let mut callbacks_convert = mem::transmute::(callbacks); drivers.asio_create_buffers( @@ -409,10 +413,7 @@ impl Drivers { pref_b_size, &mut callbacks_convert, ).map(|_|{ - let buffer_infos: Vec = buffer_info_convert - .into_iter() - .map(|bi| mem::transmute::(bi)) - .collect(); + let buffer_infos = mem::transmute::, Vec>(buffer_info_convert); for d in &buffer_infos { println!("after {:?}", d); } diff --git a/src/platform/windows/asio/stream.rs b/src/platform/windows/asio/stream.rs index abb5e2f..2b86482 100644 --- a/src/platform/windows/asio/stream.rs +++ b/src/platform/windows/asio/stream.rs @@ -75,7 +75,14 @@ impl EventLoop { /// Create a new CPAL Input Stream /// If there is no ASIO Input Stream /// it will be created - fn get_input_stream(&self, drivers: &sys::Drivers, num_channels: usize, sample_rate: u32) -> Result { + fn get_input_stream(&self, drivers: &sys::Drivers, format: &Format) -> Result { + let Format { + channels, + sample_rate, + .. + } = format; + let num_channels = *channels as usize; + let sample_rate = sample_rate.0; let ref mut streams = *self.asio_streams.lock().unwrap(); if sample_rate != drivers.get_sample_rate().rate { if drivers.can_sample_rate(sample_rate) { @@ -105,7 +112,14 @@ impl EventLoop { } } - fn get_output_stream(&self, drivers: &sys::Drivers, num_channels: usize, sample_rate: u32) -> Result { + fn get_output_stream(&self, drivers: &sys::Drivers, format: &Format) -> Result { + let Format { + channels, + sample_rate, + .. + } = format; + let num_channels = *channels as usize; + let sample_rate = sample_rate.0; let ref mut streams = *self.asio_streams.lock().unwrap(); if sample_rate != drivers.get_sample_rate().rate { if drivers.can_sample_rate(sample_rate) { @@ -146,8 +160,7 @@ impl EventLoop { } = device; let num_channels = format.channels.clone(); let stream_type = drivers.get_data_type().expect("Couldn't load data type"); - let sample_rate = format.sample_rate.0; - self.get_input_stream(&drivers, num_channels as usize, sample_rate).map(|stream_buffer_size| { + self.get_input_stream(&drivers, format).map(|stream_buffer_size| { let cpal_num_samples = stream_buffer_size * num_channels as usize; let count = self.stream_count.load(Ordering::SeqCst); self.stream_count.store(count + 1, Ordering::SeqCst); @@ -361,8 +374,7 @@ pub fn build_output_stream( } = device; let num_channels = format.channels.clone(); let stream_type = drivers.get_data_type().expect("Couldn't load data type"); - let sample_rate = format.sample_rate.0; - self.get_output_stream(&drivers, num_channels as usize, sample_rate).map(|stream_buffer_size| { + self.get_output_stream(&drivers, format).map(|stream_buffer_size| { let cpal_num_samples = stream_buffer_size * num_channels as usize; let count = self.stream_count.load(Ordering::SeqCst); self.stream_count.store(count + 1, Ordering::SeqCst);