BEAST - Free Software Audio Synthesizer and Tracker  0.10.0
bsesource.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_SOURCE_H__
3 #define __BSE_SOURCE_H__
4 #include <bse/bseitem.hh>
5 #include <bse/gsldefs.hh>
6 #include <sfi/gbsearcharray.hh>
7 
8 G_BEGIN_DECLS
9 
10 /* --- BseSource type macros --- */
11 #define BSE_TYPE_SOURCE (BSE_TYPE_ID (BseSource))
12 #define BSE_SOURCE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), BSE_TYPE_SOURCE, BseSource))
13 #define BSE_SOURCE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), BSE_TYPE_SOURCE, BseSourceClass))
14 #define BSE_IS_SOURCE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_SOURCE))
15 #define BSE_IS_SOURCE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_SOURCE))
16 #define BSE_SOURCE_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_SOURCE, BseSourceClass))
17 
18 
19 /* --- BseSource member macros --- */
20 #define BSE_SOURCE_PREPARED(src) ((BSE_OBJECT_FLAGS (src) & BSE_SOURCE_FLAG_PREPARED) != 0)
21 #define BSE_SOURCE_COLLECTED(src) ((BSE_OBJECT_FLAGS (src) & BSE_SOURCE_FLAG_COLLECTED) != 0)
22 #define BSE_SOURCE_N_ICHANNELS(src) (BSE_SOURCE (src)->channel_defs->n_ichannels)
23 #define BSE_SOURCE_ICHANNEL_IDENT(src,id) (BSE_SOURCE (src)->channel_defs->ichannel_idents[(id)])
24 #define BSE_SOURCE_ICHANNEL_LABEL(src,id) (BSE_SOURCE (src)->channel_defs->ichannel_labels[(id)])
25 #define BSE_SOURCE_ICHANNEL_BLURB(src,id) (BSE_SOURCE (src)->channel_defs->ichannel_blurbs[(id)])
26 #define BSE_SOURCE_IS_JOINT_ICHANNEL(s,i) ((BSE_SOURCE (s)->channel_defs->ijstreams[(i)] & BSE_SOURCE_JSTREAM_FLAG) != 0)
27 #define BSE_SOURCE_N_JOINT_ICHANNELS(src) (BSE_SOURCE (src)->channel_defs->n_jstreams)
28 #define BSE_SOURCE_N_OCHANNELS(src) (BSE_SOURCE (src)->channel_defs->n_ochannels)
29 #define BSE_SOURCE_OCHANNEL_IDENT(src,id) (BSE_SOURCE (src)->channel_defs->ochannel_idents[(id)])
30 #define BSE_SOURCE_OCHANNEL_LABEL(src,id) (BSE_SOURCE (src)->channel_defs->ochannel_labels[(id)])
31 #define BSE_SOURCE_OCHANNEL_BLURB(src,id) (BSE_SOURCE (src)->channel_defs->ochannel_blurbs[(id)])
32 /* BseSourceClass */
33 #define BSE_SOURCE_CLASS_N_ICHANNELS(sc) (BSE_SOURCE_CLASS (sc)->channel_defs.n_ichannels)
34 #define BSE_SOURCE_CLASS_N_OCHANNELS(sc) (BSE_SOURCE_CLASS (sc)->channel_defs.n_ochannels)
35 /*< private >*/
36 #define BSE_SOURCE_INPUT(src,id) (BSE_SOURCE (src)->inputs + (guint) (id))
37 #define BSE_SOURCE_OCHANNEL_OSTREAM(s,oc) ((oc) < BSE_SOURCE_N_OCHANNELS (s) ? (oc) : 0xffffffff)
38 #define BSE_SOURCE_ICHANNEL_ISTREAM(s,ic) ((ic) < BSE_SOURCE_N_ICHANNELS (s) \
39  && !BSE_SOURCE_IS_JOINT_ICHANNEL ((s), (ic)) ? \
40  BSE_SOURCE (s)->channel_defs->ijstreams[(ic)] & ~BSE_SOURCE_JSTREAM_FLAG : \
41  0xffffffff)
42 #define BSE_SOURCE_ICHANNEL_JSTREAM(s,ic) ((ic) < BSE_SOURCE_N_ICHANNELS (s) \
43  && BSE_SOURCE_IS_JOINT_ICHANNEL ((s), (ic)) ? \
44  BSE_SOURCE (s)->channel_defs->ijstreams[(ic)] & ~BSE_SOURCE_JSTREAM_FLAG : \
45  0xffffffff)
46 #define BSE_SOURCE_JSTREAM_FLAG ((guint) 1 << 31)
47 #define BSE_SOURCE_PRIVATE_INPUTS(src) ((BSE_OBJECT_FLAGS (src) & BSE_SOURCE_FLAG_PRIVATE_INPUTS) != 0)
48 
49 typedef enum /*< skip >*/
50 {
51  BSE_SOURCE_FLAG_PRIVATE_INPUTS = 1 << (BSE_ITEM_FLAGS_USHIFT + 0),
52  BSE_SOURCE_FLAG_PREPARED = 1 << (BSE_ITEM_FLAGS_USHIFT + 1),
53  BSE_SOURCE_FLAG_COLLECTED = 1 << (BSE_ITEM_FLAGS_USHIFT + 2)
54 } BseSourceFlags;
55 #define BSE_SOURCE_FLAGS_USHIFT (BSE_ITEM_FLAGS_USHIFT + 3)
56 
57 typedef struct _BseSourceProbes BseSourceProbes;
58 typedef void (*BseSourceFreeContextData) (BseSource *source,
59  gpointer data,
60  BseTrans *trans);
62  BseSource *osource;
63  guint ochannel;
64 };
66  BseSourceOutput idata;
67  struct {
68  guint n_joints;
69  BseSourceOutput *joints;
70  } jdata;
71 };
73  guint n_ichannels;
74  gchar **ichannel_idents;
75  gchar **ichannel_labels;
76  gchar **ichannel_blurbs;
77  guint *ijstreams;
78  guint n_jstreams;
79  guint n_ochannels;
80  gchar **ochannel_idents;
81  gchar **ochannel_labels;
82  gchar **ochannel_blurbs;
83 };
84 struct BseSource : BseItem {
85  BseSourceChannelDefs *channel_defs;
86  BseSourceInput *inputs; /* [n_ichannels] */
87  GSList *outputs;
88  GBSearchArray *contexts; /* bsearch array of type BseSourceContext */
89  SfiReal pos_x, pos_y;
90  BseSourceProbes *probes;
91 };
93  BseSourceChannelDefs channel_defs;
94  void (*property_updated) (BseSource *source, /* overridable method */
95  guint property_id,
96  guint64 tick_stamp,
97  double value,
98  GParamSpec *pspec);
99  void (*prepare) (BseSource *source);
100  void (*context_create) (BseSource *source,
101  guint context_handle,
102  BseTrans *trans);
103  void (*context_connect) (BseSource *source,
104  guint context_handle,
105  BseTrans *trans);
106  void (*context_dismiss) (BseSource *source,
107  guint context_handle,
108  BseTrans *trans);
109  void (*reset) (BseSource *source);
110 
111  /*< private >*/
112  void (*add_input) (BseSource *source,
113  guint ichannel,
114  BseSource *osource,
115  guint ochannel);
116  void (*remove_input) (BseSource *source,
117  guint ichannel,
118  BseSource *osource,
119  guint ochannel);
120  BseModuleClass *engine_class;
121  gboolean filtered_properties;
122  SfiRing *unprepared_properties;
123  SfiRing *automation_properties;
124 };
125 
126 guint bse_source_find_ichannel (BseSource *source,
127  const gchar *ichannel_ident);
128 guint bse_source_find_ochannel (BseSource *source,
129  const gchar *ochannel_ident);
130 Bse::Error bse_source_set_input (BseSource *source,
131  guint ichannel,
132  BseSource *osource,
133  guint ochannel);
134 Bse::Error bse_source_unset_input (BseSource *source,
135  guint ichannel,
136  BseSource *osource,
137  guint ochannel);
138 gboolean bse_source_get_input (BseSource *source,
139  guint ichannel,
140  BseSource **osourcep,
141  guint *ochannelp);
142 void bse_source_must_set_input_loc (BseSource *source,
143  guint ichannel,
144  BseSource *osource,
145  guint ochannel,
146  const gchar *strloc);
147 #define bse_source_must_set_input(is,ic,os,oc) \
148  bse_source_must_set_input_loc (is, ic, os, oc, G_STRLOC)
149 
150 
151 /* --- source implementations --- */
152 guint bse_source_class_add_ichannel (BseSourceClass *source_class,
153  const gchar *ident,
154  const gchar *label,
155  const gchar *blurb);
156 guint bse_source_class_add_jchannel (BseSourceClass *source_class,
157  const gchar *ident,
158  const gchar *label,
159  const gchar *blurb);
160 guint bse_source_class_add_ochannel (BseSourceClass *source_class,
161  const gchar *ident,
162  const gchar *label,
163  const gchar *blurb);
164 void bse_source_class_inherit_channels (BseSourceClass *source_class);
165 void bse_source_set_context_imodule (BseSource *source,
166  guint context_handle,
167  BseModule *imodule);
168 void bse_source_set_context_omodule (BseSource *source,
169  guint context_handle,
170  BseModule *omodule);
171 BseModule* bse_source_get_context_imodule (BseSource *source,
172  guint context_handle);
173 BseModule* bse_source_get_context_omodule (BseSource *source,
174  guint context_handle);
175 void bse_source_flow_access_module (BseSource *source,
176  guint context_handle,
177  guint64 tick_stamp,
178  BseEngineAccessFunc access_func,
179  gpointer data,
180  BseFreeFunc data_free_func,
181  BseTrans *trans);
182 void bse_source_flow_access_modules (BseSource *source,
183  guint64 tick_stamp,
184  BseEngineAccessFunc access_func,
185  gpointer data,
186  BseFreeFunc data_free_func,
187  BseTrans *trans);
188 void bse_source_access_modules (BseSource *source,
189  BseEngineAccessFunc access_func,
190  gpointer data,
191  BseFreeFunc data_free_func,
192  BseTrans *trans);
193 Bse::Error bse_source_check_input (BseSource *source,
194  guint ichannel,
195  BseSource *osource,
196  guint ochannel);
197 gboolean bse_source_has_output (BseSource *source,
198  guint ochannel);
199 void bse_source_backup_ichannels_to_undo (BseSource *source);
200 void bse_source_backup_ochannels_to_undo (BseSource *source);
201 void bse_source_input_backup_to_undo (BseSource *source,
202  guint ichannel,
203  BseSource *osource,
204  guint ochannel);
205 /* convenience */
206 void bse_source_class_cache_engine_class (BseSourceClass *source_class,
207  const BseModuleClass *engine_class);
208 void bse_source_set_context_module (BseSource *source,
209  guint context_handle,
210  BseModule *module);
211 void bse_source_update_modules (BseSource *source,
212  guint member_offset,
213  gpointer member_data,
214  guint member_size,
215  BseTrans *trans);
216 void bse_source_clear_ichannels (BseSource *source);
217 void bse_source_clear_ochannels (BseSource *source);
218 Bse::MusicalTuning bse_source_prepared_musical_tuning (BseSource *source);
219 
220 /* automation */
221 typedef struct {
222  GParamSpec *pspec;
223  guint midi_channel;
224  Bse::MidiSignal signal_type;
226 Bse::Error bse_source_set_automation_property (BseSource *source,
227  const gchar *prop_name,
228  guint midi_channel,
229  Bse::MidiSignal signal_type);
230 void bse_source_get_automation_property (BseSource *source,
231  const gchar *prop_name,
232  guint *pmidi_channel,
233  Bse::MidiSignal *psignal_type);
234 BseAutomationProperty* bse_source_get_automation_properties (BseSource *source,
235  guint *n_props);
236 
237 /* --- internal --- */
238 SfiRing* bse_source_collect_inputs_flat (BseSource *source); /* sets mark */
239 SfiRing* bse_source_collect_inputs_recursive (BseSource *source); /* sets mark */
240 void bse_source_free_collection (SfiRing *ring); /* unsets mark */
241 gboolean bse_source_test_input_recursive (BseSource *source, /* sets+unsets mark */
242  BseSource *test);
243 gpointer bse_source_get_context_data (BseSource *source,
244  guint context_handle);
245 void bse_source_create_context_with_data (BseSource *source,
246  guint context_handle,
247  gpointer data,
248  BseSourceFreeContextData free_data,
249  BseTrans *trans);
250 void bse_source_create_context (BseSource *source,
251  guint context_handle,
252  BseTrans *trans);
253 void bse_source_connect_context (BseSource *source,
254  guint context_handle,
255  BseTrans *trans);
256 void bse_source_dismiss_context (BseSource *source,
257  guint context_handle,
258  BseTrans *trans);
259 void bse_source_recreate_context (BseSource *source,
260  guint context_handle,
261  BseTrans *trans);
262 void bse_source_prepare (BseSource *source);
263 void bse_source_reset (BseSource *source);
264 guint* bse_source_context_ids (BseSource *source,
265  guint *n_ids);
266 gboolean bse_source_has_context (BseSource *source,
267  guint context_handle);
268 SfiRing* bse_source_list_omodules (BseSource *source);
269 /* implemented in bseprobe.cc */
270 void bse_source_clear_probes (BseSource *source);
271 void bse_source_class_add_probe_signals (BseSourceClass *klass);
272 void bse_source_probes_modules_changed (BseSource *source);
273 
274 G_END_DECLS
275 
276 namespace Bse {
277 
278 class SourceImpl : public ItemImpl, public virtual SourceIface {
279 protected:
280  virtual ~SourceImpl ();
281 public:
282  explicit SourceImpl (BseObject*);
283  virtual SourceIfaceP ichannel_get_osource (int input_channel, int input_joint) override;
284 };
285 
286 } // Bse
287 
288 #endif /* __BSE_SOURCE_H__ */
The Bse namespace contains all functions of the synthesis engine.
Definition: bstbseutils.cc:88
Definition: gbsearcharray.hh:37
Definition: bsesource.hh:72
Definition: bsesource.hh:61
Definition: bsesource.hh:221
Definition: bseobject.hh:61
void(* BseEngineAccessFunc)(BseModule *module, gpointer data)
Definition: bsedefs.hh:127
See also the corresponding IDL class Source.
Definition: bseserverapi.hh:899
Definition: bsesource.hh:84
Definition: sfiring.hh:23
Definition: bsesource.hh:92
Definition: bseitem.hh:152
Definition: bseitem.hh:39
virtual SourceIfaceP ichannel_get_osource(int input_channel, int input_joint) override
See Source::ichannel_get_osource()
Definition: bsesource.cc:2075
Definition: bseitem.hh:34
Definition: bsesource.hh:65
Definition: bsesource.hh:278