1 /* GSequencer - Advanced GTK Sequencer
2  * Copyright (C) 2005-2020 Joël Krähemann
3  *
4  * This file is part of GSequencer.
5  *
6  * GSequencer is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GSequencer is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with GSequencer.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #ifndef __AGS_AUDIO_H__
21 #define __AGS_AUDIO_H__
22 
23 #include <glib.h>
24 #include <glib-object.h>
25 
26 #include <ags/libags.h>
27 
28 #include <ags/audio/ags_sound_enums.h>
29 #include <ags/audio/ags_channel.h>
30 #include <ags/audio/ags_recall_id.h>
31 
32 G_BEGIN_DECLS
33 
34 #define AGS_TYPE_AUDIO                (ags_audio_get_type ())
35 #define AGS_AUDIO(obj)                (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO, AgsAudio))
36 #define AGS_AUDIO_CLASS(class)        (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUDIO, AgsAudioClass))
37 #define AGS_IS_AUDIO(obj)             (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_AUDIO))
38 #define AGS_IS_AUDIO_CLASS(class)     (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_AUDIO))
39 #define AGS_AUDIO_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_AUDIO, AgsAudioClass))
40 
41 #define AGS_AUDIO_GET_OBJ_MUTEX(obj) (&(((AgsAudio *) obj)->obj_mutex))
42 #define AGS_AUDIO_GET_PLAY_MUTEX(obj) (&(((AgsAudio *) obj)->play_mutex))
43 #define AGS_AUDIO_GET_RECALL_MUTEX(obj) (&(((AgsAudio *) obj)->recall_mutex))
44 
45 typedef struct _AgsAudio AgsAudio;
46 typedef struct _AgsAudioClass AgsAudioClass;
47 
48 /**
49  * AgsAudioFlags:
50  * @AGS_AUDIO_ADDED_TO_REGISTRY: the audio was added to registry, see #AgsConnectable::add_to_registry()
51  * @AGS_AUDIO_CONNECTED: the audio was connected by #AgsConnectable::connect()
52  * @AGS_AUDIO_NO_OUTPUT: no output provided
53  * @AGS_AUDIO_NO_INPUT: no input provided
54  * @AGS_AUDIO_SYNC: input/output is mapped synchronously
55  * @AGS_AUDIO_ASYNC: input/output is mapped asynchronously
56  * @AGS_AUDIO_OUTPUT_HAS_RECYCLING: output has recycling
57  * @AGS_AUDIO_OUTPUT_HAS_SYNTH: output has synth
58  * @AGS_AUDIO_INPUT_HAS_RECYCLING: input has recycling
59  * @AGS_AUDIO_INPUT_HAS_SYNTH: input has synth
60  * @AGS_AUDIO_INPUT_HAS_FILE: input takes file
61  * @AGS_AUDIO_CAN_NEXT_ACTIVE: dispatch can next active
62  * @AGS_AUDIO_SKIP_OUTPUT: skip output as processing audio data
63  * @AGS_AUDIO_SKIP_INPUT: skip input as processing audio data
64  * @AGS_AUDIO_BYPASS: don't apply any data
65  *
66  * Enum values to control the behavior or indicate internal state of #AgsAudio by
67  * enable/disable as flags.
68  */
69 typedef enum{
70   AGS_AUDIO_ADDED_TO_REGISTRY           = 1,
71   AGS_AUDIO_CONNECTED                   = 1 <<  1,
72   AGS_AUDIO_NO_OUTPUT                   = 1 <<  2,
73   AGS_AUDIO_NO_INPUT                    = 1 <<  3,
74   AGS_AUDIO_SYNC                        = 1 <<  4, // can be combined with below
75   AGS_AUDIO_ASYNC                       = 1 <<  5,
76   AGS_AUDIO_OUTPUT_HAS_RECYCLING        = 1 <<  6,
77   AGS_AUDIO_OUTPUT_HAS_SYNTH            = 1 <<  7,
78   AGS_AUDIO_INPUT_HAS_RECYCLING         = 1 <<  8,
79   AGS_AUDIO_INPUT_HAS_SYNTH             = 1 <<  9,
80   AGS_AUDIO_INPUT_HAS_FILE              = 1 << 10,
81   AGS_AUDIO_CAN_NEXT_ACTIVE             = 1 << 11,
82   AGS_AUDIO_SKIP_OUTPUT                 = 1 << 12,
83   AGS_AUDIO_SKIP_INPUT                  = 1 << 13,
84   AGS_AUDIO_BYPASS                      = 1 << 14,
85 }AgsAudioFlags;
86 
87 struct _AgsAudio
88 {
89   GObject gobject;
90 
91   guint flags;
92   guint ability_flags;
93   guint behaviour_flags;
94   guint staging_flags[AGS_SOUND_SCOPE_LAST];
95 
96   gboolean staging_completed[AGS_SOUND_SCOPE_LAST];
97 
98   GRecMutex obj_mutex;
99 
100   AgsUUID *uuid;
101 
102   gchar *audio_name;
103 
104   GObject *output_soundcard;
105   gint *output_soundcard_channel_map;
106 
107   GObject *input_soundcard;
108   gint *input_soundcard_channel_map;
109 
110   GObject *output_sequencer;
111   GObject *input_sequencer;
112 
113   guint samplerate;
114   guint buffer_size;
115   guint format;
116 
117   gdouble bpm;
118 
119   guint bank_dim[3];
120 
121   guint min_audio_channels;
122   guint max_audio_channels;
123 
124   guint min_output_pads;
125   guint max_output_pads;
126 
127   guint min_input_pads;
128   guint max_input_pads;
129 
130   guint audio_channels;
131 
132   guint output_pads;
133   guint output_lines;
134 
135   guint input_pads;
136   guint input_lines;
137 
138   guint audio_start_mapping;
139   guint audio_end_mapping;
140 
141   guint midi_start_mapping;
142   guint midi_end_mapping;
143 
144   guint midi_channel;
145 
146   guint numerator;
147   guint denominator;
148   gchar *time_signature;
149 
150   gboolean is_minor;
151   guint sharp_flats;
152 
153   gint octave;
154   guint key;
155   gint absolute_key;
156 
157   guint64 loop_start;
158   guint64 loop_end;
159   guint64 offset;
160 
161   AgsChannel *output;
162   AgsChannel *input;
163 
164   GList *preset;
165 
166   GObject *playback_domain;
167 
168   GList *synth_generator;
169   GList *sf2_synth_generator;
170   GList *sfz_synth_generator;
171 
172   GList *cursor;
173 
174   GList *notation;
175 
176   gchar **automation_port;
177   GList *automation;
178 
179   GList *wave;
180   GObject *output_audio_file;
181   GObject *input_audio_file;
182 
183   gchar *instrument_name;
184   gchar *track_name;
185 
186   GList *midi;
187   GObject *output_midi_file;
188   GObject *input_midi_file;
189 
190   GList *recall_id;
191   GList *recycling_context;
192 
193   GList *recall_container;
194 
195   GRecMutex play_mutex;
196 
197   GList *play;
198 
199   GRecMutex recall_mutex;
200 
201   GList *recall;
202 
203   gpointer machine_widget;
204   gpointer file_data;
205 };
206 
207 struct _AgsAudioClass
208 {
209   GObjectClass gobject;
210 
211   void (*set_audio_channels)(AgsAudio *audio,
212 			     guint audio_channels, guint audio_channels_old);
213   void (*set_pads)(AgsAudio *audio,
214 		   GType channel_type,
215 		   guint pads, guint pads_old);
216 
217   void (*duplicate_recall)(AgsAudio *audio,
218 			   AgsRecallID *recall_id,
219 			   guint pad, guint audio_channel,
220 			   guint line);
221   void (*resolve_recall)(AgsAudio *audio,
222 			 AgsRecallID *recall_id);
223 
224   void (*init_recall)(AgsAudio *audio,
225 		      AgsRecallID *recall_id, guint staging_flags);
226   void (*play_recall)(AgsAudio *audio,
227 		      AgsRecallID *recall_id, guint staging_flags);
228 
229   void (*done_recall)(AgsAudio *audio,
230 		      AgsRecallID *recall_id);
231   void (*cancel_recall)(AgsAudio *audio,
232 			AgsRecallID *recall_id);
233 
234   void (*cleanup_recall)(AgsAudio *audio,
235 			 AgsRecallID *recall_id);
236 
237   GList* (*start)(AgsAudio *audio,
238 		  gint sound_scope);
239   void (*stop)(AgsAudio *audio,
240 	       GList *recall_id, gint sound_scope);
241 
242   GList* (*check_scope)(AgsAudio *audio, gint sound_scope);
243 
244   void (*recursive_run_stage)(AgsAudio *audio,
245 			      gint sound_scope, guint staging_flags);
246 };
247 
248 GType ags_audio_get_type();
249 GType ags_audio_flags_get_type();
250 
251 GRecMutex* ags_audio_get_obj_mutex(AgsAudio *audio);
252 GRecMutex* ags_audio_get_play_mutex(AgsAudio *audio);
253 GRecMutex* ags_audio_get_recall_mutex(AgsAudio *audio);
254 
255 gboolean ags_audio_test_flags(AgsAudio *audio, guint flags);
256 void ags_audio_set_flags(AgsAudio *audio, guint flags);
257 void ags_audio_unset_flags(AgsAudio *audio, guint flags);
258 
259 gboolean ags_audio_test_ability_flags(AgsAudio *audio, guint ability_flags);
260 void ags_audio_set_ability_flags(AgsAudio *audio, guint ability_flags);
261 void ags_audio_unset_ability_flags(AgsAudio *audio, guint ability_flags);
262 
263 gboolean ags_audio_test_behaviour_flags(AgsAudio *audio, guint behaviour_flags);
264 void ags_audio_set_behaviour_flags(AgsAudio *audio, guint behaviour_flags);
265 void ags_audio_unset_behaviour_flags(AgsAudio *audio, guint behaviour_flags);
266 
267 gboolean ags_audio_test_staging_flags(AgsAudio *audio, gint sound_scope,
268 				      guint staging_flags);
269 void ags_audio_set_staging_flags(AgsAudio *audio, gint sound_scope,
270 				 guint staging_flags);
271 void ags_audio_unset_staging_flags(AgsAudio *audio, gint sound_scope,
272 				   guint staging_flags);
273 
274 gboolean ags_audio_test_staging_completed(AgsAudio *audio, gint sound_scope);
275 void ags_audio_set_staging_completed(AgsAudio *audio, gint sound_scope);
276 void ags_audio_unset_staging_completed(AgsAudio *audio, gint sound_scope);
277 
278 /* audio name */
279 gchar* ags_audio_get_audio_name(AgsAudio *audio);
280 void ags_audio_set_audio_name(AgsAudio *audio, gchar *audio_name);
281 
282 GList* ags_audio_find_name(GList *audio,
283 			   gchar *audio_name);
284 
285 /* channel alignment */
286 guint ags_audio_get_max_audio_channels(AgsAudio *audio);
287 void ags_audio_set_max_audio_channels(AgsAudio *audio,
288 				      guint max_audio_channels);
289 
290 guint ags_audio_get_max_output_pads(AgsAudio *audio);
291 void ags_audio_set_max_output_pads(AgsAudio *audio,
292 				   guint max_output_pads);
293 
294 guint ags_audio_get_max_input_pads(AgsAudio *audio);
295 void ags_audio_set_max_input_pads(AgsAudio *audio,
296 				  guint max_input_pads);
297 
298 void ags_audio_set_max_pads(AgsAudio *audio,
299 			    GType channel_type,
300 			    guint max_pads);
301 
302 guint ags_audio_get_audio_channels(AgsAudio *audio);
303 void ags_audio_set_audio_channels(AgsAudio *audio,
304 				  guint audio_channels, guint audio_channels_old);
305 
306 guint ags_audio_get_output_pads(AgsAudio *audio);
307 void ags_audio_set_output_pads(AgsAudio *audio,
308 			       guint output_pads);
309 
310 guint ags_audio_get_input_pads(AgsAudio *audio);
311 void ags_audio_set_input_pads(AgsAudio *audio,
312 			      guint input_pads);
313 
314 void ags_audio_set_pads(AgsAudio *audio,
315 			GType channel_type,
316 			guint pads, guint pads_old);
317 
318 
319 guint ags_audio_get_output_lines(AgsAudio *audio);
320 guint ags_audio_get_input_lines(AgsAudio *audio);
321 
322 AgsChannel* ags_audio_get_output(AgsAudio *audio);
323 AgsChannel* ags_audio_get_input(AgsAudio *audio);
324 
325 /* soundcard */
326 GObject* ags_audio_get_output_soundcard(AgsAudio *audio);
327 void ags_audio_set_output_soundcard(AgsAudio *audio,
328 				    GObject *output_soundcard);
329 
330 GObject* ags_audio_get_input_soundcard(AgsAudio *audio);
331 void ags_audio_set_input_soundcard(AgsAudio *audio,
332 				   GObject *input_soundcard);
333 
334 /* sequencer */
335 GObject* ags_audio_get_output_sequencer(AgsAudio *audio);
336 void ags_audio_set_output_sequencer(AgsAudio *audio,
337 				    GObject *output_sequencer);
338 
339 GObject* ags_audio_get_input_sequencer(AgsAudio *audio);
340 void ags_audio_set_input_sequencer(AgsAudio *audio,
341 				   GObject *input_sequencer);
342 
343 /* presets */
344 guint ags_audio_get_samplerate(AgsAudio *audio);
345 void ags_audio_set_samplerate(AgsAudio *audio, guint samplerate);
346 
347 guint ags_audio_get_buffer_size(AgsAudio *audio);
348 void ags_audio_set_buffer_size(AgsAudio *audio, guint buffer_size);
349 
350 guint ags_audio_get_format(AgsAudio *audio);
351 void ags_audio_set_format(AgsAudio *audio, guint format);
352 
353 /* bpm */
354 gdouble ags_audio_get_bpm(AgsAudio *audio);
355 void ags_audio_set_bpm(AgsAudio *audio, gdouble bpm);
356 
357 /* mapping */
358 guint ags_audio_get_audio_start_mapping(AgsAudio *audio);
359 void ags_audio_set_audio_start_mapping(AgsAudio *audio,
360 				       guint audio_start_mapping);
361 
362 guint ags_audio_get_midi_start_mapping(AgsAudio *audio);
363 void ags_audio_set_midi_start_mapping(AgsAudio *audio,
364 				      guint midi_start_mapping);
365 
366 guint ags_audio_get_midi_channel(AgsAudio *audio);
367 void ags_audio_set_midi_channel(AgsAudio *audio,
368 				guint midi_channel);
369 
370 /* time signature */
371 guint ags_audio_get_numerator(AgsAudio *audio);
372 void ags_audio_set_numerator(AgsAudio *audio, guint numerator);
373 
374 guint ags_audio_get_denominator(AgsAudio *audio);
375 void ags_audio_set_denominator(AgsAudio *audio, guint denominator);
376 
377 gchar* ags_audio_get_time_signature(AgsAudio *audio);
378 void ags_audio_set_time_signature(AgsAudio *audio, gchar *time_signature);
379 
380 /* key */
381 gboolean ags_audio_get_is_minor(AgsAudio *audio);
382 void ags_audio_set_is_minor(AgsAudio *audio, gboolean is_minor);
383 
384 guint ags_audio_get_sharp_flats(AgsAudio *audio);
385 void ags_audio_set_sharp_flats(AgsAudio *audio, guint sharp_flats);
386 
387 gint ags_audio_get_octave(AgsAudio *audio);
388 void ags_audio_set_octave(AgsAudio *audio, gint octave);
389 
390 guint ags_audio_get_key(AgsAudio *audio);
391 void ags_audio_set_key(AgsAudio *audio, guint key);
392 
393 gint ags_audio_get_absolute_key(AgsAudio *audio);
394 void ags_audio_set_absolute_key(AgsAudio *audio, gint absolute_key);
395 
396 /* children */
397 GList* ags_audio_get_preset(AgsAudio *audio);
398 void ags_audio_set_preset(AgsAudio *audio, GList *preset);
399 
400 void ags_audio_add_preset(AgsAudio *audio, GObject *preset);
401 void ags_audio_remove_preset(AgsAudio *audio, GObject *preset);
402 
403 GObject* ags_audio_get_playback_domain(AgsAudio *audio);
404 void ags_audio_set_playback_domain(AgsAudio *audio, GObject *playback_domain);
405 
406 GList* ags_audio_get_synth_generator(AgsAudio *audio);
407 void ags_audio_set_synth_generator(AgsAudio *audio, GList *synth_generator);
408 
409 void ags_audio_add_synth_generator(AgsAudio *audio, GObject *synth_generator);
410 void ags_audio_remove_synth_generator(AgsAudio *audio, GObject *synth_generator);
411 
412 GList* ags_audio_get_sf2_synth_generator(AgsAudio *audio);
413 void ags_audio_set_sf2_synth_generator(AgsAudio *audio, GList *sf2_synth_generator);
414 
415 void ags_audio_add_sf2_synth_generator(AgsAudio *audio, GObject *sf2_synth_generator);
416 void ags_audio_remove_sf2_synth_generator(AgsAudio *audio, GObject *sf2_synth_generator);
417 
418 GList* ags_audio_get_sfz_synth_generator(AgsAudio *audio);
419 void ags_audio_set_sfz_synth_generator(AgsAudio *audio, GList *sfz_synth_generator);
420 
421 void ags_audio_add_sfz_synth_generator(AgsAudio *audio, GObject *sfz_synth_generator);
422 void ags_audio_remove_sfz_synth_generator(AgsAudio *audio, GObject *sfz_synth_generator);
423 
424 GList* ags_audio_get_cursor(AgsAudio *audio);
425 void ags_audio_set_cursor(AgsAudio *audio, GList *cursor);
426 
427 void ags_audio_add_cursor(AgsAudio *audio, GObject *cursor);
428 void ags_audio_remove_cursor(AgsAudio *audio, GObject *cursor);
429 
430 GList* ags_audio_get_notation(AgsAudio *audio);
431 void ags_audio_set_notation(AgsAudio *audio, GList *notation);
432 
433 void ags_audio_add_notation(AgsAudio *audio, GObject *notation);
434 void ags_audio_remove_notation(AgsAudio *audio, GObject *notation);
435 
436 gchar** ags_audio_get_automation_port(AgsAudio *audio);
437 void ags_audio_set_automation_port(AgsAudio *audio,
438 				   gchar **automation_port);
439 
440 void ags_audio_add_automation_port(AgsAudio *audio, gchar *control_name);
441 void ags_audio_remove_automation_port(AgsAudio *audio, gchar *control_name);
442 
443 GList* ags_audio_get_automation(AgsAudio *audio);
444 void ags_audio_set_automation(AgsAudio *audio, GList *automation);
445 
446 void ags_audio_add_automation(AgsAudio *audio, GObject *automation);
447 void ags_audio_remove_automation(AgsAudio *audio, GObject *automation);
448 
449 GList* ags_audio_get_wave(AgsAudio *audio);
450 void ags_audio_set_wave(AgsAudio *audio, GList *wave);
451 
452 void ags_audio_add_wave(AgsAudio *audio, GObject *wave);
453 void ags_audio_remove_wave(AgsAudio *audio, GObject *wave);
454 
455 GObject* ags_audio_get_output_audio_file(AgsAudio *audio);
456 void ags_audio_set_output_audio_file(AgsAudio *audio,
457 				     GObject *output_audio_file);
458 
459 GObject* ags_audio_get_input_audio_file(AgsAudio *audio);
460 void ags_audio_set_input_audio_file(AgsAudio *audio,
461 				    GObject *input_audio_file);
462 
463 gchar* ags_audio_get_instrument_name(AgsAudio *audio);
464 void ags_audio_set_instrument_name(AgsAudio *audio, gchar *instrument_name);
465 
466 gchar* ags_audio_get_track_name(AgsAudio *audio);
467 void ags_audio_set_track_name(AgsAudio *audio, gchar *track_name);
468 
469 GList* ags_audio_get_midi(AgsAudio *audio);
470 void ags_audio_set_midi(AgsAudio *audio, GList *midi);
471 
472 void ags_audio_add_midi(AgsAudio *audio, GObject *midi);
473 void ags_audio_remove_midi(AgsAudio *audio, GObject *midi);
474 
475 GObject* ags_audio_get_output_midi_file(AgsAudio *audio);
476 void ags_audio_set_output_midi_file(AgsAudio *audio,
477 				    GObject *output_midi_file);
478 
479 GObject* ags_audio_get_input_midi_file(AgsAudio *audio);
480 void ags_audio_set_input_midi_file(AgsAudio *audio,
481 				   GObject *input_midi_file);
482 
483 /* recall related */
484 GList* ags_audio_get_recall_id(AgsAudio *audio);
485 void ags_audio_set_recall_id(AgsAudio *audio, GList *recall_id);
486 
487 void ags_audio_add_recall_id(AgsAudio *audio, GObject *recall_id);
488 void ags_audio_remove_recall_id(AgsAudio *audio, GObject *recall_id);
489 
490 GList* ags_audio_get_recycling_context(AgsAudio *audio);
491 void ags_audio_set_recycling_context(AgsAudio *audio, GList *recycling_context);
492 
493 void ags_audio_add_recycling_context(AgsAudio *audio, GObject *recycling_context);
494 void ags_audio_remove_recycling_context(AgsAudio *audio, GObject *recycling_context);
495 
496 GList* ags_audio_get_recall_container(AgsAudio *audio);
497 void ags_audio_set_recall_container(AgsAudio *audio, GList *recall_container);
498 
499 void ags_audio_add_recall_container(AgsAudio *audio, GObject *recall_container);
500 void ags_audio_remove_recall_container(AgsAudio *audio, GObject *recall_container);
501 
502 GList* ags_audio_get_play(AgsAudio *audio);
503 void ags_audio_set_play(AgsAudio *audio, GList *play);
504 
505 GList* ags_audio_get_recall(AgsAudio *audio);
506 void ags_audio_set_recall(AgsAudio *audio, GList *recall);
507 
508 void ags_audio_add_recall(AgsAudio *audio, GObject *recall,
509 			  gboolean play_context);
510 void ags_audio_insert_recall(AgsAudio *audio, GObject *recall,
511 			     gboolean play_context,
512 			     gint position);
513 void ags_audio_remove_recall(AgsAudio *audio, GObject *recall,
514 			     gboolean play_context);
515 
516 /* stages */
517 void ags_audio_duplicate_recall(AgsAudio *audio,
518 				AgsRecallID *recall_id,
519 				guint pad, guint audio_channel,
520 				guint line);
521 void ags_audio_resolve_recall(AgsAudio *audio,
522 			      AgsRecallID *recall_id);
523 
524 void ags_audio_init_recall(AgsAudio *audio,
525 			   AgsRecallID *recall_id, guint staging_flags);
526 void ags_audio_play_recall(AgsAudio *audio,
527 			   AgsRecallID *recall_id, guint staging_flags);
528 
529 void ags_audio_done_recall(AgsAudio *audio,
530 			   AgsRecallID *recall_id);
531 void ags_audio_cancel_recall(AgsAudio *audio,
532 			     AgsRecallID *recall_id);
533 
534 void ags_audio_cleanup_recall(AgsAudio *audio,
535 			      AgsRecallID *recall_id);
536 
537 /* control */
538 GList* ags_audio_start(AgsAudio *audio,
539 		       gint sound_scope);
540 
541 void ags_audio_stop(AgsAudio *audio,
542 		    GList *recall_id, gint sound_scope);
543 
544 /* query */
545 GList* ags_audio_check_scope(AgsAudio *audio, gint sound_scope);
546 
547 GList* ags_audio_collect_all_audio_ports(AgsAudio *audio);
548 
549 GList* ags_audio_collect_all_audio_ports_by_specifier_and_context(AgsAudio *audio,
550 								  gchar *specifier,
551 								  gboolean play_context);
552 
553 /* file IO */
554 void ags_audio_open_audio_file_as_channel(AgsAudio *audio,
555 					  GSList *filename,
556 					  gboolean overwrite_channels,
557 					  gboolean create_channels);
558 void ags_audio_open_audio_file_as_wave(AgsAudio *audio,
559 				       const gchar *filename,
560 				       gboolean overwrite_channels,
561 				       gboolean create_channels);
562 
563 void ags_audio_open_midi_file_as_midi(AgsAudio *audio,
564 				      const gchar *filename,
565 				      const gchar *instrument,
566 				      const gchar *track_name,
567 				      guint midi_channel);
568 void ags_audio_open_midi_file_as_notation(AgsAudio *audio,
569 					  const gchar *filename,
570 					  const gchar *instrument,
571 					  const gchar *track_name,
572 					  guint midi_channel);
573 
574 /* recursive functions */
575 void ags_audio_recursive_set_property(AgsAudio *audio,
576 				      gint n_params,
577 				      const gchar *parameter_name[], const GValue value[]);
578 
579 void ags_audio_recursive_run_stage(AgsAudio *audio,
580 				   gint sound_scope, guint staging_flags);
581 
582 /* instantiate */
583 AgsAudio* ags_audio_new(GObject *output_soundcard);
584 
585 G_END_DECLS
586 
587 #endif /*__AGS_AUDIO_H__*/
588