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