BEAST/BSE - Better Audio System and Sound Engine
0.8.2
|
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__ */