Iterator: Next try to fix crashes
authorStephan Sundermann <stephansundermann@gmail.com>
Sat, 12 Oct 2013 15:54:30 +0000 (17:54 +0200)
committerStephan Sundermann <stephansundermann@gmail.com>
Sat, 21 Dec 2013 15:52:24 +0000 (16:52 +0100)
sources/custom/Iterator.cs
sources/gstreamer-sharp.metadata

index 6ed07b734503e23cf92b49c80fdc5160b79e4fff..543c5e650484b692ea60261052241335485e52a4 100644 (file)
@@ -34,6 +34,15 @@ namespace Gst {
                [DllImport ("libgobject-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
                static extern IntPtr g_value_reset (ref GLib.Value val);
 
+               [DllImport("libgstreamer-1.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
+               static extern int gst_iterator_next(IntPtr raw, ref GLib.Value elem);
+
+               public Gst.IteratorResult Next(ref GLib.Value elem) {
+                       int raw_ret = gst_iterator_next(Handle, ref elem);
+                       Gst.IteratorResult ret = (Gst.IteratorResult) raw_ret;
+                       return ret;
+               }
+
                private class Enumerator : IEnumerator {
                        Iterator iterator;
                        Hashtable seen = new Hashtable ();
@@ -53,11 +62,10 @@ namespace Gst {
                                        return false;
 
                                do {
-                                       GLib.Value value = new GLib.Value ();
-                                       IntPtr ptr = g_value_reset (ref value);
-                                       value = (GLib.Value) Marshal.PtrToStructure (ptr, typeof(GLib.Value));
+                                       GLib.Value value = new GLib.Value (GLib.GType.Boolean);
+                                       value.Dispose ();
 
-                                       IteratorResult ret = iterator.Next (out value);
+                                       IteratorResult ret = iterator.Next (ref value);
 
                                        switch (ret) {
                                        case IteratorResult.Done:
index b66c9d75a9c9ea663cc7b838ad1413c7632eec85..62cbc5a95cc217fb6e71d7034c16f60957d759fc 100644 (file)
@@ -49,6 +49,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
        <attr path="/api/namespace/struct[@cname='GstStructure']" name="native">true</attr>
        <change-node-type path="/api/namespace//boxed[@cname='GstIterator']">struct</change-node-type>
        <attr path="/api/namespace/struct[@cname='GstIterator']" name="native">true</attr>
+       <attr path="/api/namespace/struct[@cname='GstIterator']/method[@cname='gst_iterator_next']" name="hidden">true</attr>
        <remove-node path="/api/namespace/boxed[@cname='GstStructure']/field[@cname='name']" />
        <!-- Maybe some problems with the name -->
        <remove-node path="/api/namespace/interface[@cname='GstURIHandler']/class_struct/method[@vm='get_type']" name="vm" />