BEAST/BSE - Better Audio System and Sound Engine  0.8.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
bseobject.hh
Go to the documentation of this file.
00001  // Licensed GNU LGPL v2.1 or later: http://www.gnu.org/licenses/lgpl.html
00002 #ifndef __BSE_OBJECT_H__
00003 #define __BSE_OBJECT_H__
00004 
00005 #include        <bse/bseparam.hh>
00006 
00007 G_BEGIN_DECLS
00008 
00009 /* --- BSE type macros --- */
00010 #define BSE_TYPE_OBJECT              (BSE_TYPE_ID (BseObject))
00011 #define BSE_OBJECT(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), BSE_TYPE_OBJECT, BseObject))
00012 #define BSE_OBJECT_CLASS(class)      (G_TYPE_CHECK_CLASS_CAST ((class), BSE_TYPE_OBJECT, BseObjectClass))
00013 #define BSE_IS_OBJECT(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_OBJECT))
00014 #define BSE_IS_OBJECT_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_OBJECT))
00015 #define BSE_OBJECT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_OBJECT, BseObjectClass))
00016 
00017 /* --- object member/convenience macros --- */
00018 #define BSE_OBJECT_TYPE(object)           (G_TYPE_FROM_INSTANCE (object))
00019 #define BSE_OBJECT_TYPE_NAME(object)      (g_type_name (BSE_OBJECT_TYPE (object)))
00020 #define BSE_OBJECT_UNAME(object)          ((gchar*) g_datalist_id_get_data (&((GObject*) (object))->qdata, bse_quark_uname))
00021 #define BSE_OBJECT_FLAGS(object)          (((BseObject*) (object))->flags)
00022 #define BSE_OBJECT_SET_FLAGS(object, f)   (BSE_OBJECT_FLAGS (object) |= (f))
00023 #define BSE_OBJECT_UNSET_FLAGS(object, f) (BSE_OBJECT_FLAGS (object) &= ~(f))
00024 #define BSE_OBJECT_IS_LOCKED(object)      (((BseObject*) (object))->lock_count > 0)
00025 #define BSE_OBJECT_DISPOSING(object)      ((BSE_OBJECT_FLAGS (object) & BSE_OBJECT_FLAG_DISPOSING) > 0)
00026 #define BSE_OBJECT_IN_RESTORE(object)     ((BSE_OBJECT_FLAGS (object) & BSE_OBJECT_FLAG_IN_RESTORE) > 0)
00027 #define BSE_OBJECT_ID(object)             (((BseObject*) (object))->unique_id)
00028 
00029 /* --- object flags --- */
00030 typedef enum                            /*< skip >*/
00031 {
00032   BSE_OBJECT_FLAG_FIXED_UNAME           = 1 << 0,
00033   BSE_OBJECT_FLAG_DISPOSING             = 1 << 1,
00034   BSE_OBJECT_FLAG_IN_RESTORE            = 1 << 2
00035 } BseObjectFlags;
00036 #define BSE_OBJECT_FLAGS_USHIFT     (3)
00037 #define BSE_OBJECT_FLAGS_MAX_SHIFT  (16)
00038 /* --- typedefs & structures --- */
00039 struct BseObject : GObject {
00040   guint16                flags;
00041   guint16                lock_count;
00042   guint                  unique_id;
00043 };
00044 struct BseObjectClass : GObjectClass {
00045   gboolean              (*editable_property)    (BseObject      *object, /* for set_property/get_property implementations */
00046                                                  guint           param_id,
00047                                                  GParamSpec     *pspec);
00048   /* custom methods for specific object needs, most of them require chaining */
00049   gboolean              (*check_pspec_editable) (BseObject      *object, /* for containers */
00050                                                  GParamSpec     *pspec);
00051   void                  (*set_uname)            (BseObject      *object,
00052                                                  const gchar    *uname);
00053   void                  (*store_private)        (BseObject      *object,
00054                                                  BseStorage     *storage);
00055   void                  (*restore_start)        (BseObject      *object,
00056                                                  BseStorage     *storage);
00057   GTokenType            (*restore_private)      (BseObject      *object,
00058                                                  BseStorage     *storage,
00059                                                  GScanner       *scanner);
00060   void                  (*restore_finish)       (BseObject      *object,
00061                                                  guint            vmajor,
00062                                                  guint            vminor,
00063                                                  guint            vmicro);
00064   void                  (*unlocked)             (BseObject      *object);
00065   BseIcon*              (*get_icon)             (BseObject      *object);
00066 };
00067 
00068 /* --- object class API ---*/
00069 void    bse_object_class_add_property           (BseObjectClass *oclass,
00070                                                  const gchar    *property_group,
00071                                                  guint           property_id,
00072                                                  GParamSpec     *pspec);
00073 void    bse_object_class_add_grouped_property   (BseObjectClass *oclass,
00074                                                  guint           property_id,
00075                                                  GParamSpec     *pspec);
00076 #define bse_object_class_add_param               bse_object_class_add_property
00077 guint   bse_object_class_add_signal             (BseObjectClass *oclass,
00078                                                  const gchar    *signal_name,
00079                                                  GType           return_type,
00080                                                  guint           n_params,
00081                                                  ...);
00082 guint   bse_object_class_add_asignal            (BseObjectClass *oclass,
00083                                                  const gchar    *signal_name,
00084                                                  GType           return_type,
00085                                                  guint           n_params,
00086                                                  ...);
00087 guint   bse_object_class_add_dsignal            (BseObjectClass *oclass,
00088                                                  const gchar    *signal_name,
00089                                                  GType           return_type,
00090                                                  guint           n_params,
00091                                                  ...);
00092 
00093 
00094 /* --- object API --- */
00095 void            bse_object_lock                 (gpointer        object);
00096 void            bse_object_unlock               (gpointer        object);
00097 gboolean        bse_object_editable_property    (gpointer        object,
00098                                                  const gchar    *property);
00099 BseIcon*        bse_object_get_icon             (BseObject      *object);
00100 void            bse_object_notify_icon_changed  (BseObject      *object);
00101 gpointer        bse_object_from_id              (guint           unique_id);
00102 GList*          bse_objects_list                (GType           type);
00103 GList*          bse_objects_list_by_uname       (GType           type,
00104                                                  const gchar    *uname);
00105 void            bse_object_debug_leaks          (void);
00106 const gchar*    bse_object_debug_name           (gpointer        object);
00107 gchar*          bse_object_strdup_debug_handle  (gpointer        object);
00108 void            bse_object_restore_start        (BseObject      *object,
00109                                                  BseStorage     *storage);
00110 void            bse_object_restore_finish       (BseObject      *object,
00111                                                  guint            vmajor,
00112                                                  guint            vminor,
00113                                                  guint            vmicro);
00114 void            bse_object_reemit_signal        (gpointer        src_object,
00115                                                  const gchar    *src_signal,
00116                                                  gpointer        dest_obejct,
00117                                                  const gchar    *dest_signal);
00118 void            bse_object_remove_reemit        (gpointer        src_object,
00119                                                  const gchar    *src_signal,
00120                                                  gpointer        dest_object,
00121                                                  const gchar    *dest_signal);
00122 static inline void
00123 bse_object_proxy_notifies       (gpointer        src_object,
00124                                  gpointer        dest_object,
00125                                  const gchar    *dest_signal)
00126 {
00127   bse_object_reemit_signal (src_object, "notify::uname", dest_object, dest_signal);
00128   bse_object_reemit_signal (src_object, "icon-changed", dest_object, dest_signal);
00129 }
00130 static inline void
00131 bse_object_unproxy_notifies     (gpointer        src_object,
00132                                  gpointer        dest_object,
00133                                  const gchar    *dest_signal)
00134 {
00135   bse_object_remove_reemit (src_object, "notify::uname", dest_object, dest_signal);
00136   bse_object_remove_reemit (src_object, "icon-changed", dest_object, dest_signal);
00137 }
00138 
00139 
00140 /* --- implementation details --- */
00141 extern GQuark bse_quark_uname;
00142 void          bse_object_marshal_signal (GClosure       *closure,
00143                                          GValue /*out*/ *return_value,
00144                                          guint           n_param_values,
00145                                          const GValue   *param_values,
00146                                          gpointer        invocation_hint,
00147                                          gpointer        marshal_data);
00148 
00149 G_END_DECLS
00150 
00151 #endif /* __BSE_OBJECT_H__ */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines