minor fixes 2

This commit is contained in:
DMSDeveloper 2018-04-25 19:44:45 +10:00 committed by mitchmindtree
parent a1740a9282
commit 892024f5d8
2 changed files with 31 additions and 57 deletions

View File

@ -102,57 +102,30 @@ impl Device {
} }
pub fn default_output_format(&self) -> Result<Format, DefaultFormatError> { pub fn default_output_format(&self) -> Result<Format, DefaultFormatError> {
let format = Format{channels: 0, sample_rate: SampleRate(0), let num_channels = sys::get_channels(&self.driver_name)
// TODO Not sure about how to set the data type .map(|c| c.outs as u16);
data_type: SampleFormat::F32}; let sample_rate = sys::get_sample_rate(&self.driver_name)
.map(|s| SampleRate(s.rate));
let format = match sys::get_channels(&self.driver_name) { let data_type = sys::get_data_type(&self.driver_name);
Ok(channels) => {
Format{channels: channels.outs as u16,
sample_rate: format.sample_rate,
data_type: format.data_type}
},
Err(e) => {
println!("Error retrieving channels: {}", e);
format
},
};
let format = match sys::get_sample_rate(&self.driver_name) {
Ok(sample_rate) => {
Format{channels: format.channels,
sample_rate: SampleRate(sample_rate.rate),
data_type: format.data_type}
},
Err(e) => {
println!("Error retrieving sample rate: {}", e);
format
},
};
let format = match sys::get_data_type(&self.driver_name) {
Ok(data_type) => {
let data_type = match data_type{ let data_type = match data_type{
sys::AsioSampleType::ASIOSTInt16MSB => SampleFormat::I16, Ok(sys::AsioSampleType::ASIOSTInt16MSB) => Ok(SampleFormat::I16),
sys::AsioSampleType::ASIOSTFloat32MSB => SampleFormat::F32, Ok(sys::AsioSampleType::ASIOSTFloat32MSB) => Ok(SampleFormat::F32),
sys::AsioSampleType::ASIOSTInt16LSB => SampleFormat::I16, Ok(sys::AsioSampleType::ASIOSTInt16LSB) => Ok(SampleFormat::I16),
// TODO This should not be set to 16bit but is for testing // TODO This should not be set to 16bit but is for testing
sys::AsioSampleType::ASIOSTInt32LSB => SampleFormat::I16, Ok(sys::AsioSampleType::ASIOSTInt32LSB) => Ok(SampleFormat::I16),
sys::AsioSampleType::ASIOSTFloat32LSB => SampleFormat::F32, Ok(sys::AsioSampleType::ASIOSTFloat32LSB) => Ok(SampleFormat::F32),
_ => panic!("Unsupported Audio Type: {:?}", data_type), _ => Err(DefaultFormatError::StreamTypeNotSupported),
}; };
Format{channels: format.channels, let format = match (num_channels, sample_rate, data_type){
sample_rate: format.sample_rate, (Ok(num_channels), Ok(sample_rate), Ok(data_type)) =>{
data_type: data_type} Ok(Format{channels: num_channels,
}, sample_rate: sample_rate,
Err(e) => { data_type: data_type})
println!("Error retrieving sample rate: {}", e); }
format _ => Err(DefaultFormatError::StreamTypeNotSupported),
},
}; };
Ok(format) format
} }
} }

View File

@ -13,10 +13,11 @@ use UnknownTypeInputBuffer;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::mem; use std::mem;
use self::itertools::Itertools; use self::itertools::Itertools;
use std::sync::atomic::{AtomicUsize, Ordering};
pub struct EventLoop { pub struct EventLoop {
asio_stream: Arc<Mutex<Option<sys::AsioStream>>>, asio_stream: Arc<Mutex<Option<sys::AsioStream>>>,
stream_count: Cell<usize>, stream_count: Arc<AtomicUsize>,
callbacks: Arc<Mutex<Vec<&'static mut (FnMut(StreamId, StreamData) + Send)>>>, callbacks: Arc<Mutex<Vec<&'static mut (FnMut(StreamId, StreamData) + Send)>>>,
} }
@ -34,7 +35,7 @@ impl EventLoop {
pub fn new() -> EventLoop { pub fn new() -> EventLoop {
EventLoop { EventLoop {
asio_stream: Arc::new(Mutex::new(None)), asio_stream: Arc::new(Mutex::new(None)),
stream_count: Cell::new(0), stream_count: Arc::new(AtomicUsize::new(0)),
callbacks: Arc::new(Mutex::new(Vec::new())), callbacks: Arc::new(Mutex::new(Vec::new())),
} }
} }
@ -50,8 +51,8 @@ impl EventLoop {
{ {
*self.asio_stream.lock().unwrap() = Some(stream); *self.asio_stream.lock().unwrap() = Some(stream);
} }
let count = self.stream_count.get(); let count = self.stream_count.load(Ordering::SeqCst);
self.stream_count.set(count + 1); self.stream_count.store(count + 1, Ordering::SeqCst);
let asio_stream = self.asio_stream.clone(); let asio_stream = self.asio_stream.clone();
let callbacks = self.callbacks.clone(); let callbacks = self.callbacks.clone();
let bytes_per_channel = format.data_type.sample_size(); let bytes_per_channel = format.data_type.sample_size();
@ -95,9 +96,9 @@ impl EventLoop {
// Also need to check for Endian // Also need to check for Endian
for (i, channel) in channels.iter_mut().enumerate(){ for (i, channel) in channels.iter_mut().enumerate(){
let buff_ptr = (asio_stream let buff_ptr = asio_stream
.buffer_infos[i] .buffer_infos[i]
.buffers[index as usize] as *mut $AsioType); .buffers[index as usize] as *mut $AsioType;
//.offset(asio_stream.buffer_size as isize * i as isize); //.offset(asio_stream.buffer_size as isize * i as isize);
let asio_buffer: &'static [$AsioType] = let asio_buffer: &'static [$AsioType] =
std::slice::from_raw_parts( std::slice::from_raw_parts(
@ -171,8 +172,8 @@ pub fn build_output_stream(
{ {
*self.asio_stream.lock().unwrap() = Some(stream); *self.asio_stream.lock().unwrap() = Some(stream);
} }
let count = self.stream_count.get(); let count = self.stream_count.load(Ordering::SeqCst);
self.stream_count.set(count + 1); self.stream_count.store(count + 1, Ordering::SeqCst);
let asio_stream = self.asio_stream.clone(); let asio_stream = self.asio_stream.clone();
let callbacks = self.callbacks.clone(); let callbacks = self.callbacks.clone();
let bytes_per_channel = format.data_type.sample_size(); let bytes_per_channel = format.data_type.sample_size();