Example #1
0
 public object this[string property]
 {
     get {
         if (PropertyExists (property)) {
             using (GLib.Value v = GetProperty (property)) {
                 return v.Val;
             }
         } else
             throw new PropertyNotFoundException ();
       } set {
         if (PropertyExists (property)) {
             if (value == null) {
                 throw new ArgumentNullException ();
             }
             var type = value.GetType ();
             var gtype = (GLib.GType)type;
             if (gtype == null) {
                 throw new Exception ("Could not find a GType for type " + type.FullName);
             }
             GLib.Value v = new GLib.Value ((GLib.GType)value.GetType ());
             v.Val = value;
             SetProperty (property, v);
             v.Dispose ();
         } else
             throw new PropertyNotFoundException ();
       }
 }
Example #2
0
        public void Add(Gst.TagMergeMode mode, string tag, object value)
        {
            if (!Tag.Exists (tag))
                throw new ArgumentException (String.Format ("Invalid tag name '{0}'", tag));

            GLib.Value v = new GLib.Value (value);

            AddValue (mode, tag, v);
            v.Dispose ();
        }
Example #3
0
    public PropertyInfo (IntPtr pspec_ptr) {
      GParamSpec pspec = (GParamSpec) Marshal.PtrToStructure (pspec_ptr, typeof (GParamSpec));
      IntPtr name = g_param_spec_get_name (pspec_ptr);
      IntPtr nick = g_param_spec_get_nick (pspec_ptr);
      IntPtr blurb = g_param_spec_get_blurb (pspec_ptr);

      this.name = Gst.GLib.Marshaller.Utf8PtrToString (name);
      this.nick = Gst.GLib.Marshaller.Utf8PtrToString (nick);
      this.blurb = Gst.GLib.Marshaller.Utf8PtrToString (blurb);

      this.readable = ( (pspec.Flags & (1 << 0)) != 0);
      this.writeable = ( (pspec.Flags & (1 << 1)) != 0);
      this.controllable = ( (pspec.Flags & (1 << 9)) != 0);
      /* TODO: Add more flags later, like the mutable flags */

      this.gtype = new Gst.GLib.GType (pspec.ValueType);
      this.type = (System.Type) this.gtype;

      this.dflt = this.min = this.max = null;

      try {
        Gst.GLib.Value v = new Gst.GLib.Value (new Gst.GLib.GType (pspec.ValueType));
        g_param_value_set_default (pspec_ptr, ref v);
        this.dflt = v.Val;
        v.Dispose ();

        if (EnumInfo.IsEnumType (this.gtype)) {
          EnumInfo ei = new EnumInfo (this.gtype);
          this.min = ei.Min;
          this.max = ei.Max;
        } else {
          Gst.GLib.Value min = new Gst.GLib.Value (new Gst.GLib.GType (pspec.ValueType));
          Gst.GLib.Value max = new Gst.GLib.Value (new Gst.GLib.GType (pspec.ValueType));
          if (gstsharp_g_param_spec_get_range (pspec_ptr, ref min, ref max)) {
            this.min = (object) min.Val;
            this.max = (object) max.Val;
          }
          min.Dispose ();
          max.Dispose ();
        }
      } catch (Exception) {}
    }
Example #4
0
 public void SetGValue (ref Gst.GLib.Value val) {
   foreach (object o in content) {
     Gst.GLib.Value v = new Gst.GLib.Value (o);
     gst_value_array_append_value (ref val, ref v);
     v.Dispose ();
   }
 }
Example #5
0
 public void SetGValue (ref Gst.GLib.Value val) {
   Gst.GLib.Value min = new Gst.GLib.Value (Min);
   Gst.GLib.Value max = new Gst.GLib.Value (Max);
   gst_value_set_fraction_range (ref val, ref min, ref max);
   min.Dispose ();
   max.Dispose ();
 }
Example #6
0
    public static object Emit (Gst.GLib.Object o, string name, params object[] parameters) {
      SignalQuery query;
      IntPtr type = gstsharp_g_type_from_instance (o.Handle);
      GType gtype = new GType (type);
      string signal_name, signal_detail;
      uint signal_detail_quark = 0;
      int colon;

      colon = name.LastIndexOf ("::");

      if (colon == -1) {
        signal_name = name;
        signal_detail = String.Empty;
      } else {
        signal_name = name.Substring (0, colon);
        signal_detail = name.Substring (colon + 2);
      }

      GTypeSignalKey key = new GTypeSignalKey (gtype, signal_name);

      if (SignalEmitInfo[key] == null) {
        IntPtr native_string = Gst.GLib.Marshaller.StringToPtrGStrdup (signal_name);
        uint signal_id = g_signal_lookup (native_string, type);
        Gst.GLib.Marshaller.Free (native_string);

        if (signal_id == 0)
          throw new NotSupportedException (String.Format ("{0} has no signal of name {1}", o, name));
        GSignalQuery q = new GSignalQuery ();
        g_signal_query (signal_id, ref q);

        if (q.signal_id == 0)
          throw new NotSupportedException (String.Format ("{0} couldn't be queried for signal with name {1}", o, name));

        query = new SignalQuery ();

        query.signal_id = signal_id;
        query.signal_name = Gst.GLib.Marshaller.Utf8PtrToString (q.signal_name);
        query.itype = new GType (q.itype);
        query.signal_flags = q.signal_flags;
        query.return_type = new GType (q.return_type);
        query.n_params = q.n_params;
        query.param_types = new Type[q.n_params];

        for (int i = 0; i < query.n_params; i++) {
          IntPtr t = Marshal.ReadIntPtr (q.param_types, i);
          GType g = new GType (t);

          query.param_types[i] = (Type) g;
        }

        SignalEmitInfo.Add (key, query);
      }

      query = (SignalQuery) SignalEmitInfo[key];
      Gst.GLib.Value[] signal_parameters = new Gst.GLib.Value[query.n_params + 1];
      signal_parameters[0] = new Gst.GLib.Value (o);

      if (parameters.Length != query.n_params)
        throw new ApplicationException (String.Format ("Invalid number of parameters: expected {0}, got {1}", query.n_params, parameters.Length));

      for (int i = 0; i < query.n_params; i++) {
        Type expected_type = (Type) query.param_types[i];
        Type given_type = parameters[i].GetType ();

        if (expected_type != given_type && ! given_type.IsSubclassOf (given_type))
          throw new ApplicationException (String.Format ("Invalid parameter type: expected {0}, got {1}", expected_type, given_type));

        signal_parameters[i + 1] = new Gst.GLib.Value (parameters[i]);
      }

      Gst.GLib.Value return_value = new Gst.GLib.Value ();
      if (query.return_type != GType.Invalid && query.return_type != GType.None)
        return_value.Init (query.return_type);

      if (signal_detail != String.Empty) {
        IntPtr native_string = Gst.GLib.Marshaller.StringToPtrGStrdup (signal_detail);
        signal_detail_quark = g_quark_from_string (native_string);
        Gst.GLib.Marshaller.Free (native_string);
      }

      g_signal_emitv (signal_parameters, query.signal_id, signal_detail_quark, ref return_value);

      foreach (Gst.GLib.Value v in signal_parameters)
        v.Dispose ();

      object ret = (query.return_type != GType.Invalid && query.return_type != GType.None) ? return_value.Val : null;

      if (ret != null)
        return_value.Dispose ();

      return ret;
    }