use std;
use capi;
use std::os::raw::c_void;
use time::{Timeval, MicroSeconds};
pub use capi::PA_INVALID_INDEX as INVALID_INDEX;
pub use capi::pa_device_type_t as Device;
pub use capi::pa_port_available_t as PortAvailable;
pub type FreeCb = extern "C" fn(p: *mut c_void);
pub type RetvalActual = i32;
#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct Retval(pub RetvalActual);
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq)]
pub struct BufferAttr {
pub maxlength: u32,
pub tlength: u32,
pub prebuf: u32,
pub minreq: u32,
pub fragsize: u32,
}
#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct TimingInfo {
pub timestamp: Timeval,
pub synchronized_clocks: i32,
pub sink_usec: MicroSeconds,
pub source_usec: MicroSeconds,
pub transport_usec: MicroSeconds,
pub playing: i32,
pub write_index_corrupt: i32,
pub write_index: i64,
pub read_index_corrupt: i32,
pub read_index: i64,
pub configured_sink_usec: MicroSeconds,
pub configured_source_usec: MicroSeconds,
pub since_underrun: i64,
}
#[repr(C)]
#[derive(Debug)]
pub struct SpawnApi {
pub prefork: Option<extern "C" fn()>,
pub postfork: Option<extern "C" fn()>,
pub atfork: Option<extern "C" fn()>,
}
pub type SinkFlagSet = capi::def::pa_sink_flags_t;
pub mod sink_flags {
use capi;
use super::SinkFlagSet;
pub const NOFLAGS: SinkFlagSet = capi::PA_SINK_NOFLAGS;
pub const HW_VOLUME_CTRL: SinkFlagSet = capi::PA_SINK_HW_VOLUME_CTRL;
pub const LATENCY: SinkFlagSet = capi::PA_SINK_LATENCY;
pub const HARDWARE: SinkFlagSet = capi::PA_SINK_HARDWARE;
pub const NETWORK: SinkFlagSet = capi::PA_SINK_NETWORK;
pub const HW_MUTE_CTRL: SinkFlagSet = capi::PA_SINK_HW_MUTE_CTRL;
pub const DECIBEL_VOLUME: SinkFlagSet = capi::PA_SINK_DECIBEL_VOLUME;
pub const FLAT_VOLUME: SinkFlagSet = capi::PA_SINK_FLAT_VOLUME;
pub const DYNAMIC_LATENCY: SinkFlagSet = capi::PA_SINK_DYNAMIC_LATENCY;
pub const SET_FORMATS: SinkFlagSet = capi::PA_SINK_SET_FORMATS;
}
#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum SinkState {
Invalid = -1,
Running = 0,
Idle = 1,
Suspended = 2,
}
impl From<SinkState> for capi::pa_sink_state_t {
fn from(s: SinkState) -> Self {
unsafe { std::mem::transmute(s) }
}
}
impl From<capi::pa_sink_state_t> for SinkState {
fn from(s: capi::pa_sink_state_t) -> Self {
unsafe { std::mem::transmute(s) }
}
}
impl SinkState {
pub fn is_opened(self) -> bool {
self == SinkState::Running ||
self == SinkState::Idle
}
pub fn is_running(self) -> bool {
self == SinkState::Running
}
}
pub type SourceFlagSet = capi::def::pa_source_flags_t;
pub mod source_flags {
use capi;
use super::SourceFlagSet;
pub const NOFLAGS: SourceFlagSet = capi::PA_SOURCE_NOFLAGS;
pub const HW_VOLUME_CTRL: SourceFlagSet = capi::PA_SOURCE_HW_VOLUME_CTRL;
pub const LATENCY: SourceFlagSet = capi::PA_SOURCE_LATENCY;
pub const HARDWARE: SourceFlagSet = capi::PA_SOURCE_HARDWARE;
pub const NETWORK: SourceFlagSet = capi::PA_SOURCE_NETWORK;
pub const HW_MUTE_CTRL: SourceFlagSet = capi::PA_SOURCE_HW_MUTE_CTRL;
pub const DECIBEL_VOLUME: SourceFlagSet = capi::PA_SOURCE_DECIBEL_VOLUME;
pub const DYNAMIC_LATENCY: SourceFlagSet = capi::PA_SOURCE_DYNAMIC_LATENCY;
pub const FLAT_VOLUME: SourceFlagSet = capi::PA_SOURCE_FLAT_VOLUME;
}
#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum SourceState {
Invalid = -1,
Running = 0,
Idle = 1,
Suspended = 2,
}
impl From<SourceState> for capi::pa_source_state_t {
fn from(s: SourceState) -> Self {
unsafe { std::mem::transmute(s) }
}
}
impl From<capi::pa_source_state_t> for SourceState {
fn from(s: capi::pa_source_state_t) -> Self {
unsafe { std::mem::transmute(s) }
}
}
impl SourceState {
pub fn is_opened(self) -> bool {
self == SourceState::Running ||
self == SourceState::Idle
}
pub fn is_running(self) -> bool {
self == SourceState::Running
}
}