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_SOURCE_H__ 00003 #define __BSE_SOURCE_H__ 00004 #include <bse/bseitem.hh> 00005 #include <bse/gsldefs.hh> 00006 #include <sfi/gbsearcharray.hh> 00007 00008 G_BEGIN_DECLS 00009 00010 /* --- BseSource type macros --- */ 00011 #define BSE_TYPE_SOURCE (BSE_TYPE_ID (BseSource)) 00012 #define BSE_SOURCE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), BSE_TYPE_SOURCE, BseSource)) 00013 #define BSE_SOURCE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), BSE_TYPE_SOURCE, BseSourceClass)) 00014 #define BSE_IS_SOURCE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_SOURCE)) 00015 #define BSE_IS_SOURCE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_SOURCE)) 00016 #define BSE_SOURCE_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_SOURCE, BseSourceClass)) 00017 00018 00019 /* --- BseSource member macros --- */ 00020 #define BSE_SOURCE_PREPARED(src) ((BSE_OBJECT_FLAGS (src) & BSE_SOURCE_FLAG_PREPARED) != 0) 00021 #define BSE_SOURCE_COLLECTED(src) ((BSE_OBJECT_FLAGS (src) & BSE_SOURCE_FLAG_COLLECTED) != 0) 00022 #define BSE_SOURCE_N_ICHANNELS(src) (BSE_SOURCE (src)->channel_defs->n_ichannels) 00023 #define BSE_SOURCE_ICHANNEL_IDENT(src,id) (BSE_SOURCE (src)->channel_defs->ichannel_idents[(id)]) 00024 #define BSE_SOURCE_ICHANNEL_LABEL(src,id) (BSE_SOURCE (src)->channel_defs->ichannel_labels[(id)]) 00025 #define BSE_SOURCE_ICHANNEL_BLURB(src,id) (BSE_SOURCE (src)->channel_defs->ichannel_blurbs[(id)]) 00026 #define BSE_SOURCE_IS_JOINT_ICHANNEL(s,i) ((BSE_SOURCE (s)->channel_defs->ijstreams[(i)] & BSE_SOURCE_JSTREAM_FLAG) != 0) 00027 #define BSE_SOURCE_N_JOINT_ICHANNELS(src) (BSE_SOURCE (src)->channel_defs->n_jstreams) 00028 #define BSE_SOURCE_N_OCHANNELS(src) (BSE_SOURCE (src)->channel_defs->n_ochannels) 00029 #define BSE_SOURCE_OCHANNEL_IDENT(src,id) (BSE_SOURCE (src)->channel_defs->ochannel_idents[(id)]) 00030 #define BSE_SOURCE_OCHANNEL_LABEL(src,id) (BSE_SOURCE (src)->channel_defs->ochannel_labels[(id)]) 00031 #define BSE_SOURCE_OCHANNEL_BLURB(src,id) (BSE_SOURCE (src)->channel_defs->ochannel_blurbs[(id)]) 00032 /* BseSourceClass */ 00033 #define BSE_SOURCE_CLASS_N_ICHANNELS(sc) (BSE_SOURCE_CLASS (sc)->channel_defs.n_ichannels) 00034 #define BSE_SOURCE_CLASS_N_OCHANNELS(sc) (BSE_SOURCE_CLASS (sc)->channel_defs.n_ochannels) 00035 /*< private >*/ 00036 #define BSE_SOURCE_INPUT(src,id) (BSE_SOURCE (src)->inputs + (guint) (id)) 00037 #define BSE_SOURCE_OCHANNEL_OSTREAM(s,oc) ((oc) < BSE_SOURCE_N_OCHANNELS (s) ? (oc) : 0xffffffff) 00038 #define BSE_SOURCE_ICHANNEL_ISTREAM(s,ic) ((ic) < BSE_SOURCE_N_ICHANNELS (s) \ 00039 && !BSE_SOURCE_IS_JOINT_ICHANNEL ((s), (ic)) ? \ 00040 BSE_SOURCE (s)->channel_defs->ijstreams[(ic)] & ~BSE_SOURCE_JSTREAM_FLAG : \ 00041 0xffffffff) 00042 #define BSE_SOURCE_ICHANNEL_JSTREAM(s,ic) ((ic) < BSE_SOURCE_N_ICHANNELS (s) \ 00043 && BSE_SOURCE_IS_JOINT_ICHANNEL ((s), (ic)) ? \ 00044 BSE_SOURCE (s)->channel_defs->ijstreams[(ic)] & ~BSE_SOURCE_JSTREAM_FLAG : \ 00045 0xffffffff) 00046 #define BSE_SOURCE_JSTREAM_FLAG ((guint) 1 << 31) 00047 #define BSE_SOURCE_PRIVATE_INPUTS(src) ((BSE_OBJECT_FLAGS (src) & BSE_SOURCE_FLAG_PRIVATE_INPUTS) != 0) 00048 00049 typedef enum /*< skip >*/ 00050 { 00051 BSE_SOURCE_FLAG_PRIVATE_INPUTS = 1 << (BSE_ITEM_FLAGS_USHIFT + 0), 00052 BSE_SOURCE_FLAG_PREPARED = 1 << (BSE_ITEM_FLAGS_USHIFT + 1), 00053 BSE_SOURCE_FLAG_COLLECTED = 1 << (BSE_ITEM_FLAGS_USHIFT + 2) 00054 } BseSourceFlags; 00055 #define BSE_SOURCE_FLAGS_USHIFT (BSE_ITEM_FLAGS_USHIFT + 3) 00056 00057 typedef struct _BseSourceProbes BseSourceProbes; 00058 typedef void (*BseSourceFreeContextData) (BseSource *source, 00059 gpointer data, 00060 BseTrans *trans); 00061 struct BseSourceOutput { 00062 BseSource *osource; 00063 guint ochannel; 00064 }; 00065 union BseSourceInput { 00066 BseSourceOutput idata; 00067 struct { 00068 guint n_joints; 00069 BseSourceOutput *joints; 00070 } jdata; 00071 }; 00072 struct BseSourceChannelDefs { 00073 guint n_ichannels; 00074 gchar **ichannel_idents; 00075 gchar **ichannel_labels; 00076 gchar **ichannel_blurbs; 00077 guint *ijstreams; 00078 guint n_jstreams; 00079 guint n_ochannels; 00080 gchar **ochannel_idents; 00081 gchar **ochannel_labels; 00082 gchar **ochannel_blurbs; 00083 }; 00084 struct BseSource : BseItem { 00085 BseSourceChannelDefs *channel_defs; 00086 BseSourceInput *inputs; /* [n_ichannels] */ 00087 GSList *outputs; 00088 GBSearchArray *contexts; /* bsearch array of type BseSourceContext */ 00089 SfiReal pos_x, pos_y; 00090 BseSourceProbes *probes; 00091 }; 00092 struct BseSourceClass : BseItemClass { 00093 BseSourceChannelDefs channel_defs; 00094 void (*property_updated) (BseSource *source, /* overridable method */ 00095 guint property_id, 00096 guint64 tick_stamp, 00097 double value, 00098 GParamSpec *pspec); 00099 void (*prepare) (BseSource *source); 00100 void (*context_create) (BseSource *source, 00101 guint context_handle, 00102 BseTrans *trans); 00103 void (*context_connect) (BseSource *source, 00104 guint context_handle, 00105 BseTrans *trans); 00106 void (*context_dismiss) (BseSource *source, 00107 guint context_handle, 00108 BseTrans *trans); 00109 void (*reset) (BseSource *source); 00110 00111 /*< private >*/ 00112 void (*add_input) (BseSource *source, 00113 guint ichannel, 00114 BseSource *osource, 00115 guint ochannel); 00116 void (*remove_input) (BseSource *source, 00117 guint ichannel, 00118 BseSource *osource, 00119 guint ochannel); 00120 BseModuleClass *engine_class; 00121 gboolean filtered_properties; 00122 SfiRing *unprepared_properties; 00123 SfiRing *automation_properties; 00124 }; 00125 00126 guint bse_source_find_ichannel (BseSource *source, 00127 const gchar *ichannel_ident); 00128 guint bse_source_find_ochannel (BseSource *source, 00129 const gchar *ochannel_ident); 00130 BseErrorType bse_source_set_input (BseSource *source, 00131 guint ichannel, 00132 BseSource *osource, 00133 guint ochannel); 00134 BseErrorType bse_source_unset_input (BseSource *source, 00135 guint ichannel, 00136 BseSource *osource, 00137 guint ochannel); 00138 gboolean bse_source_get_input (BseSource *source, 00139 guint ichannel, 00140 BseSource **osourcep, 00141 guint *ochannelp); 00142 void bse_source_must_set_input_loc (BseSource *source, 00143 guint ichannel, 00144 BseSource *osource, 00145 guint ochannel, 00146 const gchar *strloc); 00147 #define bse_source_must_set_input(is,ic,os,oc) \ 00148 bse_source_must_set_input_loc (is, ic, os, oc, G_STRLOC) 00149 00150 00151 /* --- source implementations --- */ 00152 guint bse_source_class_add_ichannel (BseSourceClass *source_class, 00153 const gchar *ident, 00154 const gchar *label, 00155 const gchar *blurb); 00156 guint bse_source_class_add_jchannel (BseSourceClass *source_class, 00157 const gchar *ident, 00158 const gchar *label, 00159 const gchar *blurb); 00160 guint bse_source_class_add_ochannel (BseSourceClass *source_class, 00161 const gchar *ident, 00162 const gchar *label, 00163 const gchar *blurb); 00164 void bse_source_class_inherit_channels (BseSourceClass *source_class); 00165 void bse_source_set_context_imodule (BseSource *source, 00166 guint context_handle, 00167 BseModule *imodule); 00168 void bse_source_set_context_omodule (BseSource *source, 00169 guint context_handle, 00170 BseModule *omodule); 00171 BseModule* bse_source_get_context_imodule (BseSource *source, 00172 guint context_handle); 00173 BseModule* bse_source_get_context_omodule (BseSource *source, 00174 guint context_handle); 00175 void bse_source_flow_access_module (BseSource *source, 00176 guint context_handle, 00177 guint64 tick_stamp, 00178 BseEngineAccessFunc access_func, 00179 gpointer data, 00180 BseFreeFunc data_free_func, 00181 BseTrans *trans); 00182 void bse_source_flow_access_modules (BseSource *source, 00183 guint64 tick_stamp, 00184 BseEngineAccessFunc access_func, 00185 gpointer data, 00186 BseFreeFunc data_free_func, 00187 BseTrans *trans); 00188 void bse_source_access_modules (BseSource *source, 00189 BseEngineAccessFunc access_func, 00190 gpointer data, 00191 BseFreeFunc data_free_func, 00192 BseTrans *trans); 00193 BseErrorType bse_source_check_input (BseSource *source, 00194 guint ichannel, 00195 BseSource *osource, 00196 guint ochannel); 00197 gboolean bse_source_has_output (BseSource *source, 00198 guint ochannel); 00199 void bse_source_backup_ichannels_to_undo (BseSource *source); 00200 void bse_source_backup_ochannels_to_undo (BseSource *source); 00201 void bse_source_input_backup_to_undo (BseSource *source, 00202 guint ichannel, 00203 BseSource *osource, 00204 guint ochannel); 00205 /* convenience */ 00206 void bse_source_class_cache_engine_class (BseSourceClass *source_class, 00207 const BseModuleClass *engine_class); 00208 void bse_source_set_context_module (BseSource *source, 00209 guint context_handle, 00210 BseModule *module); 00211 void bse_source_update_modules (BseSource *source, 00212 guint member_offset, 00213 gpointer member_data, 00214 guint member_size, 00215 BseTrans *trans); 00216 void bse_source_clear_ichannels (BseSource *source); 00217 void bse_source_clear_ochannels (BseSource *source); 00218 BseMusicalTuningType bse_source_prepared_musical_tuning (BseSource *source); 00219 00220 /* automation */ 00221 typedef struct { 00222 GParamSpec *pspec; 00223 guint midi_channel; 00224 BseMidiSignalType signal_type; 00225 } BseAutomationProperty; 00226 BseErrorType bse_source_set_automation_property (BseSource *source, 00227 const gchar *prop_name, 00228 guint midi_channel, 00229 BseMidiSignalType signal_type); 00230 void bse_source_get_automation_property (BseSource *source, 00231 const gchar *prop_name, 00232 guint *pmidi_channel, 00233 BseMidiSignalType *psignal_type); 00234 BseAutomationProperty* bse_source_get_automation_properties (BseSource *source, 00235 guint *n_props); 00236 00237 /* --- internal --- */ 00238 SfiRing* bse_source_collect_inputs_flat (BseSource *source); /* sets mark */ 00239 SfiRing* bse_source_collect_inputs_recursive (BseSource *source); /* sets mark */ 00240 void bse_source_free_collection (SfiRing *ring); /* unsets mark */ 00241 gboolean bse_source_test_input_recursive (BseSource *source, /* sets+unsets mark */ 00242 BseSource *test); 00243 gpointer bse_source_get_context_data (BseSource *source, 00244 guint context_handle); 00245 void bse_source_create_context_with_data (BseSource *source, 00246 guint context_handle, 00247 gpointer data, 00248 BseSourceFreeContextData free_data, 00249 BseTrans *trans); 00250 void bse_source_create_context (BseSource *source, 00251 guint context_handle, 00252 BseTrans *trans); 00253 void bse_source_connect_context (BseSource *source, 00254 guint context_handle, 00255 BseTrans *trans); 00256 void bse_source_dismiss_context (BseSource *source, 00257 guint context_handle, 00258 BseTrans *trans); 00259 void bse_source_recreate_context (BseSource *source, 00260 guint context_handle, 00261 BseTrans *trans); 00262 void bse_source_prepare (BseSource *source); 00263 void bse_source_reset (BseSource *source); 00264 guint* bse_source_context_ids (BseSource *source, 00265 guint *n_ids); 00266 gboolean bse_source_has_context (BseSource *source, 00267 guint context_handle); 00268 SfiRing* bse_source_list_omodules (BseSource *source); 00269 /* implemented in bseprobe.cc */ 00270 void bse_source_clear_probes (BseSource *source); 00271 void bse_source_class_add_probe_signals (BseSourceClass *klass); 00272 void bse_source_probes_modules_changed (BseSource *source); 00273 00274 G_END_DECLS 00275 00276 #endif /* __BSE_SOURCE_H__ */