use std::libc::{c_double, c_char};
use std::str;
use std::ptr;
use types::*;
use ffi;
use pa::*;
pub trait Asio {
fn set_stream_sample_rate(&self, sampleRate : f64) -> Error;
}
impl<I, O> Asio for Stream<I, O> {
fn set_stream_sample_rate(&self, sample_rate : f64) -> PaError {
unsafe {
ffi::PaAsio_SetStreamSampleRate(self.get_c_pa_stream(), sample_rate as c_double)
}
}
}
pub fn get_available_buffer_sizes(device : PaDeviceIndex) -> Result<(i32, i32, i32, i32), PaError> {
let min_buffer_size_frames : i32 = 0;
let max_buffer_size_frames : i32 = 0;
let preferred_buffer_size_frames : i32 = 0;
let granularity : i32 = 0;
let mut error : PaError;
unsafe {
error = ffi::PaAsio_GetAvailableBufferSizes(device, &min_buffer_size_frames, &max_buffer_size_frames, &preferred_buffer_size_frames, &granularity);
}
match error {
PaNoError => Ok((min_buffer_size_frames, max_buffer_size_frames, preferred_buffer_size_frames, granularity)),
_ => Err(error)
}
}
pub fn get_input_channel_name(device : PaDeviceIndex, channel_index : i32) -> Result<String, PaError> {
let c_string : *const c_char = ptr::null();
let err = unsafe {
ffi::PaAsio_GetInputChannelName(device, channel_index, &mut c_string)
};
match err {
PaNoError => Ok(unsafe { str::raw::from_c_str(c_string) } ),
_ => Err(err)
}
}
pub fn get_output_channel_name(device : PaDeviceIndex, channel_index : i32) -> Result<String, PaError> {
let c_string : *const c_char = ptr::null();
let err = unsafe {
ffi::PaAsio_GetOutputChannelName(device, channel_index, &mut c_string)
};
match err {
PaNoError => Ok(unsafe { str::raw::from_c_str(c_string) } ),
_ => Err(err)
}
}