use ffi::*;
use element::Element;
use util::*;
use iterator::Iter;
use ::Transfer;
use reference::Reference;
use std::ops::{Deref, DerefMut};
pub struct Bin{
bin: Element
}
unsafe impl Sync for Bin {}
unsafe impl Send for Bin {}
impl Bin{
pub fn new(name: &str) -> Option<Bin>{
unsafe{
let cname = CString::new(name).unwrap();
let name = if name != "" {
cname.as_ptr()
} else {
ptr::null()
};
let bin = gst_bin_new(name);
if bin != ptr::null_mut(){
gst_object_ref_sink(mem::transmute(bin));
Bin::new_from_gst_bin(bin as *mut GstBin)
}else{
None
}
}
}
pub unsafe fn new_from_gst_bin(element: *mut GstBin) -> Option<Bin>{
match Element::new_from_gst_element(element as *mut GstElement){
Some(element) => Some( Bin{ bin: element } ),
None => None
}
}
pub fn add<E: Into<Element>>(&mut self, element: E) -> bool{
unsafe{
gst_bin_add(self.gst_bin_mut(), element.into().transfer()) == 1
}
}
pub fn add_and_link<E: Into<Element>>(&mut self, src: E, sink: E) -> bool{
let mut src = src.into();
let mut sink = sink.into();
self.add(src.reference()) &&
self.add(sink.reference()) &&
src.link(&mut sink)
}
pub fn add_many(&mut self, elements: Vec<Element>)->bool{
elements.into_iter().fold(true, |ret, e| {
ret && self.add(e)
})
}
pub fn add_and_link_many(&mut self, mut elements: Vec<Element>)->bool{
elements.iter().fold(true, |ret, element|{
ret && self.add(element.reference())
}) && Element::link_many(&elements.iter_mut().collect::<Vec<_>>())
}
pub fn remove(&mut self, element: &Element) -> bool{
unsafe{
gst_bin_remove(self.gst_bin_mut(), mem::transmute(element.gst_element())) == 1
}
}
pub fn get_by_name(&self, name: &str) -> Option<Element>{
let cname = CString::new(name).unwrap();
unsafe{
let element = gst_bin_get_by_name(self.gst_bin() as *mut GstBin, cname.as_ptr());
Element::new_from_gst_element(element)
}
}
pub fn get_by_name_recurse_up(&self, name: &str) -> Option<Element>{
let cname = CString::new(name).unwrap();
unsafe{
let element = gst_bin_get_by_name_recurse_up(self.gst_bin() as *mut GstBin, cname.as_ptr());
Element::new_from_gst_element(element)
}
}
pub fn iter(&self) -> Iter<Element>{
unsafe{
let bin = self.bin.gst_element() as *mut GstBin;
Iter::new_from_gst_iterator(gst_bin_iterate_elements(bin)).unwrap()
}
}
pub fn recalculate_latency(&mut self) -> bool{
unsafe{
gst_bin_recalculate_latency(self.gst_bin() as *mut GstBin) == 1
}
}
pub fn set_async_handling(&mut self, async: bool){
self.set("async-handling", async);
}
pub fn set_message_forward(&mut self, forward: bool){
self.set("message-forward", forward);
}
pub unsafe fn gst_bin(&self) -> *const GstBin{
self.bin.gst_element() as *const GstBin
}
pub unsafe fn gst_bin_mut(&mut self) -> *mut GstBin{
self.bin.gst_element() as *mut GstBin
}
}
impl AsRef<Element> for Bin{
fn as_ref(&self) -> &Element{
&self.bin
}
}
impl AsMut<Element> for Bin{
fn as_mut(&mut self) -> &mut Element{
&mut self.bin
}
}
impl From<Bin> for Element{
fn from(b: Bin) -> Element{
b.bin
}
}
impl Deref for Bin{
type Target = Element;
fn deref(&self) -> &Element{
&self.bin
}
}
impl DerefMut for Bin{
fn deref_mut(&mut self) -> &mut Element{
&mut self.bin
}
}
impl ::Transfer for Bin{
unsafe fn transfer(self) -> *mut GstElement{
self.bin.transfer()
}
}
impl Reference for Bin{
fn reference(&self) -> Bin{
Bin{bin: self.bin.reference()}
}
}