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_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__ */