multi channels
This commit is contained in:
parent
6e0eb073d1
commit
ffcbc02e52
|
@ -1,4 +1,5 @@
|
||||||
#include "helpers.hpp"
|
#include "helpers.hpp"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
extern "C" ASIOError get_sample_rate(double * rate){
|
extern "C" ASIOError get_sample_rate(double * rate){
|
||||||
return ASIOGetSampleRate(reinterpret_cast<ASIOSampleRate *>(rate));
|
return ASIOGetSampleRate(reinterpret_cast<ASIOSampleRate *>(rate));
|
||||||
|
|
|
@ -71,7 +71,6 @@ enum AsioState {
|
||||||
Running,
|
Running,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub struct AsioStreams {
|
pub struct AsioStreams {
|
||||||
pub input: Option<AsioStream>,
|
pub input: Option<AsioStream>,
|
||||||
pub output: Option<AsioStream>,
|
pub output: Option<AsioStream>,
|
||||||
|
@ -282,14 +281,15 @@ impl Drivers {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn prepare_input_stream(&self, output: Option<AsioStream>, num_channels: usize) -> Result<AsioStreams, AsioDriverError> {
|
pub fn prepare_input_stream(&self, output: Option<AsioStream>, num_channels: usize) -> Result<AsioStreams, AsioDriverError> {
|
||||||
let buffer_infos = vec![
|
let buffer_infos = (0..num_channels)
|
||||||
|
.map(|i| {
|
||||||
AsioBufferInfo {
|
AsioBufferInfo {
|
||||||
is_input: 1,
|
is_input: 1,
|
||||||
channel_num: 0,
|
channel_num: i as c_long,
|
||||||
buffers: [std::ptr::null_mut(); 2],
|
buffers: [std::ptr::null_mut(); 2],
|
||||||
};
|
}
|
||||||
num_channels
|
})
|
||||||
];
|
.collect();
|
||||||
|
|
||||||
let streams = AsioStreams{input: Some(AsioStream{buffer_infos, buffer_size: 0}), output};
|
let streams = AsioStreams{input: Some(AsioStream{buffer_infos, buffer_size: 0}), output};
|
||||||
self.create_streams(streams)
|
self.create_streams(streams)
|
||||||
|
@ -298,14 +298,15 @@ impl Drivers {
|
||||||
/// Creates the output stream
|
/// Creates the output stream
|
||||||
pub fn prepare_output_stream(&self, input: Option<AsioStream>, num_channels: usize) -> Result<AsioStreams, AsioDriverError> {
|
pub fn prepare_output_stream(&self, input: Option<AsioStream>, num_channels: usize) -> Result<AsioStreams, AsioDriverError> {
|
||||||
// Initialize data for FFI
|
// Initialize data for FFI
|
||||||
let buffer_infos = vec![
|
let buffer_infos = (0..num_channels)
|
||||||
|
.map(|i| {
|
||||||
AsioBufferInfo {
|
AsioBufferInfo {
|
||||||
is_input: 0,
|
is_input: 0,
|
||||||
channel_num: 0,
|
channel_num: i as c_long,
|
||||||
buffers: [std::ptr::null_mut(); 2],
|
buffers: [std::ptr::null_mut(); 2],
|
||||||
};
|
}
|
||||||
num_channels
|
})
|
||||||
];
|
.collect();
|
||||||
let streams = AsioStreams{output: Some(AsioStream{buffer_infos, buffer_size: 0}), input};
|
let streams = AsioStreams{output: Some(AsioStream{buffer_infos, buffer_size: 0}), input};
|
||||||
self.create_streams(streams)
|
self.create_streams(streams)
|
||||||
}
|
}
|
||||||
|
@ -397,10 +398,13 @@ impl Drivers {
|
||||||
&mut grans,
|
&mut grans,
|
||||||
).expect("Failed getting buffers");
|
).expect("Failed getting buffers");
|
||||||
if pref_b_size > 0 {
|
if pref_b_size > 0 {
|
||||||
|
/*
|
||||||
let mut buffer_info_convert: Vec<ai::ASIOBufferInfo> = buffer_infos
|
let mut buffer_info_convert: Vec<ai::ASIOBufferInfo> = buffer_infos
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|bi| mem::transmute::<AsioBufferInfo, ai::ASIOBufferInfo>(bi))
|
.map(|bi| mem::transmute::<AsioBufferInfo, ai::ASIOBufferInfo>(bi))
|
||||||
.collect();
|
.collect();
|
||||||
|
*/
|
||||||
|
let mut buffer_info_convert = mem::transmute::<Vec<AsioBufferInfo>, Vec<ai::ASIOBufferInfo>>(buffer_infos);
|
||||||
let mut callbacks_convert =
|
let mut callbacks_convert =
|
||||||
mem::transmute::<AsioCallbacks, ai::ASIOCallbacks>(callbacks);
|
mem::transmute::<AsioCallbacks, ai::ASIOCallbacks>(callbacks);
|
||||||
drivers.asio_create_buffers(
|
drivers.asio_create_buffers(
|
||||||
|
@ -409,10 +413,7 @@ impl Drivers {
|
||||||
pref_b_size,
|
pref_b_size,
|
||||||
&mut callbacks_convert,
|
&mut callbacks_convert,
|
||||||
).map(|_|{
|
).map(|_|{
|
||||||
let buffer_infos: Vec<AsioBufferInfo> = buffer_info_convert
|
let buffer_infos = mem::transmute::<Vec<ai::ASIOBufferInfo>, Vec<AsioBufferInfo>>(buffer_info_convert);
|
||||||
.into_iter()
|
|
||||||
.map(|bi| mem::transmute::<ai::ASIOBufferInfo, AsioBufferInfo>(bi))
|
|
||||||
.collect();
|
|
||||||
for d in &buffer_infos {
|
for d in &buffer_infos {
|
||||||
println!("after {:?}", d);
|
println!("after {:?}", d);
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,14 @@ impl EventLoop {
|
||||||
/// Create a new CPAL Input Stream
|
/// Create a new CPAL Input Stream
|
||||||
/// If there is no ASIO Input Stream
|
/// If there is no ASIO Input Stream
|
||||||
/// it will be created
|
/// it will be created
|
||||||
fn get_input_stream(&self, drivers: &sys::Drivers, num_channels: usize, sample_rate: u32) -> Result<usize, CreationError> {
|
fn get_input_stream(&self, drivers: &sys::Drivers, format: &Format) -> Result<usize, CreationError> {
|
||||||
|
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();
|
let ref mut streams = *self.asio_streams.lock().unwrap();
|
||||||
if sample_rate != drivers.get_sample_rate().rate {
|
if sample_rate != drivers.get_sample_rate().rate {
|
||||||
if drivers.can_sample_rate(sample_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<usize, CreationError> {
|
fn get_output_stream(&self, drivers: &sys::Drivers, format: &Format) -> Result<usize, CreationError> {
|
||||||
|
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();
|
let ref mut streams = *self.asio_streams.lock().unwrap();
|
||||||
if sample_rate != drivers.get_sample_rate().rate {
|
if sample_rate != drivers.get_sample_rate().rate {
|
||||||
if drivers.can_sample_rate(sample_rate) {
|
if drivers.can_sample_rate(sample_rate) {
|
||||||
|
@ -146,8 +160,7 @@ impl EventLoop {
|
||||||
} = device;
|
} = device;
|
||||||
let num_channels = format.channels.clone();
|
let num_channels = format.channels.clone();
|
||||||
let stream_type = drivers.get_data_type().expect("Couldn't load data type");
|
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, format).map(|stream_buffer_size| {
|
||||||
self.get_input_stream(&drivers, num_channels as usize, sample_rate).map(|stream_buffer_size| {
|
|
||||||
let cpal_num_samples = stream_buffer_size * num_channels as usize;
|
let cpal_num_samples = stream_buffer_size * num_channels as usize;
|
||||||
let count = self.stream_count.load(Ordering::SeqCst);
|
let count = self.stream_count.load(Ordering::SeqCst);
|
||||||
self.stream_count.store(count + 1, Ordering::SeqCst);
|
self.stream_count.store(count + 1, Ordering::SeqCst);
|
||||||
|
@ -361,8 +374,7 @@ pub fn build_output_stream(
|
||||||
} = device;
|
} = device;
|
||||||
let num_channels = format.channels.clone();
|
let num_channels = format.channels.clone();
|
||||||
let stream_type = drivers.get_data_type().expect("Couldn't load data type");
|
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, format).map(|stream_buffer_size| {
|
||||||
self.get_output_stream(&drivers, num_channels as usize, sample_rate).map(|stream_buffer_size| {
|
|
||||||
let cpal_num_samples = stream_buffer_size * num_channels as usize;
|
let cpal_num_samples = stream_buffer_size * num_channels as usize;
|
||||||
let count = self.stream_count.load(Ordering::SeqCst);
|
let count = self.stream_count.load(Ordering::SeqCst);
|
||||||
self.stream_count.store(count + 1, Ordering::SeqCst);
|
self.stream_count.store(count + 1, Ordering::SeqCst);
|
||||||
|
|
Loading…
Reference in New Issue