#![allow(dead_code)]
use std::ptr;
use std::mem::{transmute};
use ffi;
pub type DeviceIndex = i32;
pub const PA_NO_DEVICE: DeviceIndex = -1;
pub const PA_USE_HOST_API_SPECIFIC_DEVICE_SPECIFICATION: DeviceIndex = -2;
pub type HostApiIndex = i32;
pub type Time = f64;
pub type Frames = i64;
#[repr(u64)]
#[derive(Copy, Clone, PartialEq, PartialOrd, Debug)]
pub enum SampleFormat {
Float32 = ffi::PA_FLOAT_32,
Int32 = ffi::PA_INT_32,
Int16 = ffi::PA_INT_16,
Int8 = ffi::PA_INT_8,
UInt8 = ffi::PA_UINT_8,
CustomFormat = ffi::PA_CUSTOM_FORMAT,
NonInterleaved = ffi::PA_NON_INTERLEAVED
}
#[repr(u64)]
#[derive(Copy, Clone, PartialEq, PartialOrd, Debug)]
pub enum StreamFlags {
NoFlag = ffi::PA_NO_FLAG,
ClipOff = ffi::PA_CLIP_OFF,
DitherOff = ffi::PA_DITHER_OFF,
NeverDropInput = ffi::PA_NEVER_DROP_INPUT,
PrimeOutputBuffersUsingStreamCallback = ffi::PA_PRIME_OUTPUT_BUFFERS_USING_STREAM_CALLBACK,
PlatformSpecificFlags = ffi::PA_PLATFORM_SPECIFIC_FLAGS
}
#[doc(hidden)]
pub type StreamCallbackFlags = u64;
#[doc(hidden)]
pub type CallbackFunction = extern fn(i : f32) -> StreamCallbackResult;
#[doc(hidden)]
#[derive(Copy)]
#[repr(C)]
pub enum StreamCallbackResult {
Continue = 0,
Complete = 1,
Abort = 2
}
#[repr(i32)]
#[derive(Copy, Clone, PartialEq, PartialOrd, Debug)]
pub enum HostApiTypeId {
InDevelopment = ffi::PA_IN_DEVELOPMENT,
DirectSound = ffi::PA_DIRECT_SOUND,
MME = ffi::PA_MME,
ASIO = ffi::PA_ASIO,
SoundManager = ffi::PA_SOUND_MANAGER,
CoreAudio = ffi::PA_CORE_AUDIO,
OSS = ffi::PA_OSS,
ALSA = ffi::PA_ALSA,
AL = ffi::PA_AL,
BeOS = ffi::PA_BE_OS,
WDMKS = ffi::PA_WDMKS,
JACK = ffi::PA_JACK,
WASAPI = ffi::PA_WASAPI,
AudioScienceHPI = ffi::PA_AUDIO_SCIENCE_HPI
}
pub struct HostApiInfo{
pub struct_version : i32,
pub host_type : HostApiTypeId,
pub name : String,
pub device_count : i32,
pub default_input_device : DeviceIndex,
pub default_output_device : DeviceIndex
}
#[doc(hidden)]
impl HostApiInfo {
pub fn wrap(c_info : *const ffi::C_PaHostApiInfo) -> HostApiInfo {
unsafe {
HostApiInfo {
struct_version : (*c_info).struct_version,
host_type : transmute(((*c_info).host_type)),
name : ffi::c_str_to_string(&(*c_info).name),
device_count : (*c_info).device_count,
default_input_device : (*c_info).default_input_device,
default_output_device : (*c_info).default_output_device
}
}
}
pub fn unwrap(&self) -> ffi::C_PaHostApiInfo {
ffi::C_PaHostApiInfo {
struct_version : self.struct_version as i32,
host_type : self.host_type as i32,
name : ffi::string_to_c_str(&self.name),
device_count : self.device_count as i32,
default_input_device : self.default_input_device as i32,
default_output_device : self.default_output_device as i32
}
}
}
#[derive(Clone, PartialEq, PartialOrd, Debug)]
pub struct HostErrorInfo {
pub error_code : u32,
pub error_text : String
}
#[doc(hidden)]
impl HostErrorInfo {
pub fn wrap(c_error : *const ffi::C_PaHostErrorInfo) -> HostErrorInfo {
HostErrorInfo {
error_code : unsafe { (*c_error).error_code },
error_text : unsafe { ffi::c_str_to_string(&(*c_error).error_text) }
}
}
pub fn unwrap(&self) -> ffi::C_PaHostErrorInfo {
ffi::C_PaHostErrorInfo {
error_code : self.error_code,
error_text : ffi::string_to_c_str(&self.error_text)
}
}
}
#[derive(Clone, PartialEq, PartialOrd, Debug)]
pub struct DeviceInfo {
pub struct_version : i32,
pub name : String,
pub host_api : HostApiIndex,
pub max_input_channels : i32,
pub max_output_channels : i32,
pub default_low_input_latency : Time,
pub default_low_output_latency : Time,
pub default_high_input_latency : Time,
pub default_high_output_latency : Time,
pub default_sample_rate : f64
}
#[doc(hidden)]
impl DeviceInfo {
pub fn wrap(c_info : *const ffi::C_PaDeviceInfo) -> DeviceInfo {
unsafe {
DeviceInfo {
struct_version : (*c_info).struct_version,
name : ffi::c_str_to_string(&(*c_info).name),
host_api : (*c_info).host_api,
max_input_channels : (*c_info).max_input_channels,
max_output_channels : (*c_info).max_output_channels,
default_low_input_latency : (*c_info).default_low_input_latency,
default_low_output_latency : (*c_info).default_low_output_latency,
default_high_input_latency : (*c_info).default_high_input_latency,
default_high_output_latency : (*c_info).default_high_output_latency,
default_sample_rate : (*c_info).default_sample_rate
}
}
}
pub fn unwrap(&self) -> ffi::C_PaDeviceInfo {
ffi::C_PaDeviceInfo {
struct_version : self.struct_version as i32,
name : ffi::string_to_c_str(&self.name),
host_api : self.host_api,
max_input_channels : self.max_input_channels as i32,
max_output_channels : self.max_output_channels as i32,
default_low_input_latency : self.default_low_input_latency,
default_low_output_latency : self.default_low_output_latency,
default_high_input_latency : self.default_high_input_latency,
default_high_output_latency : self.default_high_output_latency,
default_sample_rate : self.default_sample_rate
}
}
}
#[derive(Copy, Clone, PartialEq, PartialOrd, Debug)]
pub struct StreamParameters {
pub device : DeviceIndex,
pub channel_count : i32,
pub sample_format : SampleFormat,
pub suggested_latency : Time,
}
#[doc(hidden)]
impl StreamParameters {
pub fn wrap(c_parameters : *mut ffi::C_PaStreamParameters) -> StreamParameters {
unsafe {
StreamParameters {
device : (*c_parameters).device,
channel_count : (*c_parameters).channel_count,
sample_format : transmute((*c_parameters).sample_format),
suggested_latency : (*c_parameters).suggested_latency
}
}
}
pub fn unwrap(&self) -> ffi::C_PaStreamParameters {
ffi::C_PaStreamParameters {
device : self.device,
channel_count : self.channel_count as i32,
sample_format : self.sample_format as ffi::SampleFormat,
suggested_latency : self.suggested_latency,
host_api_specific_stream_info : ptr::null_mut()
}
}
}
#[doc(hidden)]
#[derive(Copy)]
#[repr(C)]
pub struct StreamCallbackTimeInfo {
pub input_buffer_adc_time : Time,
pub current_time : Time,
pub output_buffer_dac_time : Time
}
#[derive(Copy, Clone, PartialEq, PartialOrd, Debug)]
#[repr(C)]
pub struct StreamInfo {
pub struct_version : i32,
pub input_latency : Time,
pub output_latency : Time,
pub sample_rate : f64
}