diff --git a/gstreamer-sharp/Application.cs b/gstreamer-sharp/Application.cs
index 1bd140843f..80da1fc446 100644
--- a/gstreamer-sharp/Application.cs
+++ b/gstreamer-sharp/Application.cs
@@ -41,6 +41,7 @@ namespace Gst {
int argc = 0;
gst_init (ref argc, ref argv);
+ gst_controller_init (ref argc, ref argv);
RegisterManagedTypes ();
}
@@ -147,6 +148,8 @@ namespace Gst {
throw new ApplicationException (init_call + " returned a new argv handle");
}
+ gst_controller_init (ref argc, ref argv_ptr);
+
if (argc <= 1) {
args = new string[0];
} else {
@@ -163,6 +166,9 @@ namespace Gst {
[DllImport("libgstreamer-0.10.dll") ]
private static extern bool gst_init_check (ref int argc, ref IntPtr argv, out IntPtr error);
+ [DllImport("libgstcontroller-0.10.dll") ]
+ private static extern void gst_controller_init (ref int argc, ref IntPtr argv);
+
[DllImport("libgstreamer-0.10.dll") ]
private static extern void gst_deinit();
}
diff --git a/gstreamer-sharp/ControlSource.custom b/gstreamer-sharp/ControlSource.custom
new file mode 100644
index 0000000000..d3cdc9a51c
--- /dev/null
+++ b/gstreamer-sharp/ControlSource.custom
@@ -0,0 +1,338 @@
+
+[DllImport ("gstreamersharpglue-0.10.dll") ]
+static extern uint gst__controllersharp_gst__controller_controlsource_get_get_value_offset ();
+
+static uint get_value_offset = gst__controllersharp_gst__controller_controlsource_get_get_value_offset ();
+
+[StructLayout (LayoutKind.Sequential) ]
+struct GstValueArray {
+ public IntPtr property_name;
+ public int nbsamples;
+ public ulong sample_interval;
+ public IntPtr values;
+}
+
+[StructLayout (LayoutKind.Sequential) ]
+struct GstControlSourceCallbacks {
+ public GetValueCallbackNative get_value;
+ public GetValueArrayCallbackNative get_value_array;
+}
+
+delegate bool GetValueCallbackNative (IntPtr raw, ulong timestamp, ref GLib.Value val);
+delegate bool GetValueArrayCallbackNative (IntPtr raw, ulong timestamp, ref GstValueArray va);
+
+public delegate bool GetValueCallback (ulong timestamp, ref GLib.Value value);
+public delegate System.Array GetValueArrayCallback (ulong timestamp, int nsamples, ulong interval);
+
+private GetValueCallbackWrapper GetValue_cb_wrapper;
+private GetValueArrayCallbackWrapper GetValueArray_cb_wrapper;
+
+private class GetValueCallbackWrapper {
+ public bool NativeCallback (IntPtr raw, ulong timestamp, ref GLib.Value val) {
+ try {
+ bool __ret = managed (timestamp, ref val);
+
+ return __ret;
+ } catch (Exception e) {
+ GLib.ExceptionManager.RaiseUnhandledException (e, true);
+ // NOTREACHED: Above call does not return.
+ throw e;
+ }
+ }
+
+ internal GetValueCallbackNative NativeDelegate;
+ GetValueCallback managed;
+
+ public GetValueCallbackWrapper (GetValueCallback managed) {
+ this.managed = managed;
+ if (managed != null)
+ NativeDelegate = new GetValueCallbackNative (NativeCallback);
+ }
+
+ public static GetValueCallback GetManagedDelegate (GetValueCallbackNative native) {
+ if (native == null)
+ return null;
+ GetValueCallbackWrapper wrapper = (GetValueCallbackWrapper) native.Target;
+ if (wrapper == null)
+ return null;
+ return wrapper.managed;
+ }
+}
+
+private class GetValueArrayCallbackWrapper {
+ public bool NativeCallback (IntPtr raw, ulong timestamp, ref GstValueArray va) {
+ try {
+ System.Array values = managed (timestamp, va.nbsamples, va.sample_interval);
+ if (values == null)
+ return false;
+
+ System.Type t = values.GetType ();
+ if (t == typeof (string[])) {
+ string[] ret = (string[]) values;
+
+ for (int i = 0; i < va.nbsamples; i++) {
+ Marshal.WriteIntPtr (va.values, i * IntPtr.Size, GLib.Marshaller.StringToPtrGStrdup (ret[i]));
+ }
+ } else if (t == typeof (short[])) {
+ short[] ret = (short[]) values;
+
+ for (int i = 0; i < va.nbsamples; i++) {
+ Marshal.WriteInt16 (va.values, i * 2, ret[i]);
+ }
+ } else if (t == typeof (ushort[])) {
+ ushort[] ret = (ushort[]) values;
+
+ for (int i = 0; i < va.nbsamples; i++) {
+ Marshal.WriteInt16 (va.values, i * 2, (short) ret[i]);
+ }
+ } else if (t == typeof (int[])) {
+ int[] ret = (int[]) values;
+
+ for (int i = 0; i < va.nbsamples; i++) {
+ Marshal.WriteInt32 (va.values, i * 4, ret[i]);
+ }
+ } else if (t == typeof (uint[])) {
+ uint[] ret = (uint[]) values;
+
+ for (int i = 0; i < va.nbsamples; i++) {
+ Marshal.WriteInt32 (va.values, i * 4, (int) ret[i]);
+ }
+ } else if (t == typeof (long[])) {
+ long[] ret = (long[]) values;
+
+ for (int i = 0; i < va.nbsamples; i++) {
+ Marshal.WriteInt64 (va.values, i * 8, ret[i]);
+ }
+ } else if (t == typeof (ulong[])) {
+ ulong[] ret = (ulong[]) values;
+
+ for (int i = 0; i < va.nbsamples; i++) {
+ Marshal.WriteInt64 (va.values, i * 8, (long) ret[i]);
+ }
+ } else if (t == typeof (float[])) {
+ float[] ret = (float[]) values;
+ Marshal.Copy (ret, 0, va.values, va.nbsamples);
+ } else if (t == typeof (double[])) {
+ double[] ret = (double[]) values;
+ Marshal.Copy (ret, 0, va.values, va.nbsamples);
+ } else if (t == typeof (bool[])) {
+ bool[] ret = (bool[]) values;
+
+ for (int i = 0; i < va.nbsamples; i++) {
+ Marshal.WriteInt32 (va.values, i * 4, ret[i] == false ? 0 : 1);
+ }
+ }
+
+ return true;
+ } catch (Exception e) {
+ GLib.ExceptionManager.RaiseUnhandledException (e, true);
+ // NOTREACHED: Above call does not return.
+ throw e;
+ }
+ }
+
+ internal GetValueArrayCallbackNative NativeDelegate;
+ GetValueArrayCallback managed;
+
+ public GetValueArrayCallbackWrapper (GetValueArrayCallback managed) {
+ this.managed = managed;
+ if (managed != null)
+ NativeDelegate = new GetValueArrayCallbackNative (NativeCallback);
+ }
+
+ public static GetValueArrayCallback GetManagedDelegate (GetValueArrayCallbackNative native) {
+ if (native == null)
+ return null;
+ GetValueArrayCallbackWrapper wrapper = (GetValueArrayCallbackWrapper) native.Target;
+ if (wrapper == null)
+ return null;
+ return wrapper.managed;
+ }
+}
+
+public void SetCallbacks (GetValueCallback get_value, GetValueArrayCallback get_value_array) {
+ IntPtr off = new IntPtr (Handle.ToInt64 () + get_value_offset);
+
+ GstControlSourceCallbacks cbs = (GstControlSourceCallbacks) Marshal.PtrToStructure (new IntPtr (Handle.ToInt64 () + get_value_offset), typeof (GstControlSourceCallbacks));
+
+ GetValueCallbackWrapper gv_wr = new GetValueCallbackWrapper (get_value);
+ GetValueArrayCallbackWrapper gva_wr = new GetValueArrayCallbackWrapper (get_value_array);
+
+ GetValue_cb_wrapper = gv_wr;
+ GetValueArray_cb_wrapper = gva_wr;
+
+ cbs.get_value = gv_wr.NativeCallback;
+ cbs.get_value_array = gva_wr.NativeCallback;
+
+ Marshal.StructureToPtr (cbs, off, false);
+}
+
+[DllImport ("gstreamersharpglue-0.10.dll") ]
+static extern bool gst__controllersharp_gst__controller_controlsource_base_bind (IntPtr handle, IntPtr pspec);
+
+[DllImport ("gstreamersharpglue-0.10.dll") ]
+static extern void gst__controllersharp_gst__controller_controlsource_override_bind (IntPtr gtype, BindNativeDelegate cb);
+
+[GLib.CDeclCallback]
+delegate bool BindNativeDelegate (IntPtr handler, IntPtr pspec);
+
+static BindNativeDelegate Bind_cb_delegate;
+
+static BindNativeDelegate BindVMCallback {
+ get {
+ if (Bind_cb_delegate == null)
+ Bind_cb_delegate = new BindNativeDelegate (Bind_cb);
+ return Bind_cb_delegate;
+ }
+}
+
+static void OverrideBind (GLib.GType gtype) {
+ OverrideBind (gtype, BindVMCallback);
+}
+
+static void OverrideBind (GLib.GType gtype, BindNativeDelegate callback) {
+ gst__controllersharp_gst__controller_controlsource_override_bind (gtype.Val, callback);
+}
+
+static bool Bind_cb (IntPtr inst, IntPtr pspec) {
+ try {
+ ControlSource __obj = GLib.Object.GetObject (inst, false) as ControlSource;
+ Gst.PropertyInfo pinfo = new Gst.PropertyInfo (pspec);
+ return __obj.OnBind (pinfo);
+ } catch (Exception e) {
+ GLib.ExceptionManager.RaiseUnhandledException (e, false);
+ return false;
+ }
+}
+
+[DllImport ("libgobject-2.0-0.dll") ]
+static extern IntPtr g_object_class_find_property (IntPtr klass, IntPtr property);
+
+[GLib.DefaultSignalHandler (Type=typeof (Gst.Controller.ControlSource), ConnectionMethod="OverrideBind") ]
+protected virtual bool OnBind (Gst.PropertyInfo pinfo) {
+ IntPtr klass = Marshal.ReadIntPtr (Handle);
+ IntPtr native_property = GLib.Marshaller.StringToPtrGStrdup (pinfo.Name);
+ IntPtr pspec = g_object_class_find_property (klass, native_property);
+ GLib.Marshaller.Free (native_property);
+
+ if (pspec == IntPtr.Zero)
+ return false;
+
+ return gst__controllersharp_gst__controller_controlsource_base_bind (this.Handle, pspec);
+}
+
+[DllImport ("libgstcontroller-0.10.dll") ]
+static extern bool gst_control_source_get_value_array (IntPtr raw, ulong timestamp, ref GstValueArray value_array);
+
+[DllImport ("libglib-2.0-0.dll") ]
+static extern IntPtr g_try_malloc (int size);
+
+static readonly Type[] supported_types = new Type[] {
+ typeof (string),
+ typeof (short),
+ typeof (ushort),
+ typeof (int),
+ typeof (uint),
+ typeof (long),
+ typeof (ulong),
+ typeof (float),
+ typeof (double),
+ typeof (bool)
+};
+
+public System.Array GetValueArray (ulong timestamp, int nsamples, ulong interval) {
+ GstValueArray va = new GstValueArray ();
+ GLib.Value v = GLib.Value.Empty;
+
+ if (!GetValue (0, ref v))
+ return null;
+
+ System.Type t = v.Val.GetType ();
+ v.Dispose ();
+
+ bool supported = false;
+ foreach (System.Type tmp in supported_types)
+ if (tmp == t)
+ supported = true;
+ if (!supported)
+ throw new Exception ("Unsupported type '" + t + "'");
+
+ int eltsize = Marshal.SizeOf (t);
+ va.values = g_try_malloc (eltsize * nsamples);
+ if (va.values == IntPtr.Zero)
+ throw new OutOfMemoryException ();
+
+ va.nbsamples = nsamples;
+ va.sample_interval = interval;
+
+ bool raw_ret = gst_control_source_get_value_array (Handle, timestamp, ref va);
+
+ if (!raw_ret) {
+ GLib.Marshaller.Free (va.values);
+ return null;
+ }
+
+ System.Array values = Array.CreateInstance (t, nsamples);
+
+ if (t == typeof (string)) {
+ string[] ret = (string[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ IntPtr str = Marshal.ReadIntPtr (va.values, i * IntPtr.Size);
+ ret[i] = GLib.Marshaller.PtrToStringGFree (str);
+ }
+ } else if (t == typeof (short)) {
+ short[] ret = (short[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = Marshal.ReadInt16 (va.values, i * 2);
+ }
+ } else if (t == typeof (ushort)) {
+ ushort[] ret = (ushort[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = (ushort) Marshal.ReadInt16 (va.values, i * 2);
+ }
+ } else if (t == typeof (int)) {
+ int[] ret = (int[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = Marshal.ReadInt32 (va.values, i * 4);
+ }
+ } else if (t == typeof (uint)) {
+ uint[] ret = (uint[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = (uint) Marshal.ReadInt32 (va.values, i * 4);
+ }
+ } else if (t == typeof (long)) {
+ long[] ret = (long[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = Marshal.ReadInt64 (va.values, i * 8);
+ }
+ } else if (t == typeof (ulong)) {
+ ulong[] ret = (ulong[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = (ulong) Marshal.ReadInt64 (va.values, i * 8);
+ }
+ } else if (t == typeof (float)) {
+ float[] ret = (float[]) values;
+ Marshal.Copy (va.values, ret, 0, nsamples);
+ } else if (t == typeof (double)) {
+ double[] ret = (double[]) values;
+ Marshal.Copy (va.values, ret, 0, nsamples);
+ } else if (t == typeof (bool)) {
+ bool[] ret = (bool[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = Marshal.ReadInt32 (va.values, i * 4) != 0;
+ }
+ }
+
+ GLib.Marshaller.Free (va.values);
+
+ return values;
+}
+
diff --git a/gstreamer-sharp/Controller.custom b/gstreamer-sharp/Controller.custom
new file mode 100644
index 0000000000..3613b1e071
--- /dev/null
+++ b/gstreamer-sharp/Controller.custom
@@ -0,0 +1,187 @@
+[DllImport ("libgstcontroller-0.10.dll") ]
+static extern IntPtr gst_controller_new_list (IntPtr objekt, IntPtr list);
+
+public Controller (GLib.Object objekt, string[] properties) : base (IntPtr.Zero) {
+ if (GetType () != typeof (Controller)) {
+ throw new InvalidOperationException ("Can't override this constructor.");
+ }
+ GLib.List list = new GLib.List (properties, typeof (string), true, true);
+
+ Raw = gst_controller_new_list (objekt == null ? IntPtr.Zero : objekt.Handle, list == null ? IntPtr.Zero : list.Handle);
+}
+
+public Controller (GLib.Object objekt, string property) : this (objekt, new string[] {property}) { }
+
+[DllImport ("libgstcontroller-0.10.dll") ]
+static extern bool gst_controller_remove_properties_list (IntPtr raw, IntPtr list);
+
+public bool RemoveProperties (string[] properties) {
+ GLib.List list = new GLib.List (properties, typeof (string), true, true);
+
+ bool raw_ret = gst_controller_remove_properties_list (Handle, list == null ? IntPtr.Zero : list.Handle);
+ bool ret = raw_ret;
+ return ret;
+}
+
+public bool RemoveProperty (string property) {
+ return RemoveProperties (new string[] {property});
+}
+
+
+[DllImport ("gstreamersharpglue-0.10.dll") ]
+extern static uint gst__controllersharp_gst__controller_controller_get_properties_offset ();
+
+static uint properties_offset = gst__controllersharp_gst__controller_controller_get_properties_offset ();
+public string[] Properties {
+ get {
+ GLib.List properties_list;
+
+ unsafe {
+ IntPtr* raw_ptr = (IntPtr*) ( ( (byte*) Handle) + properties_offset);
+ properties_list = new GLib.List ( (*raw_ptr), typeof (string));
+ }
+
+ string[] properties = new string[properties_list.Count];
+ for (int i = 0; i < properties_list.Count; i++)
+ properties[i] = (string) properties_list[i];
+
+ return properties;
+ }
+}
+
+[DllImport ("gstreamersharpglue-0.10.dll") ]
+extern static uint gst__controllersharp_gst__controller_controller_get_object_offset ();
+
+static uint object_offset = gst__controllersharp_gst__controller_controller_get_object_offset ();
+public GLib.Object Object {
+ get {
+ unsafe {
+ IntPtr* raw_ptr = (IntPtr*) ( ( (byte*) Handle) + object_offset);
+ return GLib.Object.GetObject ( (*raw_ptr));
+ }
+ }
+}
+
+[StructLayout (LayoutKind.Sequential) ]
+struct GstValueArray {
+ public IntPtr property_name;
+ public int nbsamples;
+ public ulong sample_interval;
+ public IntPtr values;
+}
+
+[DllImport ("libgstcontroller-0.10.dll") ]
+static extern bool gst_controller_get_value_array (IntPtr raw, ulong timestamp, ref GstValueArray value_array);
+
+[DllImport ("libglib-2.0-0.dll") ]
+static extern IntPtr g_try_malloc (int size);
+
+static readonly Type[] supported_types = new Type[] {
+ typeof (string),
+ typeof (short),
+ typeof (ushort),
+ typeof (int),
+ typeof (uint),
+ typeof (long),
+ typeof (ulong),
+ typeof (float),
+ typeof (double),
+ typeof (bool)
+};
+
+public System.Array GetValueArray (string property, ulong timestamp, int nsamples, ulong interval) {
+ GstValueArray va = new GstValueArray ();
+
+ Gst.Object ob = (Gst.Object) this.Object;
+ Gst.PropertyInfo pi = ob.GetPropertyInfo (property);
+ System.Type t = (System.Type) pi.GType;
+
+ bool supported = false;
+ foreach (System.Type tmp in supported_types)
+ if (tmp == t)
+ supported = true;
+ if (!supported)
+ throw new Exception ("Unsupported type '" + t + "'");
+
+ int eltsize = Marshal.SizeOf (t);
+ va.values = g_try_malloc (eltsize * nsamples);
+ if (va.values == IntPtr.Zero)
+ throw new OutOfMemoryException ();
+
+ va.property_name = GLib.Marshaller.StringToPtrGStrdup (property);
+ va.nbsamples = nsamples;
+ va.sample_interval = interval;
+
+ bool raw_ret = gst_controller_get_value_array (Handle, timestamp, ref va);
+
+ if (!raw_ret) {
+ GLib.Marshaller.Free (va.property_name);
+ GLib.Marshaller.Free (va.values);
+ return null;
+ }
+
+ System.Array values = Array.CreateInstance (t, nsamples);
+
+ if (t == typeof (string)) {
+ string[] ret = (string[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ IntPtr str = Marshal.ReadIntPtr (va.values, i * IntPtr.Size);
+ ret[i] = GLib.Marshaller.PtrToStringGFree (str);
+ }
+ } else if (t == typeof (short)) {
+ short[] ret = (short[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = Marshal.ReadInt16 (va.values, i * 2);
+ }
+ } else if (t == typeof (ushort)) {
+ ushort[] ret = (ushort[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = (ushort) Marshal.ReadInt16 (va.values, i * 2);
+ }
+ } else if (t == typeof (int)) {
+ int[] ret = (int[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = Marshal.ReadInt32 (va.values, i * 4);
+ }
+ } else if (t == typeof (uint)) {
+ uint[] ret = (uint[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = (uint) Marshal.ReadInt32 (va.values, i * 4);
+ }
+ } else if (t == typeof (long)) {
+ long[] ret = (long[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = Marshal.ReadInt64 (va.values, i * 8);
+ }
+ } else if (t == typeof (ulong)) {
+ ulong[] ret = (ulong[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = (ulong) Marshal.ReadInt64 (va.values, i * 8);
+ }
+ } else if (t == typeof (float)) {
+ float[] ret = (float[]) values;
+ Marshal.Copy (va.values, ret, 0, nsamples);
+ } else if (t == typeof (double)) {
+ double[] ret = (double[]) values;
+ Marshal.Copy (va.values, ret, 0, nsamples);
+ } else if (t == typeof (bool)) {
+ bool[] ret = (bool[]) values;
+
+ for (int i = 0; i < nsamples; i++) {
+ ret[i] = Marshal.ReadInt32 (va.values, i * 4) != 0;
+ }
+ }
+
+ GLib.Marshaller.Free (va.property_name);
+ GLib.Marshaller.Free (va.values);
+
+ return values;
+}
+
diff --git a/gstreamer-sharp/Gstreamer.metadata b/gstreamer-sharp/Gstreamer.metadata
index 0e051f64ce..2595784f7d 100644
--- a/gstreamer-sharp/Gstreamer.metadata
+++ b/gstreamer-sharp/Gstreamer.metadata
@@ -1057,6 +1057,59 @@
+
+ InterpolateMode
+ LFOWaveform
+ 1
+ 1
+ 1
+
+ Controller
+ 1
+ 1
+ true
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+ ControlSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ref
+
+ InterpolationControlSource
+ ref
+ 1
+ 1
+ LFOControlSource
+ 1
+ 1
+
+
ColorBalanceType
MixerFlags
diff --git a/gstreamer-sharp/Makefile.am b/gstreamer-sharp/Makefile.am
index 57632ea322..e363df6adc 100644
--- a/gstreamer-sharp/Makefile.am
+++ b/gstreamer-sharp/Makefile.am
@@ -109,7 +109,9 @@ customs = \
MixerTrack.custom \
TunerNorm.custom \
TunerChannel.custom \
- Adapter.custom
+ Adapter.custom \
+ Controller.custom \
+ ControlSource.custom
build_customs = $(addprefix $(srcdir)/, $(customs))
diff --git a/gstreamer-sharp/glue/Makefile.am b/gstreamer-sharp/glue/Makefile.am
index d7963eb1eb..d35bf82ef8 100644
--- a/gstreamer-sharp/glue/Makefile.am
+++ b/gstreamer-sharp/glue/Makefile.am
@@ -18,7 +18,9 @@ libgstreamersharpglue_0_10_la_SOURCES = \
indexfactory.c \
mixertrack.c \
tunernorm.c \
- adapter.c
+ adapter.c \
+ controller.c \
+ controlsource.c
nodist_libgstreamersharpglue_0_10_la_SOURCES = generated.c
diff --git a/gstreamer-sharp/glue/controller.c b/gstreamer-sharp/glue/controller.c
new file mode 100644
index 0000000000..a540871bae
--- /dev/null
+++ b/gstreamer-sharp/glue/controller.c
@@ -0,0 +1,14 @@
+#include
+
+guint
+gst__controllersharp_gst__controller_controller_get_properties_offset (void)
+{
+ return (guint)G_STRUCT_OFFSET (GstController, properties);
+}
+
+guint
+gst__controllersharp_gst__controller_controller_get_object_offset (void)
+{
+ return (guint)G_STRUCT_OFFSET (GstController, object);
+}
+
diff --git a/gstreamer-sharp/glue/controlsource.c b/gstreamer-sharp/glue/controlsource.c
new file mode 100644
index 0000000000..173a09e233
--- /dev/null
+++ b/gstreamer-sharp/glue/controlsource.c
@@ -0,0 +1,41 @@
+#include
+#include
+
+guint
+gst__controllersharp_gst__controller_controlsource_get_get_value_offset (void)
+{
+ return (guint)G_STRUCT_OFFSET (GstControlSource, get_value);
+}
+
+const gchar *__gtype_prefix = "__gtksharp_";
+#define HAS_PREFIX(a) (*((guint64 *)(a)) == *((guint64 *) __gtype_prefix))
+
+static GObjectClass *
+get_threshold_class (GObject *obj)
+{
+ GType gtype = G_TYPE_FROM_INSTANCE (obj);
+ while (HAS_PREFIX (g_type_name (gtype)))
+ gtype = g_type_parent (gtype);
+ GObjectClass *klass = g_type_class_peek (gtype);
+ if (klass == NULL) klass = g_type_class_ref (gtype);
+ return klass;
+}
+
+gboolean
+gst__controllersharp_gst__controller_controlsource_base_bind (GstControlSource *csource, GParamSpec *pspec)
+{
+ GstControlSourceClass *parent = (GstControlSourceClass *) get_threshold_class (G_OBJECT (csource));
+ if (parent->bind)
+ return parent->bind (csource, pspec);
+ return FALSE;
+}
+
+void
+gst__controllersharp_gst__controller_controlsource_override_bind (GType gtype, gpointer cb)
+{
+ GstControlSourceClass *klass = g_type_class_peek (gtype);
+ if (!klass)
+ klass = g_type_class_ref (gtype);
+ ((GstControlSourceClass *) klass)->bind = cb;
+}
+
diff --git a/gstreamer-sharp/gstreamer-api.raw b/gstreamer-sharp/gstreamer-api.raw
index e938735dda..fbf4af378d 100644
--- a/gstreamer-sharp/gstreamer-api.raw
+++ b/gstreamer-sharp/gstreamer-api.raw
@@ -6873,6 +6873,310 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gstreamer-sharp/gstreamer-sharp.dll.config.in b/gstreamer-sharp/gstreamer-sharp.dll.config.in
index 4a168ed2fe..f4e440f4be 100644
--- a/gstreamer-sharp/gstreamer-sharp.dll.config.in
+++ b/gstreamer-sharp/gstreamer-sharp.dll.config.in
@@ -3,5 +3,6 @@
+
+ ../../gstreamer/libs/gst/controller
+
+ ../../gstreamer/libs/gst/controller/gstcontrollerprivate.h
+ ../../gstreamer/libs/gst/controller/gstinterpolationcontrolsourceprivate.h
+ ../../gstreamer/libs/gst/controller/gstlfocontrolsourceprivate.h
+
+
../../gst-plugins-base/gst-libs/gst/interfaces