BEAST/BSE - Better Audio System and Sound Engine  0.8.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
bseengine.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_ENGINE_H__
00003 #define __BSE_ENGINE_H__
00004 
00005 #include <bse/bsedefs.hh>
00006 
00007 G_BEGIN_DECLS
00008 
00009 /* --- constants --- */
00010 #define BSE_STREAM_MAX_VALUES                   (1024 /* power of 2 and <= 16384 */)
00011 #define BSE_MODULE_N_OSTREAMS(module)           ((module)->klass->n_ostreams)
00012 #define BSE_MODULE_N_ISTREAMS(module)           ((module)->klass->n_istreams)
00013 #define BSE_MODULE_N_JSTREAMS(module)           ((module)->klass->n_jstreams)
00014 #define BSE_MODULE_ISTREAM(module, stream)      ((module)->istreams[(stream)])
00015 #define BSE_MODULE_JSTREAM(module, stream)      ((module)->jstreams[(stream)])
00016 #define BSE_MODULE_OSTREAM(module, stream)      ((module)->ostreams[(stream)])
00017 #define BSE_MODULE_IBUFFER(module, stream)      (BSE_MODULE_ISTREAM ((module), (stream)).values)
00018 #define BSE_MODULE_JBUFFER(module, stream, con) (BSE_MODULE_JSTREAM ((module), (stream)).values[con])
00019 #define BSE_MODULE_OBUFFER(module, stream)      (BSE_MODULE_OSTREAM ((module), (stream)).values)
00020 #define BSE_ENGINE_MAX_POLLFDS                  (128)
00021 
00022 
00023 /* --- typedefs --- */
00024 typedef struct _BseJob                   BseJob;
00025 /* bsedefs.hh:
00026  * typedef void (*BseEngineAccessFunc)  (BseModule      *module,
00027  *                                       gpointer        data);
00028  * typedef void (*BseFreeFunc)          (gpointer        data);
00029  */
00030 typedef gboolean (*BseEnginePollFunc)   (gpointer       data,
00031                                          guint          n_values,
00032                                          glong         *timeout_p,
00033                                          guint          n_fds,
00034                                          const GPollFD *fds,
00035                                          gboolean       revents_filled);
00036 typedef gboolean (*BseEngineTimerFunc)  (gpointer       data,
00037                                          guint64        tick_stamp);
00038 typedef void     (*BseEngineProbeFunc)  (gpointer       data,
00039                                          guint          n_values,       /* bse_engine_block_size() */
00040                                          guint64        tick_stamp,
00041                                          guint          n_ostreams,     /* ENGINE_NODE_N_OSTREAMS() */
00042                                          BseOStream   **ostreams_p);
00043 typedef void     (*BseProcessFunc)      (BseModule     *module,
00044                                          guint          n_values);
00045 typedef guint    (*BseProcessDeferFunc) (BseModule     *module,
00046                                          guint          n_ivalues,
00047                                          guint          n_ovalues);
00048 typedef void     (*BseModuleResetFunc)  (BseModule     *module);
00049 typedef void     (*BseModuleFreeFunc)   (gpointer        data,
00050                                          const BseModuleClass *klass);
00051 
00052 typedef enum    /*< skip >*/
00053 {
00054   BSE_COST_NORMAL       = 0,
00055   BSE_COST_CHEAP        = 1 << 0,
00056   BSE_COST_EXPENSIVE    = 1 << 1
00057 } BseCostType;
00058 /* class, filled out by user */
00059 struct _BseModuleClass
00060 {
00061   guint               n_istreams;
00062   guint               n_jstreams;
00063   guint               n_ostreams;
00064   BseProcessFunc      process;          /* EngineThread */
00065   BseProcessDeferFunc process_defer;    /* EngineThread */
00066   BseModuleResetFunc  reset;            /* EngineThread */
00067   BseModuleFreeFunc   free;             /* UserThread */
00068   BseCostType         mflags;
00069 };
00070 /* module, constructed by engine */
00071 struct _BseModule
00072 {
00073   const BseModuleClass *klass;
00074   gpointer              user_data;
00075   BseIStream           *istreams;       /* input streams */
00076   BseJStream           *jstreams;       /* joint (multiconnect) input streams */
00077   BseOStream           *ostreams;       /* output streams */
00078 };
00079 /* streams, constructed by engine */
00080 struct _BseJStream
00081 {
00082   const gfloat **values;
00083   guint          n_connections; /* scheduler update */
00084   /*< private >*/
00085   guint          jcount;        /* internal field */
00086 };
00087 struct _BseIStream
00088 {
00089   const gfloat *values;
00090   gboolean      connected;      /* scheduler update */
00091 };
00092 struct _BseOStream
00093 {
00094   gfloat     *values;
00095   gboolean    connected;
00096 };
00097 
00098 
00099 /* --- interface (UserThread functions) --- */
00100 BseModule* bse_module_new               (const BseModuleClass *klass,
00101                                          gpointer              user_data);
00102 BseModule* bse_module_new_virtual       (guint                 n_iostreams,
00103                                          gpointer              user_data,
00104                                          BseFreeFunc           free_data);
00105 guint64    bse_module_tick_stamp        (BseModule            *module);
00106 gboolean   bse_module_has_source        (BseModule            *module,
00107                                          guint                 istream);
00108 gboolean   bse_module_is_scheduled      (BseModule            *module);
00109 BseJob*    bse_job_connect              (BseModule            *src_module,
00110                                          guint                 src_ostream,
00111                                          BseModule            *dest_module,
00112                                          guint                 dest_istream);
00113 BseJob*    bse_job_jconnect             (BseModule            *src_module,
00114                                          guint                 src_ostream,
00115                                          BseModule            *dest_module,
00116                                          guint                 dest_jstream);
00117 BseJob*    bse_job_disconnect           (BseModule            *dest_module,
00118                                          guint                 dest_istream);
00119 BseJob*    bse_job_jdisconnect          (BseModule            *dest_module,
00120                                          guint                 dest_jstream,
00121                                          BseModule            *src_module,
00122                                          guint                 src_ostream);
00123 BseJob*    bse_job_kill_inputs          (BseModule            *module);
00124 BseJob*    bse_job_kill_outputs         (BseModule            *module);
00125 BseJob*    bse_job_integrate            (BseModule            *module);
00126 BseJob*    bse_job_discard              (BseModule            *module);
00127 BseJob*    bse_job_force_reset          (BseModule            *module);
00128 BseJob*    bse_job_set_consumer         (BseModule            *module,
00129                                          gboolean              is_toplevel_consumer);
00130 BseJob*    bse_job_suspend_now          (BseModule            *module);
00131 BseJob*    bse_job_resume_at            (BseModule            *module,
00132                                          guint64               tick_stamp);
00133 BseJob*    bse_job_debug                (const gchar          *debug);
00134 BseJob*    bse_job_nop                  (void);
00135 BseJob*    bse_job_add_poll             (BseEnginePollFunc     poll_func,
00136                                          gpointer              data,
00137                                          BseFreeFunc           free_func,
00138                                          guint                 n_fds,
00139                                          const GPollFD        *fds);
00140 BseJob*    bse_job_remove_poll          (BseEnginePollFunc     poll_func,
00141                                          gpointer              data);
00142 BseJob*    bse_job_add_timer            (BseEngineTimerFunc    timer_func,
00143                                          gpointer              data,
00144                                          BseFreeFunc           free_func);
00145 BseJob*    bse_job_access               (BseModule            *module,
00146                                          BseEngineAccessFunc   access_func,     /* EngineThread */
00147                                          gpointer              data,
00148                                          BseFreeFunc           free_func);      /* UserThread */
00149 BseJob*    bse_job_probe_request        (BseModule            *module,
00150                                          BseEngineProbeFunc    probe,           /* UserThread */
00151                                          gpointer              data);
00152 BseJob*    bse_job_flow_access          (BseModule            *module,
00153                                          guint64               tick_stamp,
00154                                          BseEngineAccessFunc   access_func,     /* EngineThread */
00155                                          gpointer              data,
00156                                          BseFreeFunc           free_func);      /* UserThread */
00157 BseJob*    bse_job_boundary_access      (BseModule            *module,
00158                                          guint64               tick_stamp,
00159                                          BseEngineAccessFunc   access_func,     /* EngineThread */
00160                                          gpointer              data,
00161                                          BseFreeFunc           free_func);      /* UserThread */
00162 BseJob*    bse_job_boundary_discard     (BseModule            *module);
00163 BseTrans*  bse_trans_open               (void);
00164 void       bse_trans_add                (BseTrans             *trans,
00165                                          BseJob               *job);
00166 BseTrans*  bse_trans_merge              (BseTrans             *trans1,
00167                                          BseTrans             *trans2);
00168 guint64    bse_trans_commit             (BseTrans             *trans);
00169 void       bse_trans_commit_delayed     (BseTrans             *trans,
00170                                          guint64               tick_stamp);
00171 void       bse_trans_dismiss            (BseTrans             *trans);
00172 void       bse_transact                 (BseJob               *job,
00173                                          ...) G_GNUC_NULL_TERMINATED;
00174 
00175 /* --- module utilities (EngineThread functions) --- */
00176 gfloat*    bse_engine_const_values      (gfloat                value);
00177 
00178 /* --- initialization & main loop --- */
00179 void       bse_engine_constrain         (guint                 latency_ms,
00180                                          guint                 sample_freq,
00181                                          guint                 control_freq,
00182                                          guint                *block_size_p,
00183                                          guint                *control_raster_p);
00184 void       bse_engine_init              (gboolean              threaded);
00185 gboolean   bse_engine_configure         (guint                 latency_ms,
00186                                          guint                 sample_freq,
00187                                          guint                 control_freq);
00188 
00189 /* --- miscellaneous --- */
00190 gfloat*    bse_engine_const_zeros             (guint         smaller_than_BSE_STREAM_MAX_VALUES);
00191 gboolean   bse_engine_has_garbage             (void);
00192 void       bse_engine_user_thread_collect     (void);
00193 void       bse_engine_free_ostreams           (guint         n_ostreams,
00194                                                BseOStream   *ostreams);
00195 void       bse_engine_add_user_callback       (gpointer      data,
00196                                                BseFreeFunc   free_func);        /* UserThread */
00197 void       bse_engine_wait_on_trans           (void);
00198 guint64    bse_engine_tick_stamp_from_systime (guint64       systime);
00199 #define    bse_engine_block_size()            (0 + (const guint) bse_engine_exvar_block_size)
00200 #define    bse_engine_sample_freq()           (0 + (const guint) bse_engine_exvar_sample_freq)
00201 #define    bse_engine_control_raster()        (1 + (const guint) bse_engine_exvar_control_mask)
00202 #define    bse_engine_control_mask()          (0 + (const guint) bse_engine_exvar_control_mask)
00203 #define    BSE_CONTROL_CHECK(index)           ((bse_engine_control_mask() & (index)) == 0)
00204 
00205 /* --- thread handling --- */
00206 typedef struct
00207 {
00208   glong         timeout;
00209   gboolean      fds_changed;
00210   guint         n_fds;
00211   GPollFD      *fds;
00212   gboolean      revents_filled;
00213 } BseEngineLoop;
00214 
00215 gboolean    bse_engine_prepare                (BseEngineLoop       *loop);
00216 gboolean    bse_engine_check                  (const BseEngineLoop *loop);
00217 void        bse_engine_dispatch               (void);
00218 
00219 /*< private >*/
00220 extern guint    bse_engine_exvar_block_size;
00221 extern guint    bse_engine_exvar_sample_freq;
00222 extern guint    bse_engine_exvar_control_mask;
00223 
00224 G_END_DECLS
00225 #endif /* __BSE_ENGINE_H__ */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines