use std::ffi::CString;
use traits::Wrappable;
use system::Time;
use csfml_audio_sys as ffi;
pub struct SoundBuffer {
sound_buffer: *mut ffi::sfSoundBuffer,
dropable: bool
}
impl SoundBuffer {
pub fn new(filename: &str) -> Option<SoundBuffer> {
let c_str = CString::new(filename.as_bytes()).unwrap();
let sound_buffer: *mut ffi::sfSoundBuffer = unsafe {
ffi::sfSoundBuffer_createFromFile(c_str.as_ptr())
};
if sound_buffer.is_null() {
None
} else {
Some(SoundBuffer{
sound_buffer: sound_buffer,
dropable: true
})
}
}
pub fn save_to_file(&self, filename: &str) -> bool {
let c_str = CString::new(filename.as_bytes()).unwrap().as_ptr();
unsafe { ffi::sfSoundBuffer_saveToFile(self.sound_buffer, c_str) }.to_bool()
}
pub fn get_sample_count(&self) -> i64 {
unsafe {
ffi::sfSoundBuffer_getSampleCount(self.sound_buffer) as i64
}
}
pub fn get_channel_count(&self) -> u32 {
unsafe {
ffi::sfSoundBuffer_getChannelCount(self.sound_buffer) as u32
}
}
pub fn get_duration(&self) -> Time {
Wrappable::wrap(unsafe { ffi::sfSoundBuffer_getDuration(self.sound_buffer) })
}
pub fn get_sample_rate(&self) -> u32 {
unsafe {
ffi::sfSoundBuffer_getSampleRate(self.sound_buffer) as u32
}
}
}
impl Clone for SoundBuffer {
fn clone(&self) -> Self {
let sound_buffer = unsafe { ffi::sfSoundBuffer_copy(self.sound_buffer) };
if sound_buffer.is_null() {
panic!("Sound buffer is null");
} else {
SoundBuffer {
sound_buffer: sound_buffer,
dropable: true
}
}
}
}
impl Wrappable<*mut ffi::sfSoundBuffer> for SoundBuffer {
fn wrap(buffer: *mut ffi::sfSoundBuffer) -> SoundBuffer {
SoundBuffer {
sound_buffer: buffer,
dropable: false
}
}
fn unwrap(&self) -> *mut ffi::sfSoundBuffer {
self.sound_buffer
}
}
impl Drop for SoundBuffer {
fn drop(&mut self) {
if self.dropable {
unsafe {
ffi::sfSoundBuffer_destroy(self.sound_buffer);
}
}
}
}