use capi;
use std::os::raw::c_void;
use super::{ContextInternal, Context, ContextSuccessCb};
use ::util::unwrap_optional_callback;
pub use capi::context::subscribe::pa_subscription_event_type_t as EventType;
pub use capi::PA_SUBSCRIPTION_EVENT_FACILITY_MASK as FACILITY_MASK;
pub use capi::PA_SUBSCRIPTION_EVENT_TYPE_MASK as OPERATION_MASK;
pub type InterestMaskSet = capi::context::subscribe::pa_subscription_mask_t;
pub mod subscription_masks {
use capi;
use super::InterestMaskSet;
pub const NULL: InterestMaskSet = capi::PA_SUBSCRIPTION_MASK_NULL;
pub const SINK: InterestMaskSet = capi::PA_SUBSCRIPTION_MASK_SINK;
pub const SOURCE: InterestMaskSet = capi::PA_SUBSCRIPTION_MASK_SOURCE;
pub const SINK_INPUT: InterestMaskSet = capi::PA_SUBSCRIPTION_MASK_SINK_INPUT;
pub const SOURCE_OUTPUT: InterestMaskSet = capi::PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT;
pub const MODULE: InterestMaskSet = capi::PA_SUBSCRIPTION_MASK_MODULE;
pub const CLIENT: InterestMaskSet = capi::PA_SUBSCRIPTION_MASK_CLIENT;
pub const SAMPLE_CACHE: InterestMaskSet = capi::PA_SUBSCRIPTION_MASK_SAMPLE_CACHE;
pub const SERVER: InterestMaskSet = capi::PA_SUBSCRIPTION_MASK_SERVER;
pub const AUTOLOAD: InterestMaskSet = capi::PA_SUBSCRIPTION_MASK_AUTOLOAD;
pub const MASK_CARD: InterestMaskSet = capi::PA_SUBSCRIPTION_MASK_CARD;
pub const ALL: InterestMaskSet = capi::PA_SUBSCRIPTION_MASK_ALL;
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Facility {
Sink = 0,
Source = 1,
SinkInput = 2,
SourceOutput = 3,
Module = 4,
Client = 5,
SampleCache = 6,
Server = 7,
#[deprecated]
AutoLoad = 8,
Card = 9,
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Operation {
New = 0,
Changed = 0x10,
Removed = 0x20,
}
impl Facility {
pub fn from_int(value: u32) -> Option<Facility> {
match value {
0 => Some(Facility::Sink),
1 => Some(Facility::Source),
2 => Some(Facility::SinkInput),
3 => Some(Facility::SourceOutput),
4 => Some(Facility::Module),
5 => Some(Facility::Client),
6 => Some(Facility::SampleCache),
7 => Some(Facility::Server),
8 => {
#[allow(deprecated)]
Some(Facility::AutoLoad)
},
9 => Some(Facility::Card),
_ => None,
}
}
}
impl Operation {
pub fn from_int(value: u32) -> Option<Operation> {
match value {
0 => Some(Operation::New),
0x10 => Some(Operation::Changed),
0x20 => Some(Operation::Removed),
_ => None,
}
}
}
pub fn facility_to_mask(f: Facility) -> InterestMaskSet {
1u32 << (f as u32)
}
pub fn make_eventtype(f: Facility, o: Operation) -> EventType {
(f as EventType) | (o as EventType)
}
pub fn get_facility(value: EventType) -> Option<Facility> {
Facility::from_int((value & FACILITY_MASK) as u32)
}
pub fn get_operation(value: EventType) -> Option<Operation> {
Operation::from_int((value & OPERATION_MASK) as u32)
}
pub type Callback = extern "C" fn(c: *mut ContextInternal, t: EventType,
idx: u32, userdata: *mut c_void);
impl Context {
pub fn subscribe(&self, mask: InterestMaskSet,
cb: (ContextSuccessCb, *mut c_void)) -> Option<::operation::Operation>
{
let ptr = unsafe { capi::pa_context_subscribe(self.ptr, mask, Some(cb.0), cb.1) };
if ptr.is_null() {
return None;
}
Some(::operation::Operation::from_raw(ptr))
}
pub fn set_subscribe_callback(&self, cb: Option<(Callback, *mut c_void)>) {
let (cb_f, cb_d) = unwrap_optional_callback::<Callback>(cb);
unsafe { capi::pa_context_set_subscribe_callback(self.ptr, cb_f, cb_d); }
}
}