BEAST/BSE - Better Audio System and Sound Engine  0.9.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bseengine.hh
Go to the documentation of this file.
1  // Licensed GNU LGPL v2.1 or later: http://www.gnu.org/licenses/lgpl.html
2 #ifndef __BSE_ENGINE_H__
3 #define __BSE_ENGINE_H__
4 
5 #include <bse/bsedefs.hh>
6 
7 G_BEGIN_DECLS
8 
9 /* --- constants --- */
10 #define BSE_STREAM_MAX_VALUES (1024 /* power of 2 and <= 16384 */)
11 #define BSE_MODULE_N_OSTREAMS(module) ((module)->klass->n_ostreams)
12 #define BSE_MODULE_N_ISTREAMS(module) ((module)->klass->n_istreams)
13 #define BSE_MODULE_N_JSTREAMS(module) ((module)->klass->n_jstreams)
14 #define BSE_MODULE_ISTREAM(module, stream) ((module)->istreams[(stream)])
15 #define BSE_MODULE_JSTREAM(module, stream) ((module)->jstreams[(stream)])
16 #define BSE_MODULE_OSTREAM(module, stream) ((module)->ostreams[(stream)])
17 #define BSE_MODULE_IBUFFER(module, stream) (BSE_MODULE_ISTREAM ((module), (stream)).values)
18 #define BSE_MODULE_JBUFFER(module, stream, con) (BSE_MODULE_JSTREAM ((module), (stream)).values[con])
19 #define BSE_MODULE_OBUFFER(module, stream) (BSE_MODULE_OSTREAM ((module), (stream)).values)
20 #define BSE_ENGINE_MAX_POLLFDS (128)
21 
22 
23 /* --- typedefs --- */
24 typedef struct _BseJob BseJob;
25 /* bsedefs.hh:
26  * typedef void (*BseEngineAccessFunc) (BseModule *module,
27  * gpointer data);
28  * typedef void (*BseFreeFunc) (gpointer data);
29  */
30 typedef gboolean (*BseEnginePollFunc) (gpointer data,
31  guint n_values,
32  glong *timeout_p,
33  guint n_fds,
34  const GPollFD *fds,
35  gboolean revents_filled);
36 typedef gboolean (*BseEngineTimerFunc) (gpointer data,
37  guint64 tick_stamp);
38 typedef void (*BseEngineProbeFunc) (gpointer data,
39  guint n_values, /* bse_engine_block_size() */
40  guint64 tick_stamp,
41  guint n_ostreams, /* ENGINE_NODE_N_OSTREAMS() */
42  BseOStream **ostreams_p);
43 typedef void (*BseProcessFunc) (BseModule *module,
44  guint n_values);
45 typedef guint (*BseProcessDeferFunc) (BseModule *module,
46  guint n_ivalues,
47  guint n_ovalues);
48 typedef void (*BseModuleResetFunc) (BseModule *module);
49 typedef void (*BseModuleFreeFunc) (gpointer data,
50  const BseModuleClass *klass);
51 
52 typedef enum /*< skip >*/
53 {
54  BSE_COST_NORMAL = 0,
55  BSE_COST_CHEAP = 1 << 0,
56  BSE_COST_EXPENSIVE = 1 << 1
57 } BseCostType;
58 /* class, filled out by user */
60 {
61  guint n_istreams;
62  guint n_jstreams;
63  guint n_ostreams;
64  BseProcessFunc process; /* EngineThread */
65  BseProcessDeferFunc process_defer; /* EngineThread */
66  BseModuleResetFunc reset; /* EngineThread */
67  BseModuleFreeFunc free; /* UserThread */
68  BseCostType mflags;
69 };
70 /* module, constructed by engine */
71 struct _BseModule
72 {
73  const BseModuleClass *klass;
74  gpointer user_data;
75  BseIStream *istreams; /* input streams */
76  BseJStream *jstreams; /* joint (multiconnect) input streams */
77  BseOStream *ostreams; /* output streams */
78 };
79 /* streams, constructed by engine */
81 {
82  const gfloat **values;
83  guint n_connections; /* scheduler update */
84  /*< private >*/
85  guint jcount; /* internal field */
86 };
88 {
89  const gfloat *values;
90  gboolean connected; /* scheduler update */
91 };
93 {
94  gfloat *values;
95  gboolean connected;
96 };
97 
98 
99 /* --- interface (UserThread functions) --- */
100 BseModule* bse_module_new (const BseModuleClass *klass,
101  gpointer user_data);
102 BseModule* bse_module_new_virtual (guint n_iostreams,
103  gpointer user_data,
104  BseFreeFunc free_data);
105 guint64 bse_module_tick_stamp (BseModule *module);
106 gboolean bse_module_has_source (BseModule *module,
107  guint istream);
108 gboolean bse_module_is_scheduled (BseModule *module);
109 BseJob* bse_job_connect (BseModule *src_module,
110  guint src_ostream,
111  BseModule *dest_module,
112  guint dest_istream);
113 BseJob* bse_job_jconnect (BseModule *src_module,
114  guint src_ostream,
115  BseModule *dest_module,
116  guint dest_jstream);
117 BseJob* bse_job_disconnect (BseModule *dest_module,
118  guint dest_istream);
119 BseJob* bse_job_jdisconnect (BseModule *dest_module,
120  guint dest_jstream,
121  BseModule *src_module,
122  guint src_ostream);
123 BseJob* bse_job_kill_inputs (BseModule *module);
124 BseJob* bse_job_kill_outputs (BseModule *module);
125 BseJob* bse_job_integrate (BseModule *module);
126 BseJob* bse_job_discard (BseModule *module);
127 BseJob* bse_job_force_reset (BseModule *module);
128 BseJob* bse_job_set_consumer (BseModule *module,
129  gboolean is_toplevel_consumer);
130 BseJob* bse_job_suspend_now (BseModule *module);
131 BseJob* bse_job_resume_at (BseModule *module,
132  guint64 tick_stamp);
133 BseJob* bse_job_debug (const gchar *debug);
134 BseJob* bse_job_nop (void);
135 BseJob* bse_job_add_poll (BseEnginePollFunc poll_func,
136  gpointer data,
137  BseFreeFunc free_func,
138  guint n_fds,
139  const GPollFD *fds);
140 BseJob* bse_job_remove_poll (BseEnginePollFunc poll_func,
141  gpointer data);
142 BseJob* bse_job_add_timer (BseEngineTimerFunc timer_func,
143  gpointer data,
144  BseFreeFunc free_func);
145 BseJob* bse_job_access (BseModule *module,
146  BseEngineAccessFunc access_func, /* EngineThread */
147  gpointer data,
148  BseFreeFunc free_func); /* UserThread */
149 BseJob* bse_job_probe_request (BseModule *module,
150  BseEngineProbeFunc probe, /* UserThread */
151  gpointer data);
152 BseJob* bse_job_flow_access (BseModule *module,
153  guint64 tick_stamp,
154  BseEngineAccessFunc access_func, /* EngineThread */
155  gpointer data,
156  BseFreeFunc free_func); /* UserThread */
157 BseJob* bse_job_boundary_access (BseModule *module,
158  guint64 tick_stamp,
159  BseEngineAccessFunc access_func, /* EngineThread */
160  gpointer data,
161  BseFreeFunc free_func); /* UserThread */
162 BseJob* bse_job_boundary_discard (BseModule *module);
163 BseTrans* bse_trans_open (void);
164 void bse_trans_add (BseTrans *trans,
165  BseJob *job);
166 BseTrans* bse_trans_merge (BseTrans *trans1,
167  BseTrans *trans2);
168 guint64 bse_trans_commit (BseTrans *trans);
169 void bse_trans_commit_delayed (BseTrans *trans,
170  guint64 tick_stamp);
171 void bse_trans_dismiss (BseTrans *trans);
172 void bse_transact (BseJob *job,
173  ...) G_GNUC_NULL_TERMINATED;
174 
175 /* --- module utilities (EngineThread functions) --- */
176 gfloat* bse_engine_const_values (gfloat value);
177 
178 /* --- initialization & main loop --- */
179 void bse_engine_constrain (guint latency_ms,
180  guint sample_freq,
181  guint control_freq,
182  guint *block_size_p,
183  guint *control_raster_p);
184 void bse_engine_init (gboolean threaded);
185 gboolean bse_engine_configure (guint latency_ms,
186  guint sample_freq,
187  guint control_freq);
188 
189 /* --- miscellaneous --- */
190 gfloat* bse_engine_const_zeros (guint smaller_than_BSE_STREAM_MAX_VALUES);
191 gboolean bse_engine_has_garbage (void);
193 void bse_engine_free_ostreams (guint n_ostreams,
194  BseOStream *ostreams);
195 void bse_engine_add_user_callback (gpointer data,
196  BseFreeFunc free_func); /* UserThread */
197 void bse_engine_wait_on_trans (void);
198 guint64 bse_engine_tick_stamp_from_systime (guint64 systime);
199 #define bse_engine_block_size() (0 + (const guint) bse_engine_exvar_block_size)
200 #define bse_engine_sample_freq() (0 + (const guint) bse_engine_exvar_sample_freq)
201 #define bse_engine_control_raster() (1 + (const guint) bse_engine_exvar_control_mask)
202 #define bse_engine_control_mask() (0 + (const guint) bse_engine_exvar_control_mask)
203 #define BSE_CONTROL_CHECK(index) ((bse_engine_control_mask() & (index)) == 0)
204 
205 /* --- thread handling --- */
206 typedef struct
207 {
208  glong timeout;
209  gboolean fds_changed;
210  guint n_fds;
211  GPollFD *fds;
212  gboolean revents_filled;
213 } BseEngineLoop;
214 
215 gboolean bse_engine_prepare (BseEngineLoop *loop);
216 gboolean bse_engine_check (const BseEngineLoop *loop);
217 void bse_engine_dispatch (void);
218 
219 /*< private >*/
220 extern guint bse_engine_exvar_block_size;
221 extern guint bse_engine_exvar_sample_freq;
222 extern guint bse_engine_exvar_control_mask;
223 
224 G_END_DECLS
225 #endif /* __BSE_ENGINE_H__ */
void bse_trans_add(BseTrans *trans, BseJob *job)
Definition: bseengine.cc:903
gboolean bse_engine_configure(guint latency_ms, guint sample_freq, guint control_freq)
Definition: bseengine.cc:1289
Definition: bseengine.hh:92
BseJob * bse_job_jconnect(BseModule *src_module, guint src_ostream, BseModule *dest_module, guint dest_jstream)
Definition: bseengine.cc:275
gboolean bse_module_is_scheduled(BseModule *module)
Definition: bseengine.cc:131
BseTrans * bse_trans_open(void)
Definition: bseengine.cc:881
BseJob * bse_job_probe_request(BseModule *module, BseEngineProbeFunc probe, gpointer data)
Definition: bseengine.cc:518
Definition: bseengine.hh:80
BseJob * bse_job_remove_poll(BseEnginePollFunc poll_func, gpointer data)
Definition: bseengine.cc:785
void(* BseEngineProbeFunc)(gpointer data, guint n_values, guint64 tick_stamp, guint n_ostreams, BseOStream **ostreams_p)
Definition: bseengine.hh:38
BseJob * bse_job_jdisconnect(BseModule *dest_module, guint dest_jstream, BseModule *src_module, guint src_ostream)
Definition: bseengine.cc:342
void bse_engine_user_thread_collect(void)
BSE Engine user thread function.
Definition: bseengineutils.cc:355
guint64 bse_engine_tick_stamp_from_systime(guint64 systime)
Definition: bseengine.cc:1455
BseJob * bse_job_discard(BseModule *module)
Definition: bseengine.cc:169
BseJob * bse_job_flow_access(BseModule *module, guint64 tick_stamp, BseEngineAccessFunc access_func, gpointer data, BseFreeFunc free_func)
Definition: bseengine.cc:561
Definition: bseengine.hh:206
BseJob * bse_job_resume_at(BseModule *module, guint64 tick_stamp)
Definition: bseengine.cc:704
BseJob * bse_job_kill_inputs(BseModule *module)
Definition: bseengine.cc:191
BseJob * bse_job_connect(BseModule *src_module, guint src_ostream, BseModule *dest_module, guint dest_istream)
Definition: bseengine.cc:240
BseTrans * bse_trans_merge(BseTrans *trans1, BseTrans *trans2)
Definition: bseengine.cc:929
BseJob * bse_job_force_reset(BseModule *module)
Definition: bseengine.cc:394
BseJob * bse_job_boundary_access(BseModule *module, guint64 tick_stamp, BseEngineAccessFunc access_func, gpointer data, BseFreeFunc free_func)
Definition: bseengine.cc:602
void bse_engine_init(gboolean threaded)
Definition: bseengine.cc:1370
void bse_trans_commit_delayed(BseTrans *trans, guint64 tick_stamp)
Definition: bseengine.cc:1026
gboolean bse_module_has_source(BseModule *module, guint istream)
Definition: bseengine.cc:111
Definition: bseengine.hh:71
Definition: bseenginenode.hh:61
BseJob * bse_job_debug(const gchar *debug)
Definition: bseengine.cc:842
BseJob * bse_job_integrate(BseModule *module)
Definition: bseengine.cc:146
void(* BseEngineAccessFunc)(BseModule *module, gpointer data)
Definition: bsedefs.hh:128
void bse_engine_add_user_callback(gpointer data, BseFreeFunc free_func)
Definition: bseengine.cc:461
BseJob * bse_job_nop(void)
Definition: bseengine.cc:863
guint64 bse_module_tick_stamp(BseModule *module)
Definition: bseengine.cc:89
BseModule * bse_module_new_virtual(guint n_iostreams, gpointer user_data, BseFreeFunc free_data)
Definition: bseengine.cc:1150
void bse_engine_dispatch(void)
Perform necessary work the engine has to handle in the user thread.
Definition: bseengine.cc:1436
BseJob * bse_job_kill_outputs(BseModule *module)
Definition: bseengine.cc:213
void bse_transact(BseJob *job,...) G_GNUC_NULL_TERMINATED
Definition: bseengine.cc:1074
BseJob * bse_job_boundary_discard(BseModule *module)
Definition: bseengine.cc:647
BseModule * bse_module_new(const BseModuleClass *klass, gpointer user_data)
Definition: bseengine.cc:38
guint64 bse_trans_commit(BseTrans *trans)
Definition: bseengine.cc:968
BseJob * bse_job_disconnect(BseModule *dest_module, guint dest_istream)
Definition: bseengine.cc:308
BseJob * bse_job_suspend_now(BseModule *module)
Definition: bseengine.cc:678
void bse_engine_wait_on_trans(void)
Wait until all pending transactions have been processed by the BSE Engine.
Definition: bseengine.cc:1500
void bse_trans_dismiss(BseTrans *trans)
Definition: bseengine.cc:1056
BseJob * bse_job_access(BseModule *module, BseEngineAccessFunc access_func, gpointer data, BseFreeFunc free_func)
Definition: bseengine.cc:431
Definition: bseengine.hh:87
void bse_engine_constrain(guint latency_ms, guint sample_freq, guint control_freq, guint *block_size_p, guint *control_raster_p)
Definition: bseengine.cc:1225
gboolean(* BseEnginePollFunc)(gpointer data, guint n_values, glong *timeout_p, guint n_fds, const GPollFD *fds, gboolean revents_filled)
Definition: bseengine.hh:30
Definition: bseengine.hh:59
BseJob * bse_job_add_timer(BseEngineTimerFunc timer_func, gpointer data, BseFreeFunc free_func)
Definition: bseengine.cc:815
BseJob * bse_job_add_poll(BseEnginePollFunc poll_func, gpointer data, BseFreeFunc free_func, guint n_fds, const GPollFD *fds)
Definition: bseengine.cc:752