use std;
use capi;
use std::os::raw::{c_char, c_void};
use std::ffi::CString;
use std::ptr::null;
use super::{ContextInternal, Context};
impl Context {
pub fn remove_sample<F>(&mut self, name: &str, callback: F) -> ::operation::Operation
where F: FnMut(bool) + 'static
{
let c_name = CString::new(name.clone()).unwrap();
let cb_data: *mut c_void = {
let boxed: *mut Box<FnMut(bool)> = Box::into_raw(Box::new(Box::new(callback)));
boxed as *mut c_void
};
let ptr = unsafe { capi::pa_context_remove_sample(self.ptr, c_name.as_ptr(),
Some(super::success_cb_proxy), cb_data) };
assert!(!ptr.is_null());
::operation::Operation::from_raw(ptr)
}
pub fn play_sample(&mut self, name: &str, dev: Option<&str>, volume: ::volume::Volume,
callback: Option<Box<FnMut(bool) + 'static>>) -> ::operation::Operation
{
let c_name = CString::new(name.clone()).unwrap();
let c_dev = match dev {
Some(dev) => CString::new(dev.clone()).unwrap(),
None => CString::new("").unwrap(),
};
let p_dev: *const c_char = match dev {
Some(_) => c_dev.as_ptr(),
None => null::<c_char>(),
};
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, *mut c_void) = match callback {
Some(f) => {
let boxed: *mut Box<FnMut(bool)> = Box::into_raw(Box::new(f));
(Some(super::success_cb_proxy), boxed as *mut c_void)
},
None => (None, std::ptr::null_mut::<c_void>()),
};
let ptr = unsafe { capi::pa_context_play_sample(self.ptr, c_name.as_ptr(), p_dev, volume.0,
cb_fn, cb_data) };
assert!(!ptr.is_null());
::operation::Operation::from_raw(ptr)
}
pub fn play_sample_with_proplist(&mut self, name: &str, dev: Option<&str>,
volume: ::volume::Volume, proplist: &::proplist::Proplist,
callback: Option<Box<FnMut(Result<u32, ()>) + 'static>>) -> ::operation::Operation
{
let c_name = CString::new(name.clone()).unwrap();
let c_dev = match dev {
Some(dev) => CString::new(dev.clone()).unwrap(),
None => CString::new("").unwrap(),
};
let p_dev: *const c_char = match dev {
Some(_) => c_dev.as_ptr(),
None => null::<c_char>(),
};
let (cb_fn, cb_data): (Option<extern "C" fn(_, _, _)>, *mut c_void) = match callback {
Some(f) => {
let boxed: *mut Box<FnMut(Result<u32, ()>)> = Box::into_raw(Box::new(f));
(Some(play_sample_success_cb_proxy), boxed as *mut c_void)
},
None => (None, std::ptr::null_mut::<c_void>()),
};
let ptr = unsafe {
capi::pa_context_play_sample_with_proplist(self.ptr, c_name.as_ptr(), p_dev, volume.0,
proplist.ptr, cb_fn, cb_data)
};
assert!(!ptr.is_null());
::operation::Operation::from_raw(ptr)
}
}
extern "C"
fn play_sample_success_cb_proxy(_: *mut ContextInternal, index: u32, userdata: *mut c_void) {
assert!(!userdata.is_null());
let mut callback = unsafe { Box::from_raw(userdata as *mut Box<FnMut(Result<u32, ()>)>) };
let index_actual = match index { ::def::INVALID_INDEX => Err(()), i => Ok(i) };
callback(index_actual);
}