use ffi::*;
use element::Element;
use element::ElementT;
use util::*;
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 bin = gst_bin_new(to_c_str!(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 trait BinT: ElementT{
fn as_bin(&self) -> &Bin;
fn as_bin_mut(&mut self) -> &mut Bin;
fn to_bin(&self) -> Bin{
Bin{bin: self.to_element()}
}
fn add<E:ElementT>(&mut self, element: E) -> bool{
self.as_bin_mut().add(element)
}
fn remove(&mut self, element: &ElementT) -> bool{
self.as_bin_mut().remove(element)
}
fn get_by_name(&self, name: &str) -> Option<Element>{
self.as_bin().get_by_name(name)
}
fn recalculate_latency(&self) -> bool{
self.as_bin().recalculate_latency()
}
fn set_async_handling(&self, async: bool){
self.as_bin().set_async_handling(async)
}
fn set_message_forward(&self, forward: bool){
self.as_bin().set_message_forward(forward)
}
unsafe fn gst_bin(&self) -> *const GstBin{
self.as_bin().gst_bin()
}
unsafe fn gst_bin_mut(&mut self) -> *mut GstBin{
self.as_bin_mut().gst_bin_mut()
}
}
impl BinT for Bin{
fn add<E>(&mut self, element: E) -> bool
where E:ElementT{
unsafe{
gst_bin_add(self.gst_bin_mut(), element.transfer() as *mut GstElement) == 1
}
}
fn as_bin(&self) -> &Bin{
self
}
fn as_bin_mut(&mut self) -> &mut Bin{
self
}
fn remove(&mut self, element: &ElementT) -> bool{
unsafe{
gst_bin_remove(self.gst_bin_mut(), mem::transmute(element.gst_element())) == 1
}
}
fn get_by_name(&self, name: &str) -> Option<Element>{
unsafe{
let element = gst_bin_get_by_name(self.gst_bin() as *mut GstBin, to_c_str!(name));
Element::new_from_gst_element(element)
}
}
fn recalculate_latency(&self) -> bool{
unsafe{
gst_bin_recalculate_latency(self.gst_bin() as *mut GstBin) == 1
}
}
fn set_async_handling(&self, async: bool){
self.bin.set("async-handling", async);
}
fn set_message_forward(&self, forward: bool){
self.bin.set("message-forward", forward);
}
unsafe fn gst_bin(&self) -> *const GstBin{
self.bin.gst_element() as *const GstBin
}
unsafe fn gst_bin_mut(&mut self) -> *mut GstBin{
self.bin.gst_element() as *mut GstBin
}
}
impl<B:BinT> ElementT for B{
fn as_element(&self) -> &Element{
&self.as_bin().bin
}
fn as_element_mut(&mut self) -> &mut Element{
&mut self.as_bin_mut().bin
}
}
impl ::Transfer for Bin{
unsafe fn transfer(self) -> *mut GstElement{
self.bin.transfer()
}
}