use ffi;
use types::*;
use callbacks::*;
use dsp_connection;
use fmod_sys;
use fmod_sys::{MemoryUsageDetails, Sys};
use std::mem::transmute;
use channel;
use libc::{c_char, c_void, c_uint, c_int, c_float};
use std::default::Default;
use c_vec::CVec;
use std::ffi::CString;
extern "C" fn create_callback(dsp_state: *mut ffi::FMOD_DSP_STATE) -> ::Result {
unsafe {
if !dsp_state.is_null() && !(*dsp_state).instance.is_null() {
let mut tmp = ::std::ptr::null_mut();
ffi::FMOD_DSP_GetUserData((*dsp_state).instance, &mut tmp);
if !tmp.is_null() {
let callbacks : &mut UserData = transmute(tmp);
match callbacks.callbacks.create_callback {
Some(p) => p(&from_state_ptr(::std::ptr::read(dsp_state as *const ffi::FMOD_DSP_STATE))),
None => ::Result::Ok
}
} else {
::Result::Ok
}
} else {
::Result::Ok
}
}
}
extern "C" fn release_callback(dsp_state: *mut ffi::FMOD_DSP_STATE) -> ::Result {
unsafe {
if !dsp_state.is_null() && !(*dsp_state).instance.is_null() {
let mut tmp = ::std::ptr::null_mut();
ffi::FMOD_DSP_GetUserData((*dsp_state).instance, &mut tmp);
if !tmp.is_null() {
let callbacks : &mut UserData = transmute(tmp);
match callbacks.callbacks.release_callback {
Some(p) => p(&from_state_ptr(::std::ptr::read(dsp_state as *const ffi::FMOD_DSP_STATE))),
None => ::Result::Ok
}
} else {
::Result::Ok
}
} else {
::Result::Ok
}
}
}
extern "C" fn reset_callback(dsp_state: *mut ffi::FMOD_DSP_STATE) -> ::Result {
unsafe {
if !dsp_state.is_null() && !(*dsp_state).instance.is_null() {
let mut tmp = ::std::ptr::null_mut();
ffi::FMOD_DSP_GetUserData((*dsp_state).instance, &mut tmp);
if !tmp.is_null() {
let callbacks : &mut UserData = transmute(tmp);
match callbacks.callbacks.reset_callback {
Some(p) => p(&from_state_ptr(::std::ptr::read(dsp_state as *const ffi::FMOD_DSP_STATE))),
None => ::Result::Ok
}
} else {
::Result::Ok
}
} else {
::Result::Ok
}
}
}
extern "C" fn read_callback(dsp_state: *mut ffi::FMOD_DSP_STATE, in_buffer: *mut c_float, out_buffer: *mut c_float, length: c_uint,
in_channels: c_int, out_channels: c_int) -> ::Result {
unsafe {
if !dsp_state.is_null() && !(*dsp_state).instance.is_null() {
let mut tmp = ::std::ptr::null_mut();
ffi::FMOD_DSP_GetUserData((*dsp_state).instance, &mut tmp);
if !tmp.is_null() {
let callbacks : &mut UserData = transmute(tmp);
match callbacks.callbacks.read_callback {
Some(p) => {
let mut v_in_buffer = CVec::new(in_buffer, (((length as i32 - 1i32) * in_channels) + out_channels) as usize);
let mut v_out_buffer = CVec::new(out_buffer, (((length as i32 - 1i32) * out_channels) + out_channels) as usize);
p(&from_state_ptr(::std::ptr::read(dsp_state as *const ffi::FMOD_DSP_STATE)), v_in_buffer.as_mut(), v_out_buffer.as_mut(),
length as u32, in_channels as i32, out_channels as i32)
},
None => ::Result::Ok
}
} else {
::Result::Ok
}
} else {
::Result::Ok
}
}
}
extern "C" fn set_position_callback(dsp_state: *mut ffi::FMOD_DSP_STATE, pos: c_uint) -> ::Result {
unsafe {
if !dsp_state.is_null() && !(*dsp_state).instance.is_null() {
let mut tmp = ::std::ptr::null_mut();
ffi::FMOD_DSP_GetUserData((*dsp_state).instance, &mut tmp);
if !tmp.is_null() {
let callbacks : &mut UserData = transmute(tmp);
match callbacks.callbacks.set_pos_callback {
Some(p) => p(&from_state_ptr(::std::ptr::read(dsp_state as *const ffi::FMOD_DSP_STATE)), pos as u32),
None => ::Result::Ok
}
} else {
::Result::Ok
}
} else {
::Result::Ok
}
}
}
extern "C" fn set_parameter_callback(dsp_state: *mut ffi::FMOD_DSP_STATE, index: c_int, value: c_float) -> ::Result {
unsafe {
if !dsp_state.is_null() && !(*dsp_state).instance.is_null() {
let mut tmp = ::std::ptr::null_mut();
ffi::FMOD_DSP_GetUserData((*dsp_state).instance, &mut tmp);
if !tmp.is_null() {
let callbacks : &mut UserData = transmute(tmp);
match callbacks.callbacks.set_param_callback {
Some(p) => p(&from_state_ptr(::std::ptr::read(dsp_state as *const ffi::FMOD_DSP_STATE)), index as i32, value),
None => ::Result::Ok
}
} else {
::Result::Ok
}
} else {
::Result::Ok
}
}
}
extern "C" fn get_parameter_callback(dsp_state: *mut ffi::FMOD_DSP_STATE, index: c_int, value: *mut c_float, value_str: *mut c_char) -> ::Result {
unsafe {
if !dsp_state.is_null() && !(*dsp_state).instance.is_null() {
let mut tmp = ::std::ptr::null_mut();
ffi::FMOD_DSP_GetUserData((*dsp_state).instance, &mut tmp);
if !tmp.is_null() {
let callbacks : &mut UserData = transmute(tmp);
match callbacks.callbacks.get_param_callback {
Some(p) => {
let mut t_value = *value;
let l = ffi::strlen(value_str);
let tmp = String::from_raw_parts(value_str as *mut u8, l, l);
let ret = p(&from_state_ptr(::std::ptr::read(dsp_state as *const ffi::FMOD_DSP_STATE)),
index as i32,
&mut t_value,
&tmp);
*value = t_value;
ret
},
None => ::Result::Ok
}
} else {
::Result::Ok
}
} else {
::Result::Ok
}
}
}
#[allow(unused_variables)]
extern "C" fn config_callback(dsp_state: *mut ffi::FMOD_DSP_STATE, hwnd: *mut c_void, show: c_int) -> ::Result {
::Result::Ok
}
struct UserData {
callbacks: DspCallbacks,
user_data: *mut c_void
}
impl UserData {
fn new() -> UserData {
UserData {
callbacks: DspCallbacks::new(),
user_data: ::std::ptr::null_mut()
}
}
}
struct DspCallbacks {
create_callback: DspCreateCallback,
release_callback: DspReleaseCallback,
reset_callback: DspResetCallback,
read_callback: DspReadCallback,
set_pos_callback: DspSetPositionCallback,
set_param_callback: DspSetParamCallback,
get_param_callback: DspGetParamCallback
}
impl DspCallbacks {
fn new() -> DspCallbacks {
DspCallbacks {
create_callback: None,
release_callback: None,
reset_callback: None,
read_callback: None,
set_pos_callback: None,
set_param_callback: None,
get_param_callback: None
}
}
}
impl Clone for DspCallbacks {
fn clone(&self) -> DspCallbacks {
DspCallbacks {
create_callback: self.create_callback,
release_callback: self.release_callback,
reset_callback: self.reset_callback,
read_callback: self.read_callback,
set_pos_callback: self.set_pos_callback,
set_param_callback: self.set_param_callback,
get_param_callback: self.get_param_callback
}
}
}
#[derive(Debug, PartialEq, Clone)]
pub struct DspParameterDesc
{
pub min : f32,
pub max : f32,
pub default_val : f32,
pub name : String,
pub label : String,
pub description : String
}
impl Default for DspParameterDesc {
fn default() -> DspParameterDesc {
DspParameterDesc {
min: 0f32,
max: 0f32,
default_val: 0f32,
name: String::new(),
label: String::new(),
description: String::new()
}
}
}
pub fn from_parameter_ptr(dsp_parameter: *mut ffi::FMOD_DSP_PARAMETERDESC) -> DspParameterDesc {
if !dsp_parameter.is_null() {
unsafe {
let l = ffi::strlen((*dsp_parameter).description);
let description = String::from_raw_parts((*dsp_parameter).description as *mut u8, l, l);
let mut v1 : Vec<u8> = Vec::with_capacity((*dsp_parameter).name.len());
let mut v2 : Vec<u8> = Vec::with_capacity((*dsp_parameter).label.len());
for i in (*dsp_parameter).name.iter() {
v1.push(*i as u8);
}
for i in (*dsp_parameter).label.iter() {
v2.push(*i as u8);
}
DspParameterDesc {
min: (*dsp_parameter).min,
max: (*dsp_parameter).max,
default_val: (*dsp_parameter).default_val,
name: String::from_utf8(v1).unwrap(),
label: String::from_utf8(v2).unwrap(),
description: description
}
}
} else {
Default::default()
}
}
pub fn get_parameter_ffi(dsp_parameter: &DspParameterDesc) -> ffi::FMOD_DSP_PARAMETERDESC {
let mut tmp_name = dsp_parameter.name.as_bytes().to_vec();
let mut tmp_label = dsp_parameter.label.as_bytes().to_vec();
let tmp_description = CString::new(dsp_parameter.description.clone()).unwrap();
tmp_name.truncate(16);
tmp_label.truncate(16);
tmp_name.reserve_exact(16);
tmp_label.reserve_exact(16);
ffi::FMOD_DSP_PARAMETERDESC {
min: dsp_parameter.min,
max: dsp_parameter.max,
default_val: dsp_parameter.default_val,
name: {
let mut slice : [i8; 16] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
let mut it = 0;
for tmp in tmp_name.iter() {
slice[it] = *tmp as i8;
it += 1;
}
slice
},
label: {
let mut slice : [i8; 16] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
let mut it = 0;
for tmp in tmp_label.iter() {
slice[it] = *tmp as i8;
it += 1;
}
slice
},
description: tmp_description.as_ptr() as *const c_char
}
}
pub struct DspDescription
{
pub name : String,
pub version : u32,
pub channels : i32,
pub create : DspCreateCallback,
pub release : DspReleaseCallback,
pub reset : DspResetCallback,
pub read : DspReadCallback,
pub set_position : DspSetPositionCallback,
pub num_parameters : i32,
pub param_desc : DspParameterDesc,
pub set_parameter : DspSetParamCallback,
pub get_parameter : DspGetParamCallback,
config : DspDialogCallback,
pub config_width : i32,
pub config_height : i32,
user_data : Box<UserData>
}
impl Default for DspDescription {
fn default() -> DspDescription {
DspDescription {
name: String::new(),
version: 0u32,
channels: 0i32,
create: None,
release: None,
reset: None,
read: None,
set_position: None,
num_parameters: 0i32,
param_desc: Default::default(),
set_parameter: None,
get_parameter: None,
config: None,
config_width: 0i32,
config_height: 0i32,
user_data: Box::new(UserData::new())
}
}
}
pub fn get_description_ffi(dsp_description: &mut DspDescription) -> ffi::FMOD_DSP_DESCRIPTION {
let mut tmp_s = dsp_description.name.as_bytes().to_vec();
tmp_s.truncate(32);
tmp_s.reserve_exact(32);
ffi::FMOD_DSP_DESCRIPTION {
name: {
let mut slice : [i8; 32] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
let mut it = 0;
for tmp in tmp_s.iter() {
slice[it] = *tmp as i8;
it += 1;
}
slice
},
version: dsp_description.version,
channels: dsp_description.channels,
create: match dsp_description.create {
Some(_) => Some(create_callback as extern "C" fn(*mut _) -> _),
None => None
},
release: match dsp_description.release {
Some(_) => Some(release_callback as extern "C" fn(*mut _) -> _),
None => None
},
reset: match dsp_description.reset {
Some(_) => Some(reset_callback as extern "C" fn(*mut _) -> _),
None => None
},
read: match dsp_description.read {
Some(_) => Some(read_callback as extern "C" fn(*mut _, *mut _, *mut _, _, _, _) -> _),
None => None
},
set_position: match dsp_description.set_position {
Some(_) => Some(set_position_callback as extern "C" fn(*mut _, _) -> _),
None => None
},
num_parameters: dsp_description.num_parameters,
param_desc: &mut get_parameter_ffi(&dsp_description.param_desc) as *mut ffi::FMOD_DSP_PARAMETERDESC,
set_parameter: match dsp_description.set_parameter {
Some(_) => Some(set_parameter_callback as extern "C" fn(*mut _, _, _) -> _),
None => None
},
get_parameter: match dsp_description.get_parameter {
Some(_) => Some(get_parameter_callback as extern "C" fn(*mut _, _, *mut _, *mut _) -> _),
None => None
},
config: match dsp_description.config {
Some(_) => Some(config_callback as extern "C" fn(*mut _, *mut _, _) -> _),
None => None
},
config_height: dsp_description.config_height,
config_width: dsp_description.config_width,
user_data: {
dsp_description.user_data.callbacks.create_callback = dsp_description.create;
dsp_description.user_data.callbacks.release_callback = dsp_description.release;
dsp_description.user_data.callbacks.reset_callback = dsp_description.reset;
dsp_description.user_data.callbacks.read_callback = dsp_description.read;
dsp_description.user_data.callbacks.set_pos_callback = dsp_description.set_position;
dsp_description.user_data.callbacks.set_param_callback = dsp_description.set_parameter;
dsp_description.user_data.callbacks.get_param_callback = dsp_description.get_parameter;
unsafe { transmute::<&mut UserData, *mut c_void>(&mut *dsp_description.user_data) }
}
}
}
pub fn get_state_ffi(state: &DspState) -> ffi::FMOD_DSP_STATE {
ffi::FMOD_DSP_STATE {
instance: ffi::FFI::unwrap(&state.instance),
plugin_data: state.plugin_data,
speaker_mask: state.speaker_mask
}
}
pub fn from_state_ptr(state: ffi::FMOD_DSP_STATE) -> DspState {
DspState {
instance: ffi::FFI::wrap(state.instance),
plugin_data: state.plugin_data,
speaker_mask: state.speaker_mask
}
}
pub struct DspState
{
pub instance: Dsp,
plugin_data: *mut c_void,
pub speaker_mask: u16
}
pub fn from_ptr_first(dsp: *mut ffi::FMOD_DSP) -> Dsp {
Dsp {
dsp: dsp,
can_be_deleted: true,
user_data: UserData {
callbacks: DspCallbacks::new(),
user_data: ::std::ptr::null_mut()
}
}
}
pub struct Dsp {
dsp: *mut ffi::FMOD_DSP,
can_be_deleted: bool,
user_data: UserData
}
impl ffi::FFI<ffi::FMOD_DSP> for Dsp {
fn wrap(dsp: *mut ffi::FMOD_DSP) -> Dsp {
Dsp {
dsp: dsp,
can_be_deleted: false,
user_data: UserData {
callbacks: DspCallbacks::new(),
user_data: ::std::ptr::null_mut()
}
}
}
fn unwrap(d: &Dsp) -> *mut ffi::FMOD_DSP {
d.dsp
}
}
impl Drop for Dsp {
fn drop(&mut self) {
self.release();
}
}
impl Dsp {
pub fn get_system_object(&self) -> Result<Sys, ::Result> {
let mut system = ::std::ptr::null_mut();
match unsafe { ffi::FMOD_DSP_GetSystemObject(self.dsp, &mut system) } {
::Result::Ok => Ok(ffi::FFI::wrap(system)),
e => Err(e)
}
}
pub fn release(&mut self) -> ::Result {
if self.can_be_deleted && !self.dsp.is_null() {
match unsafe { ffi::FMOD_DSP_Release(self.dsp) } {
::Result::Ok => {
self.dsp =::std::ptr::null_mut();
::Result::Ok
}
e => e
}
} else {
::Result::Ok
}
}
pub fn play(&self) -> Result<channel::Channel, ::Result> {
let mut channel = ::std::ptr::null_mut();
match match self.get_system_object() {
Ok(s) => {
unsafe { ffi::FMOD_System_PlayDSP(ffi::FFI::unwrap(&s), ::ChannelIndex::Free, self.dsp, 0, &mut channel) }
}
Err(e) => e
} {
::Result::Ok => Ok(ffi::FFI::wrap(channel)),
e => Err(e)
}
}
pub fn play_with_parameters(&self, channel_id: ::ChannelIndex) -> Result<channel::Channel, ::Result> {
let mut channel = ::std::ptr::null_mut();
match match self.get_system_object() {
Ok(s) => {
unsafe { ffi::FMOD_System_PlayDSP(ffi::FFI::unwrap(&s), channel_id, self.dsp, 0, &mut channel) }
}
Err(e) => e
} {
::Result::Ok => Ok(ffi::FFI::wrap(channel)),
e => Err(e)
}
}
pub fn add_input(&self, target: Dsp) -> Result<dsp_connection::DspConnection, ::Result> {
let mut connection = ::std::ptr::null_mut();
match unsafe { ffi::FMOD_DSP_AddInput(self.dsp, target.dsp, &mut connection) } {
::Result::Ok => Ok(ffi::FFI::wrap(connection)),
e => Err(e)
}
}
pub fn disconnect_from(&self, target: Dsp) -> ::Result {
unsafe { ffi::FMOD_DSP_DisconnectFrom(self.dsp, target.dsp) }
}
pub fn disconnect_all(&self, inputs: bool, outputs: bool) -> ::Result {
let t_inputs = if inputs == true {
1
} else {
0
};
let t_outputs = if outputs == true {
1
} else {
0
};
unsafe { ffi::FMOD_DSP_DisconnectAll(self.dsp, t_inputs, t_outputs) }
}
pub fn remove(&self) -> ::Result {
unsafe { ffi::FMOD_DSP_Remove(self.dsp) }
}
pub fn get_num_inputs(&self) -> Result<i32, ::Result> {
let mut inputs = 0i32;
match unsafe { ffi::FMOD_DSP_GetNumInputs(self.dsp, &mut inputs) } {
::Result::Ok => Ok(inputs),
e => Err(e)
}
}
pub fn get_num_outputs(&self) -> Result<i32, ::Result> {
let mut outputs = 0i32;
match unsafe { ffi::FMOD_DSP_GetNumOutputs(self.dsp, &mut outputs) } {
::Result::Ok => Ok(outputs),
e => Err(e)
}
}
pub fn get_input(&self, index: i32) -> Result<(Dsp, dsp_connection::DspConnection), ::Result> {
let mut input = ::std::ptr::null_mut();
let mut input_connection = ::std::ptr::null_mut();
match unsafe { ffi::FMOD_DSP_GetInput(self.dsp, index, &mut input, &mut input_connection) } {
::Result::Ok => Ok((ffi::FFI::wrap(input), ffi::FFI::wrap(input_connection))),
e => Err(e)
}
}
pub fn get_output(&self, index: i32) -> Result<(Dsp, dsp_connection::DspConnection), ::Result> {
let mut output = ::std::ptr::null_mut();
let mut output_connection = ::std::ptr::null_mut();
match unsafe { ffi::FMOD_DSP_GetOutput(self.dsp, index, &mut output, &mut output_connection) } {
::Result::Ok => Ok((ffi::FFI::wrap(output), ffi::FFI::wrap(output_connection ))),
e => Err(e)
}
}
pub fn set_active(&self, active: bool) -> ::Result {
let t_active = if active == true {
1
} else {
0
};
unsafe { ffi::FMOD_DSP_SetActive(self.dsp, t_active) }
}
pub fn get_active(&self) -> Result<bool, ::Result> {
let mut active = 0i32;
match unsafe { ffi::FMOD_DSP_GetActive(self.dsp, &mut active) } {
::Result::Ok => Ok(active != 0i32),
e => Err(e)
}
}
pub fn set_bypass(&self, bypass: bool) -> ::Result {
let t_bypass = if bypass == true {
1i32
} else {
0i32
};
unsafe { ffi::FMOD_DSP_SetBypass(self.dsp, t_bypass) }
}
pub fn get_bypass(&self) -> Result<bool, ::Result> {
let mut bypass = 0i32;
match unsafe { ffi::FMOD_DSP_GetBypass(self.dsp, &mut bypass) } {
::Result::Ok => Ok(bypass == 1i32),
e => Err(e)
}
}
pub fn set_speaker_active(&self, speaker: ::Speaker, active: bool) -> ::Result {
let t_active = if active == true {
1
} else {
0
};
unsafe { ffi::FMOD_DSP_SetSpeakerActive(self.dsp, speaker, t_active) }
}
pub fn get_speaker_active(&self, speaker: ::Speaker) -> Result<bool, ::Result> {
let mut active = 0i32;
match unsafe { ffi::FMOD_DSP_GetSpeakerActive(self.dsp, speaker, &mut active) } {
::Result::Ok => Ok(active == 1i32),
e => Err(e)
}
}
pub fn reset(&self) -> ::Result {
unsafe { ffi::FMOD_DSP_Reset(self.dsp) }
}
pub fn set_parameter(&self, index: i32, value: f32) -> ::Result {
unsafe { ffi::FMOD_DSP_SetParameter(self.dsp, index, value) }
}
pub fn get_parameter(&self, index: i32, value_str_len: usize) -> Result<(f32, String), ::Result> {
let mut value = 0f32;
let mut c = Vec::with_capacity(value_str_len + 1);
for _ in 0..(value_str_len + 1) {
c.push(0);
}
match unsafe { ffi::FMOD_DSP_GetParameter(self.dsp, index, &mut value, c.as_mut_ptr() as *mut c_char, value_str_len as i32) } {
::Result::Ok => Ok((value, String::from_utf8(c).unwrap())),
e => Err(e)
}
}
pub fn get_num_parameters(&self) -> Result<i32, ::Result> {
let mut num_param = 0i32;
match unsafe { ffi::FMOD_DSP_GetNumParameters(self.dsp, &mut num_param) } {
::Result::Ok => Ok(num_param),
e => Err(e)
}
}
pub fn get_parameter_info(&self, index: i32, name: &str, label: &str, description_len: usize) -> Result<(String, f32, f32), ::Result> {
let mut min = 0f32;
let mut max = 0f32;
let t_name = name.clone();
let t_label = label.clone();
let mut description = Vec::with_capacity(description_len + 1);
for _ in 0..(description_len + 1) {
description.push(0);
}
match unsafe { ffi::FMOD_DSP_GetParameterInfo(self.dsp, index, t_name.as_ptr() as *mut c_char, t_label.as_ptr() as *mut c_char,
description.as_mut_ptr() as *mut c_char, description_len as i32, &mut min, &mut max) } {
::Result::Ok => Ok((String::from_utf8(description).unwrap(), min, max)),
e => Err(e)
}
}
pub fn get_info(&self, name: &str) -> Result<(u32, i32, i32, i32), ::Result> {
let mut version = 0u32;
let mut channels = 0i32;
let mut config_width = 0i32;
let mut config_height = 0i32;
let tmp_n = name.clone();
match unsafe { ffi::FMOD_DSP_GetInfo(self.dsp, tmp_n.as_ptr() as *mut c_char, &mut version, &mut channels, &mut config_width,
&mut config_height) } {
::Result::Ok => Ok((version, channels, config_width, config_height)),
e => Err(e)
}
}
pub fn set_defaults(&self, frequency: f32, volume: f32, pan: f32, priority: i32) -> ::Result {
unsafe { ffi::FMOD_DSP_SetDefaults(self.dsp, frequency, volume, pan, priority) }
}
pub fn get_type(&self) -> Result<::DspType, ::Result> {
let mut _type = ::DspType::Unknown;
match unsafe { ffi::FMOD_DSP_GetType(self.dsp, &mut _type) } {
::Result::Ok => Ok(_type),
e => Err(e)
}
}
pub fn get_defaults(&self) -> Result<(f32, f32, f32, i32), ::Result> {
let mut frequency = 0f32;
let mut volume = 0f32;
let mut pan = 0f32;
let mut priority = 0i32;
match unsafe { ffi::FMOD_DSP_GetDefaults(self.dsp, &mut frequency, &mut volume, &mut pan, &mut priority) } {
::Result::Ok => Ok((frequency, volume, pan, priority)),
e => Err(e)
}
}
pub fn get_memory_info(&self, MemoryBits(memory_bits): MemoryBits,
EventMemoryBits(event_memory_bits): EventMemoryBits) -> Result<(u32, MemoryUsageDetails), ::Result> {
let mut details = fmod_sys::get_memory_usage_details_ffi(Default::default());
let mut memory_used = 0u32;
match unsafe { ffi::FMOD_DSP_GetMemoryInfo(self.dsp, memory_bits, event_memory_bits, &mut memory_used, &mut details) } {
::Result::Ok => Ok((memory_used, fmod_sys::from_memory_usage_details_ptr(details))),
e => Err(e)
}
}
pub fn set_user_data<T>(&mut self, user_data: &mut T) -> ::Result {
let mut data : *mut c_void = ::std::ptr::null_mut();
unsafe {
match ffi::FMOD_DSP_GetUserData(self.dsp, &mut data) {
::Result::Ok => {
if data.is_null() {
self.user_data.user_data = ::std::ptr::null_mut();
ffi::FMOD_DSP_SetUserData(self.dsp, transmute(&mut self.user_data))
} else {
let tmp : &mut UserData = transmute::<*mut c_void, &mut UserData>(data);
tmp.user_data = transmute::<&mut T, *mut c_void>(user_data);
ffi::FMOD_DSP_SetUserData(self.dsp, transmute(tmp))
}
}
_ => {
self.user_data.user_data = transmute::<&mut T, *mut c_void>(user_data);
ffi::FMOD_DSP_SetUserData(self.dsp, transmute(&mut self.user_data))
}
}
}
}
pub fn get_user_data<'r, T>(&'r self) -> Result<&'r mut T, ::Result> {
unsafe {
let mut user_data : *mut c_void = ::std::ptr::null_mut();
match ffi::FMOD_DSP_GetUserData(self.dsp, &mut user_data) {
::Result::Ok => {
if !user_data.is_null() {
let tmp : &mut UserData = transmute::<*mut c_void, &mut UserData>(user_data);
let tmp2 : &mut T = transmute::<*mut c_void, &mut T>(tmp.user_data);
Ok(tmp2)
} else {
Err(::Result::Ok)
}
},
e => Err(e)
}
}
}
}