BEAST/BSE - Better Audio System and Sound Engine  0.8.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
bsesource.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_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__ */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines