summaryrefslogtreecommitdiff
path: root/gstreamer-sharp/Object.custom
blob: 6af70574c65570ebe74b52ab995277957bd0565e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
public object this[string property] {
  get {
    GLib.Value v = GetProperty (property);
    object o = v.Val;
    v.Dispose ();
    return o;
  }
  set {
    GLib.Value v = new GLib.Value (this, property);
    v.Val = value;
    SetProperty (property, v);
    v.Dispose ();
  }
}

[DllImport ("libgobject-2.0-0.dll") ]
static extern IntPtr g_object_class_list_properties (IntPtr klass, out uint n_properties);

[DllImport ("libgobject-2.0-0.dll") ]
static extern IntPtr g_object_class_find_property (IntPtr gclass, IntPtr name);

public PropertyInfo GetPropertyInfo (string property) {
  IntPtr klass = Marshal.ReadIntPtr (Handle);

  IntPtr native_property = GLib.Marshaller.StringToPtrGStrdup (property);
  IntPtr pspec = g_object_class_find_property (klass, native_property);
  GLib.Marshaller.Free (native_property);

  if (pspec == IntPtr.Zero)
    throw new ArgumentException ("Unknown property");

  return new PropertyInfo (pspec);
}

public PropertyInfo[] Properties {
  get {
    uint n_properties;
    IntPtr klass = Marshal.ReadIntPtr (Handle);
    IntPtr properties = g_object_class_list_properties (klass, out n_properties);

    PropertyInfo[] ret = new PropertyInfo[n_properties];
    for (int i = 0; i < n_properties; i++) {
      IntPtr pspec_ptr = Marshal.ReadIntPtr (properties, i * IntPtr.Size);
      ret[i] = new PropertyInfo (pspec_ptr);
    }
    GLib.Marshaller.Free (properties);

    return ret;
  }
}

public void Connect (string signal, DynamicSignalHandler handler) {
  DynamicSignal.Connect (this, signal, handler);
}

public void Disconnect (string signal, DynamicSignalHandler handler) {
  DynamicSignal.Disconnect (this, signal, handler);
}

public object Emit (string signal, params object[] parameters) {
  return DynamicSignal.Emit (this, signal, parameters);
}

[DllImport("libgstreamer-0.10.dll") ]
static extern void gst_object_sink (IntPtr raw);
[DllImport("libgstreamer-0.10.dll") ]
static extern IntPtr gst_object_ref (IntPtr raw);

protected override IntPtr Raw {
  get {
    return base.Raw;
  }
  set {
    if (value != IntPtr.Zero) {
      gst_object_ref (value);
      gst_object_sink (value);
    }
    base.Raw = value;
  }
}


[DllImport("libgstreamer-0.10.dll") ]
static extern bool gst_object_set_parent (IntPtr raw, IntPtr parent);
[DllImport("libgstreamer-0.10.dll") ]
static extern IntPtr gst_object_get_parent (IntPtr raw);

public Gst.Object Parent {
  set {
    bool raw_ret = gst_object_set_parent (Handle, value == null ? IntPtr.Zero : value.Handle);
    if (!raw_ret)
      throw new ApplicationException ();
  }
  get {
    IntPtr raw_ret = gst_object_get_parent (Handle);
    Gst.Object ret = GLib.Object.GetObject (raw_ret, true) as Gst.Object;
    return ret;
  }
}

[DllImport ("gstreamersharpglue-0.10.dll") ]
extern static uint gstsharp_gst_object_get_lock_offset ();

static uint lock_offset = gstsharp_gst_object_get_lock_offset ();
internal IntPtr LockPtr {
  get {
    unsafe {
      IntPtr* raw_ptr = (IntPtr*) ( ( (byte*) Handle) + lock_offset);
      return (*raw_ptr);
    }
  }
}

[DllImport ("libglib-2.0-0.dll") ]
static extern void g_mutex_lock (IntPtr mutex);
[DllImport ("libglib-2.0-0.dll") ]
static extern void g_mutex_unlock (IntPtr mutex);
[DllImport ("libglib-2.0-0.dll") ]
static extern bool g_mutex_trylock (IntPtr mutex);

public void Lock () {
  g_mutex_lock (LockPtr);
}

public void Unlock () {
  g_mutex_unlock (LockPtr);
}

public bool TryLock () {
  return g_mutex_trylock (LockPtr);
}

[DllImport("libgstreamer-0.10.dll") ]
static extern bool gst_object_check_uniqueness (IntPtr list, IntPtr name);

public static bool CheckUniqueness (Gst.Object[] objects, string name) {
  GLib.List list = new GLib.List (objects, typeof (Gst.Object), false, false);
  IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup (name);
  bool raw_ret = gst_object_check_uniqueness (list.Handle, native_name);
  bool ret = raw_ret;
  GLib.Marshaller.Free (native_name);
  return ret;
}