Adding first code drop
[demorecorder] / src / MixerBin.vala
diff --git a/src/MixerBin.vala b/src/MixerBin.vala
new file mode 100644 (file)
index 0000000..e8af28d
--- /dev/null
@@ -0,0 +1,126 @@
+/*  Demo Recorder for MAEMO 5
+*   Copyright (C) 2010 Dru Moore <usr@dru-id.co.uk>
+*   This program is free software; you can redistribute it and/or modify
+*   it under the terms of the GNU General Public License version 2,
+*   or (at your option) any later version, as published by the Free
+*   Software Foundation
+*
+*   This program is distributed in the hope that it will be useful,
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*   GNU General Public License for more details
+*
+*   You should have received a copy of the GNU General Public
+*   License along with this program; if not, write to the
+*   Free Software Foundation, Inc.,
+*   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+*/
+namespace IdWorks {
+
+public class MixerBin : Gst.Bin {
+
+  Gst.Element adder;
+  Gst.Element equalizer;
+  Gst.Element panorama;
+  Gst.Element volume;
+  List<TrackBin> tracks;
+  Gst.GhostPad sink_pad;
+  Gst.GhostPad src_pad;
+  
+  public MixerBin(string name) {
+    this.name = name;
+    tracks = new List<TrackBin>();
+    
+    adder      = Gst.ElementFactory.make("adder", "adder_source");
+    this.add(adder);
+    equalizer  = Gst.ElementFactory.make("equalizer-10bands", "eq");
+    this.add(equalizer);
+    panorama = Gst.ElementFactory.make("audiopanorama", "panorama");
+    this.add(panorama);
+    volume    = Gst.ElementFactory.make("volume", "vol");
+    this.add(volume);
+    
+    adder.link(equalizer);
+    equalizer.link(panorama);
+    panorama.link(volume);
+    //volume.link(sink);
+    
+    sink_pad = new Gst.GhostPad("sink", adder.get_static_pad("sink"));
+    this.add_pad(sink_pad);
+    src_pad = new Gst.GhostPad("src", volume.get_static_pad("src"));
+    this.add_pad(src_pad);
+  }
+  
+  public bool add_track(TrackBin bin) {
+    this.add(bin);
+    bin.link(adder);
+    if (null == tracks) {
+      tracks = new List<TrackBin>();
+    }
+    tracks.append(bin);
+    return true;
+  }
+  
+  public void remove_all_tracks() {
+    while (null != tracks.first()) {
+      TrackBin track = tracks.first().data as TrackBin;
+      if (null != track) {
+        track.unlink(adder);
+        this.remove(track);
+      }
+      tracks.remove_link(tracks.first());
+    }
+  }
+  
+  public bool remove_track(TrackBin track) {
+    track.unlink(adder);
+    this.remove(track);
+    tracks.remove(track);
+    return true;
+  }
+  
+  public new Gst.PadTemplate get_pad_template(string name) {
+    switch (name) {
+      case "src":
+        return this.volume.get_pad_template("src");
+      case "sink":
+        return this.adder.get_pad_template("sink");
+      default:
+        return this.get_pad_template(name);
+    }
+  }
+  
+  public void set_volume(double val)
+  requires (val >= 0.0 && val <= 10.0) {
+    volume.set_property("volume", val);
+  }
+  public double get_volume() {
+    GLib.Value ret = 0.0;
+    volume.get_property("volume", ref ret);
+    return ret.get_double();
+  }
+  
+  public void set_panorama(double val) 
+  requires (val >= -1 && val <= 1) {
+    panorama.set_property("panorama", val);
+  }
+  public double get_panorama() {
+    GLib.Value ret = 0.0;
+    panorama.get_property("panorama", ref ret);
+    return ret.get_double();
+  }
+  
+  public void set_eq(int band, double val)
+  requires (band > -1 && band < 10)
+  requires (val >= -24 && val <= 12) {
+    equalizer.set_property("band" + band.to_string(), val);
+  }
+  public double get_eq(int band) {
+    GLib.Value ret = 0.0;
+    equalizer.get_property("band" + band.to_string(), ref ret);
+    return ret.get_double();
+  }
+  
+}
+
+}
\ No newline at end of file