use std;
use capi;
use std::os::raw::c_void;
use std::ffi::{CStr, CString};
use std::borrow::Cow;
use std::ptr::null_mut;
use super::{Context, ContextInternal};
use time::MicroSeconds;
use callbacks::{ListResult, box_closure_get_capi_ptr, callback_for_list_instance, ListInstanceCallback};
use operation::Operation;
use capi::pa_sink_port_info as SinkPortInfoInternal;
use capi::pa_sink_info as SinkInfoInternal;
use capi::pa_source_port_info as SourcePortInfoInternal;
use capi::pa_source_info as SourceInfoInternal;
use capi::pa_server_info as ServerInfoInternal;
use capi::pa_module_info as ModuleInfoInternal;
use capi::pa_client_info as ClientInfoInternal;
use capi::pa_card_profile_info2 as CardProfileInfo2Internal;
use capi::pa_card_port_info as CardPortInfoInternal;
use capi::pa_card_info as CardInfoInternal;
use capi::pa_sink_input_info as SinkInputInfoInternal;
use capi::pa_source_output_info as SourceOutputInfoInternal;
use capi::pa_sample_info as SampleInfoInternal;
pub use capi::pa_stat_info as StatInfo;
pub struct Introspector {
context: *mut super::ContextInternal,
}
unsafe impl Send for Introspector {}
unsafe impl Sync for Introspector {}
impl Context {
pub fn introspect(&self) -> Introspector {
unsafe { capi::pa_context_ref(self.ptr) };
Introspector::from_raw(self.ptr)
}
}
impl Introspector {
fn from_raw(context: *mut ContextInternal) -> Self {
Self { context: context }
}
}
impl Drop for Introspector {
fn drop(&mut self) {
unsafe { capi::pa_context_unref(self.context) };
self.context = null_mut::<super::ContextInternal>();
}
}
#[repr(C)]
#[derive(Debug)]
pub struct SinkPortInfo<'a> {
pub name: Option<Cow<'a, str>>,
pub description: Option<Cow<'a, str>>,
pub priority: u32,
pub available: ::def::PortAvailable,
}
impl<'a> SinkPortInfo<'a> {
fn new_from_raw(p: *const SinkPortInfoInternal) -> Self {
assert!(!p.is_null());
let src = unsafe { p.as_ref().unwrap() };
unsafe {
SinkPortInfo {
name: match src.name.is_null() {
false => Some(CStr::from_ptr(src.name).to_string_lossy()),
true => None,
},
description: match src.description.is_null() {
false => Some(CStr::from_ptr(src.description).to_string_lossy()),
true => None,
},
priority: src.priority,
available: std::mem::transmute(src.available),
}
}
}
}
#[derive(Debug)]
pub struct SinkInfo<'a> {
pub name: Option<Cow<'a, str>>,
pub index: u32,
pub description: Option<Cow<'a, str>>,
pub sample_spec: ::sample::Spec,
pub channel_map: ::channelmap::Map,
pub owner_module: Option<u32>,
pub volume: ::volume::ChannelVolumes,
pub mute: bool,
pub monitor_source: u32,
pub monitor_source_name: Option<Cow<'a, str>>,
pub latency: MicroSeconds,
pub driver: Option<Cow<'a, str>>,
pub flags: ::def::SinkFlagSet,
pub proplist: ::proplist::Proplist,
pub configured_latency: MicroSeconds,
pub base_volume: ::volume::Volume,
pub state: ::def::SinkState,
pub n_volume_steps: u32,
pub card: Option<u32>,
pub ports: Vec<SinkPortInfo<'a>>,
pub active_port: Option<Box<SinkPortInfo<'a>>>,
pub formats: Vec<::format::Info>,
}
impl<'a> SinkInfo<'a> {
fn new_from_raw(p: *const SinkInfoInternal) -> Self {
assert!(!p.is_null());
let src = unsafe { p.as_ref().unwrap() };
let mut port_vec = Vec::with_capacity(src.n_ports as usize);
assert!(src.n_ports == 0 || !src.ports.is_null());
for i in 0..src.n_ports as isize {
let indexed_ptr = unsafe { (*src.ports.offset(i)) as *mut SinkPortInfoInternal };
if !indexed_ptr.is_null() {
port_vec.push(SinkPortInfo::new_from_raw(indexed_ptr));
}
}
let mut formats_vec = Vec::with_capacity(src.n_formats as usize);
assert!(src.n_formats == 0 || !src.formats.is_null());
for i in 0..src.n_formats as isize {
let indexed_ptr = unsafe { (*src.formats.offset(i)) as *mut ::format::InfoInternal };
if !indexed_ptr.is_null() {
formats_vec.push(::format::Info::from_raw_weak(indexed_ptr));
}
}
unsafe {
SinkInfo {
name: match src.name.is_null() {
false => Some(CStr::from_ptr(src.name).to_string_lossy()),
true => None,
},
index: src.index,
description: match src.description.is_null() {
false => Some(CStr::from_ptr(src.description).to_string_lossy()),
true => None,
},
sample_spec: std::mem::transmute(src.sample_spec),
channel_map: std::mem::transmute(src.channel_map),
owner_module: match src.owner_module {
::def::INVALID_INDEX => None,
i => Some(i),
},
volume: std::mem::transmute(src.volume),
mute: match src.mute { 0 => false, _ => true },
monitor_source: src.monitor_source,
monitor_source_name: match src.monitor_source_name.is_null() {
false => Some(CStr::from_ptr(src.monitor_source_name).to_string_lossy()),
true => None,
},
latency: MicroSeconds(src.latency),
driver: match src.driver.is_null() {
false => Some(CStr::from_ptr(src.driver).to_string_lossy()),
true => None,
},
flags: src.flags,
proplist: ::proplist::Proplist::from_raw_weak(src.proplist),
configured_latency: MicroSeconds(src.configured_latency),
base_volume: ::volume::Volume(src.base_volume),
state: std::mem::transmute(src.state),
n_volume_steps: src.n_volume_steps,
card: match src.card {
::def::INVALID_INDEX => None,
i => Some(i),
},
ports: port_vec,
active_port: match src.active_port.is_null() {
true => None,
false => Some(Box::new(SinkPortInfo::new_from_raw(src.active_port))),
},
formats: formats_vec,
}
}
}
}
impl Introspector {
pub fn get_sink_info_by_name<F>(&self, name: &str, callback: F)
-> Operation<dyn FnMut(ListResult<&SinkInfo>)>
where F: FnMut(ListResult<&SinkInfo>) + 'static
{
let c_name = CString::new(name.clone()).unwrap();
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&SinkInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_sink_info_by_name(self.context, c_name.as_ptr(),
Some(get_sink_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&SinkInfo>)>)
}
pub fn get_sink_info_by_index<F>(&self, index: u32, callback: F)
-> Operation<dyn FnMut(ListResult<&SinkInfo>)>
where F: FnMut(ListResult<&SinkInfo>) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&SinkInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_sink_info_by_index(self.context, index,
Some(get_sink_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&SinkInfo>)>)
}
pub fn get_sink_info_list<F>(&self, callback: F) -> Operation<dyn FnMut(ListResult<&SinkInfo>)>
where F: FnMut(ListResult<&SinkInfo>) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&SinkInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_sink_info_list(self.context,
Some(get_sink_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&SinkInfo>)>)
}
pub fn set_sink_volume_by_index(&mut self, index: u32, volume: &::volume::ChannelVolumes,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_sink_volume_by_index(self.context, index,
std::mem::transmute(volume), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_sink_volume_by_name(&mut self, name: &str, volume: &::volume::ChannelVolumes,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_name = CString::new(name.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_sink_volume_by_name(self.context, c_name.as_ptr(),
std::mem::transmute(volume), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_sink_mute_by_index(&mut self, index: u32, mute: bool,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_sink_mute_by_index(self.context, index, mute as i32,
cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_sink_mute_by_name(&mut self, name: &str, mute: bool,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_name = CString::new(name.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_sink_mute_by_name(self.context, c_name.as_ptr(),
mute as i32, cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn suspend_sink_by_name(&mut self, sink_name: &str, suspend: bool,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_name = CString::new(sink_name.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_suspend_sink_by_name(self.context, c_name.as_ptr(),
suspend as i32, cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn suspend_sink_by_index(&mut self, index: u32, suspend: bool,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_suspend_sink_by_index(self.context, index,
suspend as i32, cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_sink_port_by_index(&mut self, index: u32, port: &str,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_port = CString::new(port.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_sink_port_by_index(self.context, index,
c_port.as_ptr(), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_sink_port_by_name(&mut self, name: &str, port: &str,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_name = CString::new(name.clone()).unwrap();
let c_port = CString::new(port.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_sink_port_by_name(self.context, c_name.as_ptr(),
c_port.as_ptr(), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
}
extern "C"
fn get_sink_info_list_cb_proxy(_: *mut ContextInternal, i: *const SinkInfoInternal, eol: i32,
userdata: *mut c_void)
{
let _ = std::panic::catch_unwind(|| {
match callback_for_list_instance::<dyn FnMut(ListResult<&SinkInfo>)>(eol, userdata) {
ListInstanceCallback::Entry(callback) => {
assert!(!i.is_null());
let obj = SinkInfo::new_from_raw(i);
(callback)(ListResult::Item(&obj));
},
ListInstanceCallback::End(mut callback) => { (callback)(ListResult::End); },
ListInstanceCallback::Error(mut callback) => { (callback)(ListResult::Error); },
}
});
}
#[derive(Debug)]
pub struct SourcePortInfo<'a> {
pub name: Option<Cow<'a, str>>,
pub description: Option<Cow<'a, str>>,
pub priority: u32,
pub available: ::def::PortAvailable,
}
impl<'a> SourcePortInfo<'a> {
fn new_from_raw(p: *const SourcePortInfoInternal) -> Self {
assert!(!p.is_null());
let src = unsafe { p.as_ref().unwrap() };
unsafe {
SourcePortInfo {
name: match src.name.is_null() {
false => Some(CStr::from_ptr(src.name).to_string_lossy()),
true => None,
},
description: match src.description.is_null() {
false=> Some(CStr::from_ptr(src.description).to_string_lossy()),
true => None,
},
priority: src.priority,
available: std::mem::transmute(src.available),
}
}
}
}
#[derive(Debug)]
pub struct SourceInfo<'a> {
pub name: Option<Cow<'a, str>>,
pub index: u32,
pub description: Option<Cow<'a, str>>,
pub sample_spec: ::sample::Spec,
pub channel_map: ::channelmap::Map,
pub owner_module: Option<u32>,
pub volume: ::volume::ChannelVolumes,
pub mute: bool,
pub monitor_of_sink: Option<u32>,
pub monitor_of_sink_name: Option<Cow<'a, str>>,
pub latency: MicroSeconds,
pub driver: Option<Cow<'a, str>>,
pub flags: ::def::SourceFlagSet,
pub proplist: ::proplist::Proplist,
pub configured_latency: MicroSeconds,
pub base_volume: ::volume::Volume,
pub state: ::def::SourceState,
pub n_volume_steps: u32,
pub card: Option<u32>,
pub ports: Vec<SourcePortInfo<'a>>,
pub active_port: Option<Box<SourcePortInfo<'a>>>,
pub formats: Vec<::format::Info>,
}
impl<'a> SourceInfo<'a> {
fn new_from_raw(p: *const SourceInfoInternal) -> Self {
assert!(!p.is_null());
let src = unsafe { p.as_ref().unwrap() };
let mut port_vec = Vec::with_capacity(src.n_ports as usize);
assert!(src.n_ports == 0 || !src.ports.is_null());
for i in 0..src.n_ports as isize {
let indexed_ptr = unsafe { (*src.ports.offset(i)) as *mut SourcePortInfoInternal };
if !indexed_ptr.is_null() {
port_vec.push(SourcePortInfo::new_from_raw(indexed_ptr));
}
}
let mut formats_vec = Vec::with_capacity(src.n_formats as usize);
assert!(src.n_formats == 0 || !src.formats.is_null());
for i in 0..src.n_formats as isize {
let indexed_ptr = unsafe { (*src.formats.offset(i)) as *mut ::format::InfoInternal };
if !indexed_ptr.is_null() {
formats_vec.push(::format::Info::from_raw_weak(indexed_ptr));
}
}
unsafe {
SourceInfo {
name: match src.name.is_null() {
false => Some(CStr::from_ptr(src.name).to_string_lossy()),
true => None,
},
index: src.index,
description: match src.description.is_null() {
false => Some(CStr::from_ptr(src.description).to_string_lossy()),
true => None,
},
sample_spec: std::mem::transmute(src.sample_spec),
channel_map: std::mem::transmute(src.channel_map),
owner_module: match src.owner_module {
::def::INVALID_INDEX => None,
i => Some(i),
},
volume: std::mem::transmute(src.volume),
mute: match src.mute { 0 => false, _ => true },
monitor_of_sink: match src.monitor_of_sink {
::def::INVALID_INDEX => None,
i => Some(i),
},
monitor_of_sink_name: match src.monitor_of_sink_name.is_null() {
false => Some(CStr::from_ptr(src.monitor_of_sink_name).to_string_lossy()),
true => None,
},
latency: MicroSeconds(src.latency),
driver: match src.driver.is_null() {
false => Some(CStr::from_ptr(src.driver).to_string_lossy()),
true => None,
},
flags: src.flags,
proplist: ::proplist::Proplist::from_raw_weak(src.proplist),
configured_latency: MicroSeconds(src.configured_latency),
base_volume: ::volume::Volume(src.base_volume),
state: src.state.into(),
n_volume_steps: src.n_volume_steps,
card: match src.card {
::def::INVALID_INDEX => None,
i => Some(i),
},
ports: port_vec,
active_port: match src.active_port.is_null() {
true => None,
false => Some(Box::new(SourcePortInfo::new_from_raw(src.active_port))),
},
formats: formats_vec,
}
}
}
}
impl Introspector {
pub fn get_source_info_by_name<F>(&self, name: &str, callback: F)
-> Operation<dyn FnMut(ListResult<&SourceInfo>)>
where F: FnMut(ListResult<&SourceInfo>) + 'static
{
let c_name = CString::new(name.clone()).unwrap();
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&SourceInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_source_info_by_name(self.context, c_name.as_ptr(),
Some(get_source_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&SourceInfo>)>)
}
pub fn get_source_info_by_index<F>(&self, index: u32, callback: F)
-> Operation<dyn FnMut(ListResult<&SourceInfo>)>
where F: FnMut(ListResult<&SourceInfo>) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&SourceInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_source_info_by_index(self.context, index,
Some(get_source_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&SourceInfo>)>)
}
pub fn get_source_info_list<F>(&self, callback: F)
-> Operation<dyn FnMut(ListResult<&SourceInfo>)>
where F: FnMut(ListResult<&SourceInfo>) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&SourceInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_source_info_list(self.context,
Some(get_source_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&SourceInfo>)>)
}
pub fn set_source_volume_by_index(&mut self, index: u32, volume: &::volume::ChannelVolumes,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_source_volume_by_index(self.context, index,
std::mem::transmute(volume), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_source_volume_by_name(&mut self, name: &str, volume: &::volume::ChannelVolumes,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_name = CString::new(name.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_source_volume_by_name(self.context, c_name.as_ptr(),
std::mem::transmute(volume), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_source_mute_by_index(&mut self, index: u32, mute: bool,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_source_mute_by_index(self.context, index,
mute as i32, cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_source_mute_by_name(&mut self, name: &str, mute: bool,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_name = CString::new(name.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_source_mute_by_name(self.context, c_name.as_ptr(),
mute as i32, cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn suspend_source_by_name(&mut self, name: &str, suspend: bool,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_name = CString::new(name.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_suspend_source_by_name(self.context, c_name.as_ptr(),
suspend as i32, cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn suspend_source_by_index(&mut self, index: u32, suspend: bool,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_suspend_source_by_index(self.context, index,
suspend as i32, cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_source_port_by_index(&mut self, index: u32, port: &str,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_port = CString::new(port.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_source_port_by_index(self.context, index,
c_port.as_ptr(), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_source_port_by_name(&mut self, name: &str, port: &str,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_name = CString::new(name.clone()).unwrap();
let c_port = CString::new(port.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_source_port_by_name(self.context, c_name.as_ptr(),
c_port.as_ptr(), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
}
extern "C"
fn get_source_info_list_cb_proxy(_: *mut ContextInternal, i: *const SourceInfoInternal, eol: i32,
userdata: *mut c_void)
{
let _ = std::panic::catch_unwind(|| {
match callback_for_list_instance::<dyn FnMut(ListResult<&SourceInfo>)>(eol, userdata) {
ListInstanceCallback::Entry(callback) => {
assert!(!i.is_null());
let obj = SourceInfo::new_from_raw(i);
(callback)(ListResult::Item(&obj));
},
ListInstanceCallback::End(mut callback) => { (callback)(ListResult::End); },
ListInstanceCallback::Error(mut callback) => { (callback)(ListResult::Error); },
}
});
}
#[derive(Debug)]
pub struct ServerInfo<'a> {
pub user_name: Option<Cow<'a, str>>,
pub host_name: Option<Cow<'a, str>>,
pub server_version: Option<Cow<'a, str>>,
pub server_name: Option<Cow<'a, str>>,
pub sample_spec: ::sample::Spec,
pub default_sink_name: Option<Cow<'a, str>>,
pub default_source_name: Option<Cow<'a, str>>,
pub cookie: u32,
pub channel_map: ::channelmap::Map,
}
impl<'a> ServerInfo<'a> {
fn new_from_raw(p: *const ServerInfoInternal) -> Self {
assert!(!p.is_null());
let src = unsafe { p.as_ref().unwrap() };
unsafe {
ServerInfo {
user_name: match src.user_name.is_null() {
false => Some(CStr::from_ptr(src.user_name).to_string_lossy()),
true => None,
},
host_name: match src.host_name.is_null() {
false => Some(CStr::from_ptr(src.host_name).to_string_lossy()),
true => None,
},
server_version: match src.server_version.is_null() {
false => Some(CStr::from_ptr(src.server_version).to_string_lossy()),
true => None,
},
server_name: match src.server_name.is_null() {
false => Some(CStr::from_ptr(src.server_name).to_string_lossy()),
true => None,
},
sample_spec: std::mem::transmute(src.sample_spec),
default_sink_name: match src.default_sink_name.is_null() {
false => Some(CStr::from_ptr(src.default_sink_name).to_string_lossy()),
true => None,
},
default_source_name: match src.default_source_name.is_null() {
false => Some(CStr::from_ptr(src.default_source_name).to_string_lossy()),
true => None,
},
cookie: src.cookie,
channel_map: std::mem::transmute(src.channel_map),
}
}
}
}
impl Introspector {
pub fn get_server_info<F>(&self, callback: F) -> Operation<dyn FnMut(&ServerInfo)>
where F: FnMut(&ServerInfo) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(&ServerInfo)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_server_info(self.context,
Some(get_server_info_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(&ServerInfo)>)
}
}
extern "C"
fn get_server_info_cb_proxy(_: *mut ContextInternal, i: *const ServerInfoInternal,
userdata: *mut c_void)
{
let _ = std::panic::catch_unwind(|| {
assert!(!i.is_null());
let obj = ServerInfo::new_from_raw(i);
let mut callback = ::callbacks::get_su_callback::<dyn FnMut(&ServerInfo)>(userdata);
(callback)(&obj);
});
}
#[derive(Debug)]
pub struct ModuleInfo<'a> {
pub index: u32,
pub name: Option<Cow<'a, str>>,
pub argument: Option<Cow<'a, str>>,
pub n_used: Option<u32>,
pub proplist: ::proplist::Proplist,
}
impl<'a> ModuleInfo<'a> {
fn new_from_raw(p: *const ModuleInfoInternal) -> Self {
assert!(!p.is_null());
let src = unsafe { p.as_ref().unwrap() };
unsafe {
ModuleInfo {
index: src.index,
name: match src.name.is_null() {
false => Some(CStr::from_ptr(src.name).to_string_lossy()),
true => None,
},
argument: match src.argument.is_null() {
false => Some(CStr::from_ptr(src.argument).to_string_lossy()),
true => None,
},
n_used: match src.n_used {
::def::INVALID_INDEX => None,
i => Some(i),
},
proplist: ::proplist::Proplist::from_raw_weak(src.proplist),
}
}
}
}
impl Introspector {
pub fn get_module_info<F>(&self, index: u32, callback: F)
-> Operation<dyn FnMut(ListResult<&ModuleInfo>)>
where F: FnMut(ListResult<&ModuleInfo>) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&ModuleInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_module_info(self.context, index,
Some(mod_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&ModuleInfo>)>)
}
pub fn get_module_info_list<F>(&self, callback: F)
-> Operation<dyn FnMut(ListResult<&ModuleInfo>)>
where F: FnMut(ListResult<&ModuleInfo>) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&ModuleInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_module_info_list(self.context,
Some(mod_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&ModuleInfo>)>)
}
pub fn load_module<F>(&mut self, name: &str, argument: &str, callback: F)
-> Operation<dyn FnMut(u32)>
where F: FnMut(u32) + 'static
{
let c_name = CString::new(name.clone()).unwrap();
let c_arg = CString::new(argument.clone()).unwrap();
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(u32)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_load_module(self.context, c_name.as_ptr(),
c_arg.as_ptr(), Some(context_index_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(u32)>)
}
pub fn unload_module<F>(&mut self, index: u32, callback: F) -> Operation<dyn FnMut(bool)>
where F: FnMut(bool) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(bool)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_unload_module(self.context, index,
Some(super::success_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
}
extern "C"
fn mod_info_list_cb_proxy(_: *mut ContextInternal, i: *const ModuleInfoInternal, eol: i32,
userdata: *mut c_void)
{
let _ = std::panic::catch_unwind(|| {
match callback_for_list_instance::<dyn FnMut(ListResult<&ModuleInfo>)>(eol, userdata) {
ListInstanceCallback::Entry(callback) => {
assert!(!i.is_null());
let obj = ModuleInfo::new_from_raw(i);
(callback)(ListResult::Item(&obj));
},
ListInstanceCallback::End(mut callback) => { (callback)(ListResult::End); },
ListInstanceCallback::Error(mut callback) => { (callback)(ListResult::Error); },
}
});
}
extern "C"
fn context_index_cb_proxy(_: *mut ContextInternal, index: u32, userdata: *mut c_void) {
let _ = std::panic::catch_unwind(|| {
let mut callback = ::callbacks::get_su_callback::<dyn FnMut(u32)>(userdata);
(callback)(index);
});
}
#[derive(Debug)]
pub struct ClientInfo<'a> {
pub index: u32,
pub name: Option<Cow<'a, str>>,
pub owner_module: Option<u32>,
pub driver: Option<Cow<'a, str>>,
pub proplist: ::proplist::Proplist,
}
impl<'a> ClientInfo<'a> {
fn new_from_raw(p: *const ClientInfoInternal) -> Self {
assert!(!p.is_null());
let src = unsafe { p.as_ref().unwrap() };
unsafe {
ClientInfo {
index: src.index,
name: match src.name.is_null() {
false => Some(CStr::from_ptr(src.name).to_string_lossy()),
true => None,
},
owner_module: match src.owner_module {
::def::INVALID_INDEX => None,
i => Some(i),
},
driver: match src.driver.is_null() {
false => Some(CStr::from_ptr(src.driver).to_string_lossy()),
true => None,
},
proplist: ::proplist::Proplist::from_raw_weak(src.proplist),
}
}
}
}
impl Introspector {
pub fn get_client_info<F>(&self, index: u32, callback: F)
-> Operation<dyn FnMut(ListResult<&ClientInfo>)>
where F: FnMut(ListResult<&ClientInfo>) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&ClientInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_client_info(self.context, index,
Some(get_client_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&ClientInfo>)>)
}
pub fn get_client_info_list<F>(&self, callback: F)
-> Operation<dyn FnMut(ListResult<&ClientInfo>)>
where F: FnMut(ListResult<&ClientInfo>) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&ClientInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_client_info_list(self.context,
Some(get_client_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&ClientInfo>)>)
}
pub fn kill_client<F>(&mut self, index: u32, callback: F) -> Operation<dyn FnMut(bool)>
where F: FnMut(bool) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(bool)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_kill_client(self.context, index,
Some(super::success_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
}
extern "C"
fn get_client_info_list_cb_proxy(_: *mut ContextInternal, i: *const ClientInfoInternal, eol: i32,
userdata: *mut c_void)
{
let _ = std::panic::catch_unwind(|| {
match callback_for_list_instance::<dyn FnMut(ListResult<&ClientInfo>)>(eol, userdata) {
ListInstanceCallback::Entry(callback) => {
assert!(!i.is_null());
let obj = ClientInfo::new_from_raw(i);
(callback)(ListResult::Item(&obj));
},
ListInstanceCallback::End(mut callback) => { (callback)(ListResult::End); },
ListInstanceCallback::Error(mut callback) => { (callback)(ListResult::Error); },
}
});
}
#[derive(Debug)]
pub struct CardProfileInfo2<'a> {
pub name: Option<Cow<'a, str>>,
pub description: Option<Cow<'a, str>>,
pub n_sinks: u32,
pub n_sources: u32,
pub priority: u32,
pub available: bool,
}
impl<'a> CardProfileInfo2<'a> {
fn new_from_raw(p: *const CardProfileInfo2Internal) -> Self {
assert!(!p.is_null());
let src = unsafe { p.as_ref().unwrap() };
unsafe {
CardProfileInfo2 {
name: match src.name.is_null() {
false => Some(CStr::from_ptr(src.name).to_string_lossy()),
true => None,
},
description: match src.description.is_null() {
false => Some(CStr::from_ptr(src.description).to_string_lossy()),
true => None,
},
n_sinks: src.n_sinks,
n_sources: src.n_sources,
priority: src.priority,
available: match src.available { 0 => false, _ => true },
}
}
}
}
#[derive(Debug)]
pub struct CardPortInfo<'a> {
pub name: Option<Cow<'a, str>>,
pub description: Option<Cow<'a, str>>,
pub priority: u32,
pub available: ::def::PortAvailable,
pub direction: ::direction::FlagSet,
pub proplist: ::proplist::Proplist,
pub latency_offset: i64,
pub profiles: Vec<CardProfileInfo2<'a>>,
}
impl<'a> CardPortInfo<'a> {
fn new_from_raw(p: *const CardPortInfoInternal) -> Self {
assert!(!p.is_null());
let src = unsafe { p.as_ref().unwrap() };
let mut profiles_vec = Vec::with_capacity(src.n_profiles as usize);
assert!(src.n_profiles == 0 || !src.profiles2.is_null());
for i in 0..src.n_profiles as isize {
let indexed_ptr = unsafe { (*src.profiles2.offset(i)) as *mut CardProfileInfo2Internal };
if !indexed_ptr.is_null() {
profiles_vec.push(CardProfileInfo2::new_from_raw(indexed_ptr));
}
}
unsafe {
CardPortInfo {
name: match src.name.is_null() {
false => Some(CStr::from_ptr(src.name).to_string_lossy()),
true => None,
},
description: match src.description.is_null() {
false => Some(CStr::from_ptr(src.description).to_string_lossy()),
true => None,
},
priority: src.priority,
available: std::mem::transmute(src.available),
direction: src.direction,
proplist: ::proplist::Proplist::from_raw_weak(src.proplist),
latency_offset: src.latency_offset,
profiles: profiles_vec,
}
}
}
}
#[derive(Debug)]
pub struct CardInfo<'a> {
pub index: u32,
pub name: Option<Cow<'a, str>>,
pub owner_module: Option<u32>,
pub driver: Option<Cow<'a, str>>,
pub proplist: ::proplist::Proplist,
pub ports: Vec<CardPortInfo<'a>>,
pub profiles: Vec<CardProfileInfo2<'a>>,
pub active_profile: Option<Box<CardProfileInfo2<'a>>>,
}
impl<'a> CardInfo<'a> {
fn new_from_raw(p: *const CardInfoInternal) -> Self {
assert!(!p.is_null());
let src = unsafe { p.as_ref().unwrap() };
let mut ports_vec = Vec::with_capacity(src.n_ports as usize);
assert!(src.n_ports == 0 || !src.ports.is_null());
for i in 0..src.n_ports as isize {
let indexed_ptr = unsafe { (*src.ports.offset(i)) as *mut CardPortInfoInternal };
if !indexed_ptr.is_null() {
ports_vec.push(CardPortInfo::new_from_raw(indexed_ptr));
}
}
let mut profiles_vec = Vec::with_capacity(src.n_profiles as usize);
assert!(src.n_profiles == 0 || !src.profiles2.is_null());
for i in 0..src.n_profiles as isize {
let indexed_ptr = unsafe { (*src.profiles2.offset(i)) as *mut CardProfileInfo2Internal };
if !indexed_ptr.is_null() {
profiles_vec.push(CardProfileInfo2::new_from_raw(indexed_ptr));
}
}
unsafe {
CardInfo {
index: src.index,
name: match src.name.is_null() {
false => Some(CStr::from_ptr(src.name).to_string_lossy()),
true => None,
},
owner_module: match src.owner_module {
::def::INVALID_INDEX => None,
i => Some(i),
},
driver: match src.driver.is_null() {
false => Some(CStr::from_ptr(src.driver).to_string_lossy()),
true => None,
},
proplist: ::proplist::Proplist::from_raw_weak(src.proplist),
ports: ports_vec,
profiles: profiles_vec,
active_profile: match src.active_profile2.is_null() {
true => None,
false => Some(Box::new(CardProfileInfo2::new_from_raw(src.active_profile2))),
},
}
}
}
}
impl Introspector {
pub fn get_card_info_by_index<F>(&self, index: u32, callback: F)
-> Operation<dyn FnMut(ListResult<&CardInfo>)>
where F: FnMut(ListResult<&CardInfo>) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&CardInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_card_info_by_index(self.context, index,
Some(get_card_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&CardInfo>)>)
}
pub fn get_card_info_by_name<F>(&self, name: &str, callback: F)
-> Operation<dyn FnMut(ListResult<&CardInfo>)>
where F: FnMut(ListResult<&CardInfo>) + 'static
{
let c_name = CString::new(name.clone()).unwrap();
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&CardInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_card_info_by_name(self.context, c_name.as_ptr(),
Some(get_card_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&CardInfo>)>)
}
pub fn get_card_info_list<F>(&self, callback: F) -> Operation<dyn FnMut(ListResult<&CardInfo>)>
where F: FnMut(ListResult<&CardInfo>) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&CardInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_card_info_list(self.context,
Some(get_card_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&CardInfo>)>)
}
pub fn set_card_profile_by_index(&mut self, index: u32, profile: &str,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_profile = CString::new(profile.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_card_profile_by_index(self.context, index,
c_profile.as_ptr(), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_card_profile_by_name(&mut self, name: &str, profile: &str,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_name = CString::new(name.clone()).unwrap();
let c_profile = CString::new(profile.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_card_profile_by_name(self.context, c_name.as_ptr(),
c_profile.as_ptr(), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_port_latency_offset(&mut self, card_name: &str, port_name: &str, offset: i64,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_name = CString::new(card_name.clone()).unwrap();
let c_port = CString::new(port_name.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_port_latency_offset(self.context, c_name.as_ptr(),
c_port.as_ptr(), offset, cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
}
extern "C"
fn get_card_info_list_cb_proxy(_: *mut ContextInternal, i: *const CardInfoInternal, eol: i32,
userdata: *mut c_void)
{
let _ = std::panic::catch_unwind(|| {
match callback_for_list_instance::<dyn FnMut(ListResult<&CardInfo>)>(eol, userdata) {
ListInstanceCallback::Entry(callback) => {
assert!(!i.is_null());
let obj = CardInfo::new_from_raw(i);
(callback)(ListResult::Item(&obj));
},
ListInstanceCallback::End(mut callback) => { (callback)(ListResult::End); },
ListInstanceCallback::Error(mut callback) => { (callback)(ListResult::Error); },
}
});
}
#[derive(Debug)]
pub struct SinkInputInfo<'a> {
pub index: u32,
pub name: Option<Cow<'a, str>>,
pub owner_module: Option<u32>,
pub client: Option<u32>,
pub sink: u32,
pub sample_spec: ::sample::Spec,
pub channel_map: ::channelmap::Map,
pub volume: ::volume::ChannelVolumes,
pub buffer_usec: MicroSeconds,
pub sink_usec: MicroSeconds,
pub resample_method: Option<Cow<'a, str>>,
pub driver: Option<Cow<'a, str>>,
pub mute: bool,
pub proplist: ::proplist::Proplist,
pub corked: bool,
pub has_volume: bool,
pub volume_writable: bool,
pub format: ::format::Info,
}
impl<'a> SinkInputInfo<'a> {
fn new_from_raw(p: *const SinkInputInfoInternal) -> Self {
assert!(!p.is_null());
let src = unsafe { p.as_ref().unwrap() };
unsafe {
SinkInputInfo {
index: src.index,
name: match src.name.is_null() {
false => Some(CStr::from_ptr(src.name).to_string_lossy()),
true => None,
},
owner_module: match src.owner_module {
::def::INVALID_INDEX => None,
i => Some(i),
},
client: match src.client {
::def::INVALID_INDEX => None,
i => Some(i),
},
sink: src.sink,
sample_spec: std::mem::transmute(src.sample_spec),
channel_map: std::mem::transmute(src.channel_map),
volume: std::mem::transmute(src.volume),
buffer_usec: MicroSeconds(src.buffer_usec),
sink_usec: MicroSeconds(src.sink_usec),
resample_method: match src.resample_method.is_null() {
false => Some(CStr::from_ptr(src.resample_method).to_string_lossy()),
true => None,
},
driver: match src.driver.is_null() {
false => Some(CStr::from_ptr(src.driver).to_string_lossy()),
true => None,
},
mute: match src.mute { 0 => false, _ => true },
proplist: ::proplist::Proplist::from_raw_weak(src.proplist),
corked: match src.corked { 0 => false, _ => true },
has_volume: match src.has_volume { 0 => false, _ => true },
volume_writable: match src.volume_writable { 0 => false, _ => true },
format: ::format::Info::from_raw_weak(src.format as *mut ::format::InfoInternal),
}
}
}
}
impl Introspector {
pub fn get_sink_input_info<F>(&self, index: u32, callback: F)
-> Operation<dyn FnMut(ListResult<&SinkInputInfo>)>
where F: FnMut(ListResult<&SinkInputInfo>) + 'static
{
let cb_data =
box_closure_get_capi_ptr::<dyn FnMut(ListResult<&SinkInputInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_sink_input_info(self.context, index,
Some(get_sink_input_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&SinkInputInfo>)>)
}
pub fn get_sink_input_info_list<F>(&self, callback: F)
-> Operation<dyn FnMut(ListResult<&SinkInputInfo>)>
where F: FnMut(ListResult<&SinkInputInfo>) + 'static
{
let cb_data =
box_closure_get_capi_ptr::<dyn FnMut(ListResult<&SinkInputInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_sink_input_info_list(self.context,
Some(get_sink_input_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&SinkInputInfo>)>)
}
pub fn move_sink_input_by_name(&mut self, index: u32, sink_name: &str,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_name = CString::new(sink_name.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_move_sink_input_by_name(self.context, index,
c_name.as_ptr(), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn move_sink_input_by_index(&mut self, index: u32, sink_index: u32,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_move_sink_input_by_index(self.context, index,
sink_index, cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_sink_input_volume(&mut self, index: u32, volume: &::volume::ChannelVolumes,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_sink_input_volume(self.context, index,
std::mem::transmute(volume), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_sink_input_mute(&mut self, index: u32, mute: bool,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_sink_input_mute(self.context, index, mute as i32,
cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn kill_sink_input<F>(&mut self, index: u32, callback: F) -> Operation<dyn FnMut(bool)>
where F: FnMut(bool) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(bool)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_kill_sink_input(self.context, index,
Some(super::success_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
}
extern "C"
fn get_sink_input_info_list_cb_proxy(_: *mut ContextInternal, i: *const SinkInputInfoInternal,
eol: i32, userdata: *mut c_void)
{
let _ = std::panic::catch_unwind(|| {
match callback_for_list_instance::<dyn FnMut(ListResult<&SinkInputInfo>)>(eol, userdata) {
ListInstanceCallback::Entry(callback) => {
assert!(!i.is_null());
let obj = SinkInputInfo::new_from_raw(i);
(callback)(ListResult::Item(&obj));
},
ListInstanceCallback::End(mut callback) => { (callback)(ListResult::End); },
ListInstanceCallback::Error(mut callback) => { (callback)(ListResult::Error); },
}
});
}
#[derive(Debug)]
pub struct SourceOutputInfo<'a> {
pub index: u32,
pub name: Option<Cow<'a, str>>,
pub owner_module: Option<u32>,
pub client: Option<u32>,
pub source: u32,
pub sample_spec: ::sample::Spec,
pub channel_map: ::channelmap::Map,
pub buffer_usec: MicroSeconds,
pub source_usec: MicroSeconds,
pub resample_method: Option<Cow<'a, str>>,
pub driver: Option<Cow<'a, str>>,
pub proplist: ::proplist::Proplist,
pub corked: bool,
pub volume: ::volume::ChannelVolumes,
pub mute: bool,
pub has_volume: bool,
pub volume_writable: bool,
pub format: ::format::Info,
}
impl<'a> SourceOutputInfo<'a> {
fn new_from_raw(p: *const SourceOutputInfoInternal) -> Self {
assert!(!p.is_null());
let src = unsafe { p.as_ref().unwrap() };
unsafe {
SourceOutputInfo {
index: src.index,
name: match src.name.is_null() {
false => Some(CStr::from_ptr(src.name).to_string_lossy()),
true => None,
},
owner_module: match src.owner_module {
::def::INVALID_INDEX => None,
i => Some(i),
},
client: match src.client {
::def::INVALID_INDEX => None,
i => Some(i),
},
source: src.source,
sample_spec: std::mem::transmute(src.sample_spec),
channel_map: std::mem::transmute(src.channel_map),
buffer_usec: MicroSeconds(src.buffer_usec),
source_usec: MicroSeconds(src.source_usec),
resample_method: match src.resample_method.is_null() {
false => Some(CStr::from_ptr(src.resample_method).to_string_lossy()),
true => None,
},
driver: match src.driver.is_null() {
false => Some(CStr::from_ptr(src.driver).to_string_lossy()),
true => None,
},
proplist: ::proplist::Proplist::from_raw_weak(src.proplist),
corked: match src.corked { 0 => false, _ => true },
volume: std::mem::transmute(src.volume),
mute: match src.mute { 0 => false, _ => true },
has_volume: match src.has_volume { 0 => false, _ => true },
volume_writable: match src.volume_writable { 0 => false, _ => true },
format: ::format::Info::from_raw_weak(src.format as *mut ::format::InfoInternal),
}
}
}
}
impl Introspector {
pub fn get_source_output_info<F>(&self, index: u32, callback: F)
-> Operation<dyn FnMut(ListResult<&SourceOutputInfo>)>
where F: FnMut(ListResult<&SourceOutputInfo>) + 'static
{
let cb_data =
box_closure_get_capi_ptr::<dyn FnMut(ListResult<&SourceOutputInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_source_output_info(self.context, index,
Some(get_source_output_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&SourceOutputInfo>)>)
}
pub fn get_source_output_info_list<F>(&self, callback: F)
-> Operation<dyn FnMut(ListResult<&SourceOutputInfo>)>
where F: FnMut(ListResult<&SourceOutputInfo>) + 'static
{
let cb_data =
box_closure_get_capi_ptr::<dyn FnMut(ListResult<&SourceOutputInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_source_output_info_list(self.context,
Some(get_source_output_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&SourceOutputInfo>)>)
}
pub fn move_source_output_by_name(&mut self, index: u32, source_name: &str,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let c_name = CString::new(source_name.clone()).unwrap();
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_move_source_output_by_name(self.context, index,
c_name.as_ptr(), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn move_source_output_by_index(&mut self, index: u32, source_index: u32,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_move_source_output_by_index(self.context, index,
source_index, cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_source_output_volume(&mut self, index: u32, volume: &::volume::ChannelVolumes,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_source_output_volume(self.context, index,
std::mem::transmute(volume), cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn set_source_output_mute(&mut self, index: u32, mute: bool,
callback: Option<Box<dyn FnMut(bool) + 'static>>) -> Operation<dyn FnMut(bool)>
{
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, _) =
::callbacks::get_su_capi_params::<_, _>(callback, super::success_cb_proxy);
let ptr = unsafe { capi::pa_context_set_source_output_mute(self.context, index, mute as i32,
cb_fn, cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
pub fn kill_source_output<F>(&mut self, index: u32, callback: F) -> Operation<dyn FnMut(bool)>
where F: FnMut(bool) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(bool)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_kill_source_output(self.context, index,
Some(super::success_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(bool)>)
}
}
extern "C"
fn get_source_output_info_list_cb_proxy(_: *mut ContextInternal, i: *const SourceOutputInfoInternal,
eol: i32, userdata: *mut c_void)
{
let _ = std::panic::catch_unwind(|| {
match callback_for_list_instance::<dyn FnMut(ListResult<&SourceOutputInfo>)>(eol, userdata) {
ListInstanceCallback::Entry(callback) => {
assert!(!i.is_null());
let obj = SourceOutputInfo::new_from_raw(i);
(callback)(ListResult::Item(&obj));
},
ListInstanceCallback::End(mut callback) => { (callback)(ListResult::End); },
ListInstanceCallback::Error(mut callback) => { (callback)(ListResult::Error); },
}
});
}
impl Introspector {
pub fn stat<F>(&self, callback: F) -> Operation<dyn FnMut(&StatInfo)>
where F: FnMut(&StatInfo) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(&StatInfo)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_stat(self.context, Some(get_stat_info_cb_proxy),
cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(&StatInfo)>)
}
}
extern "C"
fn get_stat_info_cb_proxy(_: *mut ContextInternal, i: *const StatInfo, userdata: *mut c_void) {
let _ = std::panic::catch_unwind(|| {
assert!(!i.is_null());
let mut callback = ::callbacks::get_su_callback::<dyn FnMut(&StatInfo)>(userdata);
(callback)(unsafe { i.as_ref().unwrap() });
});
}
#[derive(Debug)]
pub struct SampleInfo<'a> {
pub index: u32,
pub name: Option<Cow<'a, str>>,
pub volume: ::volume::ChannelVolumes,
pub sample_spec: ::sample::Spec,
pub channel_map: ::channelmap::Map,
pub duration: MicroSeconds,
pub bytes: u32,
pub lazy: bool,
pub filename: Option<Cow<'a, str>>,
pub proplist: ::proplist::Proplist,
}
impl<'a> SampleInfo<'a> {
fn new_from_raw(p: *const SampleInfoInternal) -> Self {
assert!(!p.is_null());
let src = unsafe { p.as_ref().unwrap() };
unsafe {
SampleInfo {
index: src.index,
name: match src.name.is_null() {
false => Some(CStr::from_ptr(src.name).to_string_lossy()),
true => None,
},
volume: std::mem::transmute(src.volume),
sample_spec: std::mem::transmute(src.sample_spec),
channel_map: std::mem::transmute(src.channel_map),
duration: MicroSeconds(src.duration),
bytes: src.bytes,
lazy: match src.lazy { 0 => false, _ => true },
filename: match src.filename.is_null() {
false => Some(CStr::from_ptr(src.filename).to_string_lossy()),
true => None,
},
proplist: ::proplist::Proplist::from_raw_weak(src.proplist),
}
}
}
}
impl Introspector {
pub fn get_sample_info_by_name<F>(&self, name: &str, callback: F)
-> Operation<dyn FnMut(ListResult<&SampleInfo>)>
where F: FnMut(ListResult<&SampleInfo>) + 'static
{
let c_name = CString::new(name.clone()).unwrap();
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&SampleInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_sample_info_by_name(self.context, c_name.as_ptr(),
Some(get_sample_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&SampleInfo>)>)
}
pub fn get_sample_info_by_index<F>(&self, index: u32, callback: F)
-> Operation<dyn FnMut(ListResult<&SampleInfo>)>
where F: FnMut(ListResult<&SampleInfo>) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&SampleInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_sample_info_by_index(self.context, index,
Some(get_sample_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&SampleInfo>)>)
}
pub fn get_sample_info_list<F>(&self, callback: F)
-> Operation<dyn FnMut(ListResult<&SampleInfo>)>
where F: FnMut(ListResult<&SampleInfo>) + 'static
{
let cb_data = box_closure_get_capi_ptr::<dyn FnMut(ListResult<&SampleInfo>)>(Box::new(callback));
let ptr = unsafe { capi::pa_context_get_sample_info_list(self.context,
Some(get_sample_info_list_cb_proxy), cb_data) };
assert!(!ptr.is_null());
Operation::from_raw(ptr, cb_data as *mut Box<dyn FnMut(ListResult<&SampleInfo>)>)
}
}
extern "C"
fn get_sample_info_list_cb_proxy(_: *mut ContextInternal, i: *const SampleInfoInternal, eol: i32,
userdata: *mut c_void)
{
let _ = std::panic::catch_unwind(|| {
match callback_for_list_instance::<dyn FnMut(ListResult<&SampleInfo>)>(eol, userdata) {
ListInstanceCallback::Entry(callback) => {
assert!(!i.is_null());
let obj = SampleInfo::new_from_raw(i);
(callback)(ListResult::Item(&obj));
},
ListInstanceCallback::End(mut callback) => { (callback)(ListResult::End); },
ListInstanceCallback::Error(mut callback) => { (callback)(ListResult::Error); },
}
});
}