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 #include <ags/audio/fx/ags_fx_playback_audio.h>
21
22 #include <ags/i18n.h>
23
24 void ags_fx_playback_audio_class_init(AgsFxPlaybackAudioClass *fx_playback_audio);
25 void ags_fx_playback_audio_init(AgsFxPlaybackAudio *fx_playback_audio);
26 void ags_fx_playback_audio_set_property(GObject *gobject,
27 guint prop_id,
28 const GValue *value,
29 GParamSpec *param_spec);
30 void ags_fx_playback_audio_get_property(GObject *gobject,
31 guint prop_id,
32 GValue *value,
33 GParamSpec *param_spec);
34 void ags_fx_playback_audio_dispose(GObject *gobject);
35 void ags_fx_playback_audio_finalize(GObject *gobject);
36
37 /**
38 * SECTION:ags_fx_playback_audio
39 * @short_description: fx playback audio
40 * @title: AgsFxPlaybackAudio
41 * @section_id:
42 * @include: ags/audio/fx/ags_fx_playback_audio.h
43 *
44 * The #AgsFxPlaybackAudio class provides ports to the effect processor.
45 */
46
47 static gpointer ags_fx_playback_audio_parent_class = NULL;
48
49 const gchar *ags_fx_playback_audio_plugin_name = "ags-fx-playback";
50
51 const gchar* ags_fx_playback_audio_specifier[] = {
52 "./bpm[0]",
53 "./tact[0]",
54 "./delay[0]",
55 "./duration[0]"
56 "./loop[0]",
57 "./loop-start[0]",
58 "./loop-end[0]",
59 "./capture-mode[0]",
60 "./export[0]",
61 "./filename[0]",
62 "./file-audio-channels[0]",
63 "./file-samplerate[0]",
64 "./file-buffer-size[0]",
65 "./file-format[0]",
66 NULL,
67 };
68
69 const gchar* ags_fx_playback_audio_control_port[] = {
70 "1/14",
71 "2/14",
72 "3/14",
73 "4/14",
74 "5/14",
75 "6/14",
76 "7/14",
77 "8/14",
78 "9/14",
79 "10/14",
80 "11/14",
81 "12/14",
82 "13/14",
83 "14/14",
84 NULL,
85 };
86
87 enum{
88 PROP_0,
89 PROP_TACT,
90 PROP_BPM,
91 PROP_DELAY,
92 PROP_DURATION,
93 PROP_LOOP,
94 PROP_LOOP_START,
95 PROP_LOOP_END,
96 PROP_CAPTURE_MODE,
97 PROP_EXPORT,
98 PROP_FILENAME,
99 PROP_FILE_AUDIO_CHANNELS,
100 PROP_FILE_SAMPLERATE,
101 PROP_FILE_BUFFER_SIZE,
102 PROP_FILE_FORMAT,
103 };
104
105 GType
ags_fx_playback_audio_get_type()106 ags_fx_playback_audio_get_type()
107 {
108 static volatile gsize g_define_type_id__volatile = 0;
109
110 if(g_once_init_enter (&g_define_type_id__volatile)){
111 GType ags_type_fx_playback_audio = 0;
112
113 static const GTypeInfo ags_fx_playback_audio_info = {
114 sizeof (AgsFxPlaybackAudioClass),
115 NULL, /* base_init */
116 NULL, /* base_finalize */
117 (GClassInitFunc) ags_fx_playback_audio_class_init,
118 NULL, /* class_finalize */
119 NULL, /* class_audio */
120 sizeof (AgsFxPlaybackAudio),
121 0, /* n_preallocs */
122 (GInstanceInitFunc) ags_fx_playback_audio_init,
123 };
124
125 ags_type_fx_playback_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO,
126 "AgsFxPlaybackAudio",
127 &ags_fx_playback_audio_info,
128 0);
129
130 g_once_init_leave(&g_define_type_id__volatile, ags_type_fx_playback_audio);
131 }
132
133 return g_define_type_id__volatile;
134 }
135
136 void
ags_fx_playback_audio_class_init(AgsFxPlaybackAudioClass * fx_playback_audio)137 ags_fx_playback_audio_class_init(AgsFxPlaybackAudioClass *fx_playback_audio)
138 {
139 GObjectClass *gobject;
140
141 GParamSpec *param_spec;
142
143 ags_fx_playback_audio_parent_class = g_type_class_peek_parent(fx_playback_audio);
144
145 /* GObjectClass */
146 gobject = (GObjectClass *) fx_playback_audio;
147
148 gobject->set_property = ags_fx_playback_audio_set_property;
149 gobject->get_property = ags_fx_playback_audio_get_property;
150
151 gobject->dispose = ags_fx_playback_audio_dispose;
152 gobject->finalize = ags_fx_playback_audio_finalize;
153
154 /* properties */
155 /**
156 * AgsFxPlaybackAudio:bpm:
157 *
158 * The beats per minute.
159 *
160 * Since: 3.3.0
161 */
162 param_spec = g_param_spec_object("bpm",
163 i18n_pspec("bpm of recall"),
164 i18n_pspec("The recall's bpm"),
165 AGS_TYPE_PORT,
166 G_PARAM_READABLE | G_PARAM_WRITABLE);
167 g_object_class_install_property(gobject,
168 PROP_BPM,
169 param_spec);
170
171 /**
172 * AgsFxPlaybackAudio:tact:
173 *
174 * The tact segmentation.
175 *
176 * Since: 3.3.0
177 */
178 param_spec = g_param_spec_object("tact",
179 i18n_pspec("tact of recall"),
180 i18n_pspec("The recall's tact"),
181 AGS_TYPE_PORT,
182 G_PARAM_READABLE | G_PARAM_WRITABLE);
183 g_object_class_install_property(gobject,
184 PROP_TACT,
185 param_spec);
186
187 /**
188 * AgsFxPlaybackAudio:delay:
189 *
190 * The playback's delay.
191 *
192 * Since: 3.3.0
193 */
194 param_spec = g_param_spec_object("delay",
195 i18n_pspec("delay of recall"),
196 i18n_pspec("The delay of the playback"),
197 AGS_TYPE_PORT,
198 G_PARAM_READABLE | G_PARAM_WRITABLE);
199 g_object_class_install_property(gobject,
200 PROP_DELAY,
201 param_spec);
202
203 /**
204 * AgsFxPlaybackAudio:duration:
205 *
206 * The playback's duration.
207 *
208 * Since: 3.3.0
209 */
210 param_spec = g_param_spec_object("duration",
211 i18n_pspec("duration of recall"),
212 i18n_pspec("The duration of the playback"),
213 AGS_TYPE_PORT,
214 G_PARAM_READABLE | G_PARAM_WRITABLE);
215 g_object_class_install_property(gobject,
216 PROP_DURATION,
217 param_spec);
218
219 /**
220 * AgsFxPlaybackAudio:loop:
221 *
222 * Do loop.
223 *
224 * Since: 3.3.0
225 */
226 param_spec = g_param_spec_object("loop",
227 i18n_pspec("loop playing"),
228 i18n_pspec("Play in a infinite loop"),
229 AGS_TYPE_PORT,
230 G_PARAM_READABLE | G_PARAM_WRITABLE);
231 g_object_class_install_property(gobject,
232 PROP_LOOP,
233 param_spec);
234
235 /**
236 * AgsFxPlaybackAudio:loop-start:
237 *
238 * The playback's loop-start.
239 *
240 * Since: 3.3.0
241 */
242 param_spec = g_param_spec_object("loop-start",
243 i18n_pspec("start beat of playback loop"),
244 i18n_pspec("The start beat of the playback loop"),
245 AGS_TYPE_PORT,
246 G_PARAM_READABLE | G_PARAM_WRITABLE);
247 g_object_class_install_property(gobject,
248 PROP_LOOP_START,
249 param_spec);
250
251 /**
252 * AgsFxPlaybackAudio:loop-end:
253 *
254 * The playback's loop-end.
255 *
256 * Since: 3.3.0
257 */
258 param_spec = g_param_spec_object("loop-end",
259 i18n_pspec("end beat of playback loop"),
260 i18n_pspec("The end beat of the playback loop"),
261 AGS_TYPE_PORT,
262 G_PARAM_READABLE | G_PARAM_WRITABLE);
263 g_object_class_install_property(gobject,
264 PROP_LOOP_END,
265 param_spec);
266
267 /**
268 * AgsFxPlaybackAudio:capture-mode:
269 *
270 * The capture mode.
271 *
272 * Since: 3.3.0
273 */
274 param_spec = g_param_spec_object("capture-mode",
275 i18n_pspec("capture mode of recall"),
276 i18n_pspec("The recall's capture mode"),
277 AGS_TYPE_PORT,
278 G_PARAM_READABLE | G_PARAM_WRITABLE);
279 g_object_class_install_property(gobject,
280 PROP_CAPTURE_MODE,
281 param_spec);
282
283 /**
284 * AgsFxPlaybackAudio:export:
285 *
286 * The export switch.
287 *
288 * Since: 3.3.0
289 */
290 param_spec = g_param_spec_object("export",
291 i18n_pspec("export of recall"),
292 i18n_pspec("The recall's export"),
293 AGS_TYPE_PORT,
294 G_PARAM_READABLE | G_PARAM_WRITABLE);
295 g_object_class_install_property(gobject,
296 PROP_EXPORT,
297 param_spec);
298
299 /**
300 * AgsFxPlaybackAudio:filename:
301 *
302 * The filename to export.
303 *
304 * Since: 3.3.0
305 */
306 param_spec = g_param_spec_object("filename",
307 i18n_pspec("filename of recall"),
308 i18n_pspec("The recall's filename"),
309 AGS_TYPE_PORT,
310 G_PARAM_READABLE | G_PARAM_WRITABLE);
311 g_object_class_install_property(gobject,
312 PROP_FILENAME,
313 param_spec);
314
315 /**
316 * AgsFxPlaybackAudio:file-audio-channels:
317 *
318 * The file's audio channel count.
319 *
320 * Since: 3.3.0
321 */
322 param_spec = g_param_spec_object("file-audio-channels",
323 i18n_pspec("file audio channels of recall"),
324 i18n_pspec("The recall's file audio channels"),
325 AGS_TYPE_PORT,
326 G_PARAM_READABLE | G_PARAM_WRITABLE);
327 g_object_class_install_property(gobject,
328 PROP_FILE_AUDIO_CHANNELS,
329 param_spec);
330
331 /**
332 * AgsFxPlaybackAudio:file-samplerate:
333 *
334 * The file's samplerate.
335 *
336 * Since: 3.3.0
337 */
338 param_spec = g_param_spec_object("file-samplerate",
339 i18n_pspec("file samplerate of recall"),
340 i18n_pspec("The recall's file samplerate"),
341 AGS_TYPE_PORT,
342 G_PARAM_READABLE | G_PARAM_WRITABLE);
343 g_object_class_install_property(gobject,
344 PROP_FILE_SAMPLERATE,
345 param_spec);
346
347 /**
348 * AgsFxPlaybackAudio:file-buffer-size:
349 *
350 * The file's buffer size.
351 *
352 * Since: 3.3.0
353 */
354 param_spec = g_param_spec_object("file-buffer-size",
355 i18n_pspec("file buffer size of recall"),
356 i18n_pspec("The recall's file buffer size"),
357 AGS_TYPE_PORT,
358 G_PARAM_READABLE | G_PARAM_WRITABLE);
359 g_object_class_install_property(gobject,
360 PROP_FILE_BUFFER_SIZE,
361 param_spec);
362
363 /**
364 * AgsFxPlaybackAudio:file-format:
365 *
366 * The file's format.
367 *
368 * Since: 3.3.0
369 */
370 param_spec = g_param_spec_object("file-format",
371 i18n_pspec("file format of recall"),
372 i18n_pspec("The recall's file format"),
373 AGS_TYPE_PORT,
374 G_PARAM_READABLE | G_PARAM_WRITABLE);
375 g_object_class_install_property(gobject,
376 PROP_FILE_FORMAT,
377 param_spec);
378 }
379
380 void
ags_fx_playback_audio_init(AgsFxPlaybackAudio * fx_playback_audio)381 ags_fx_playback_audio_init(AgsFxPlaybackAudio *fx_playback_audio)
382 {
383 gdouble bpm;
384 gdouble delay;
385
386 AGS_RECALL(fx_playback_audio)->name = "ags-fx-playback";
387 AGS_RECALL(fx_playback_audio)->version = AGS_RECALL_DEFAULT_VERSION;
388 AGS_RECALL(fx_playback_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID;
389 AGS_RECALL(fx_playback_audio)->xml_type = "ags-fx-playback-audio";
390
391 fx_playback_audio->flags = 0;
392
393 fx_playback_audio->feed_audio_signal = NULL;
394 fx_playback_audio->master_audio_signal = NULL;
395
396 fx_playback_audio->audio_file = NULL;
397
398 bpm = AGS_SOUNDCARD_DEFAULT_BPM;
399 delay = AGS_SOUNDCARD_DEFAULT_DELAY;
400
401 /* bpm */
402 fx_playback_audio->bpm = g_object_new(AGS_TYPE_PORT,
403 "plugin-name", ags_fx_playback_audio_plugin_name,
404 "specifier", ags_fx_playback_audio_specifier[0],
405 "control-port", ags_fx_playback_audio_control_port[0],
406 "port-value-is-pointer", FALSE,
407 "port-value-type", G_TYPE_DOUBLE,
408 "port-value-size", sizeof(gdouble),
409 "port-value-length", 1,
410 NULL);
411
412 fx_playback_audio->bpm->port_value.ags_port_double = bpm;
413
414 ags_recall_add_port((AgsRecall *) fx_playback_audio,
415 fx_playback_audio->bpm);
416
417 /* tact */
418 fx_playback_audio->tact = g_object_new(AGS_TYPE_PORT,
419 "plugin-name", ags_fx_playback_audio_plugin_name,
420 "specifier", ags_fx_playback_audio_specifier[1],
421 "control-port", ags_fx_playback_audio_control_port[1],
422 "port-value-is-pointer", FALSE,
423 "port-value-type", G_TYPE_DOUBLE,
424 "port-value-size", sizeof(gdouble),
425 "port-value-length", 1,
426 NULL);
427
428 fx_playback_audio->tact->port_value.ags_port_double = AGS_SOUNDCARD_DEFAULT_TACT;
429
430 ags_recall_add_port((AgsRecall *) fx_playback_audio,
431 fx_playback_audio->tact);
432
433 /* delay */
434 fx_playback_audio->delay = g_object_new(AGS_TYPE_PORT,
435 "plugin-name", ags_fx_playback_audio_plugin_name,
436 "specifier", ags_fx_playback_audio_specifier[2],
437 "control-port", ags_fx_playback_audio_control_port[2],
438 "port-value-is-pointer", FALSE,
439 "port-value-type", G_TYPE_DOUBLE,
440 "port-value-size", sizeof(gdouble),
441 "port-value-length", 1,
442 NULL);
443
444 fx_playback_audio->delay->port_value.ags_port_double = delay;
445
446 ags_recall_add_port((AgsRecall *) fx_playback_audio,
447 fx_playback_audio->delay);
448
449 /* duration */
450 fx_playback_audio->duration = g_object_new(AGS_TYPE_PORT,
451 "plugin-name", ags_fx_playback_audio_plugin_name,
452 "specifier", ags_fx_playback_audio_specifier[3],
453 "control-port", ags_fx_playback_audio_control_port[3],
454 "port-value-is-pointer", FALSE,
455 "port-value-type", G_TYPE_UINT64,
456 "port-value-size", sizeof(guint64),
457 "port-value-length", 1,
458 NULL);
459
460 fx_playback_audio->duration->port_value.ags_port_double = ceil(AGS_NOTATION_DEFAULT_DURATION * delay);
461
462 ags_recall_add_port((AgsRecall *) fx_playback_audio,
463 fx_playback_audio->duration);
464
465 /* loop */
466 fx_playback_audio->loop = g_object_new(AGS_TYPE_PORT,
467 "plugin-name", ags_fx_playback_audio_plugin_name,
468 "specifier", ags_fx_playback_audio_specifier[4],
469 "control-port", ags_fx_playback_audio_control_port[4],
470 "port-value-is-pointer", FALSE,
471 "port-value-type", G_TYPE_BOOLEAN,
472 "port-value-size", sizeof(gboolean),
473 "port-value-length", 1,
474 NULL);
475
476 fx_playback_audio->loop->port_value.ags_port_boolean = FALSE;
477
478 ags_recall_add_port((AgsRecall *) fx_playback_audio,
479 fx_playback_audio->loop);
480
481 /* loop-start */
482 fx_playback_audio->loop_start = g_object_new(AGS_TYPE_PORT,
483 "plugin-name", ags_fx_playback_audio_plugin_name,
484 "specifier", ags_fx_playback_audio_specifier[5],
485 "control-port", ags_fx_playback_audio_control_port[5],
486 "port-value-is-pointer", FALSE,
487 "port-value-type", G_TYPE_UINT64,
488 "port-value-size", sizeof(guint64),
489 "port-value-length", 1,
490 NULL);
491
492 fx_playback_audio->loop_start->port_value.ags_port_uint = AGS_FX_PLAYBACK_AUDIO_DEFAULT_LOOP_START;
493
494 ags_recall_add_port((AgsRecall *) fx_playback_audio,
495 fx_playback_audio->loop_start);
496
497 /* loop-end */
498 fx_playback_audio->loop_end = g_object_new(AGS_TYPE_PORT,
499 "plugin-name", ags_fx_playback_audio_plugin_name,
500 "specifier", ags_fx_playback_audio_specifier[6],
501 "control-port", ags_fx_playback_audio_control_port[6],
502 "port-value-is-pointer", FALSE,
503 "port-value-type", G_TYPE_UINT64,
504 "port-value-size", sizeof(guint64),
505 "port-value-length", 1,
506 NULL);
507
508 fx_playback_audio->loop_end->port_value.ags_port_uint = AGS_FX_PLAYBACK_AUDIO_DEFAULT_LOOP_END;
509
510 ags_recall_add_port((AgsRecall *) fx_playback_audio,
511 fx_playback_audio->loop_end);
512
513 /* capture mode */
514 fx_playback_audio->capture_mode = g_object_new(AGS_TYPE_PORT,
515 "plugin-name", ags_fx_playback_audio_plugin_name,
516 "specifier", ags_fx_playback_audio_specifier[7],
517 "control-port", ags_fx_playback_audio_control_port[7],
518 "port-value-is-pointer", FALSE,
519 "port-value-type", G_TYPE_UINT64,
520 "port-value-size", sizeof(guint64),
521 "port-value-length", 1,
522 NULL);
523
524 fx_playback_audio->capture_mode->port_value.ags_port_uint = AGS_FX_PLAYBACK_AUDIO_CAPTURE_MODE_NONE;
525
526 ags_recall_add_port((AgsRecall *) fx_playback_audio,
527 fx_playback_audio->capture_mode);
528
529 /* export */
530 fx_playback_audio->export = g_object_new(AGS_TYPE_PORT,
531 "plugin-name", ags_fx_playback_audio_plugin_name,
532 "specifier", ags_fx_playback_audio_specifier[8],
533 "control-port", ags_fx_playback_audio_control_port[8],
534 "port-value-is-pointer", FALSE,
535 "port-value-type", G_TYPE_BOOLEAN,
536 "port-value-size", sizeof(gboolean),
537 "port-value-length", 1,
538 NULL);
539
540 fx_playback_audio->export->port_value.ags_port_boolean = FALSE;
541
542 ags_recall_add_port((AgsRecall *) fx_playback_audio,
543 fx_playback_audio->export);
544
545 /* filename */
546 fx_playback_audio->filename = g_object_new(AGS_TYPE_PORT,
547 "plugin-name", ags_fx_playback_audio_plugin_name,
548 "specifier", ags_fx_playback_audio_specifier[9],
549 "control-port", ags_fx_playback_audio_control_port[9],
550 "port-value-is-pointer", FALSE,
551 "port-value-type", G_TYPE_POINTER,
552 NULL);
553
554 fx_playback_audio->filename->port_value.ags_port_pointer = NULL;
555
556 ags_recall_add_port((AgsRecall *) fx_playback_audio,
557 fx_playback_audio->filename);
558
559 /* file audio channels */
560 fx_playback_audio->file_audio_channels = g_object_new(AGS_TYPE_PORT,
561 "plugin-name", ags_fx_playback_audio_plugin_name,
562 "specifier", ags_fx_playback_audio_specifier[10],
563 "control-port", ags_fx_playback_audio_control_port[10],
564 "port-value-is-pointer", FALSE,
565 "port-value-type", G_TYPE_UINT64,
566 "port-value-size", sizeof(guint64),
567 "port-value-length", 1,
568 NULL);
569
570 fx_playback_audio->file_audio_channels->port_value.ags_port_uint = AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS;
571
572 ags_recall_add_port((AgsRecall *) fx_playback_audio,
573 fx_playback_audio->file_audio_channels);
574
575 /* file samplerate */
576 fx_playback_audio->file_samplerate = g_object_new(AGS_TYPE_PORT,
577 "plugin-name", ags_fx_playback_audio_plugin_name,
578 "specifier", ags_fx_playback_audio_specifier[11],
579 "control-port", ags_fx_playback_audio_control_port[11],
580 "port-value-is-pointer", FALSE,
581 "port-value-type", G_TYPE_UINT64,
582 "port-value-size", sizeof(guint64),
583 "port-value-length", 1,
584 NULL);
585
586 fx_playback_audio->file_samplerate->port_value.ags_port_uint = AGS_SOUNDCARD_DEFAULT_SAMPLERATE;
587
588 ags_recall_add_port((AgsRecall *) fx_playback_audio,
589 fx_playback_audio->file_samplerate);
590
591 /* file buffer size */
592 fx_playback_audio->file_buffer_size = g_object_new(AGS_TYPE_PORT,
593 "plugin-name", ags_fx_playback_audio_plugin_name,
594 "specifier", ags_fx_playback_audio_specifier[12],
595 "control-port", ags_fx_playback_audio_control_port[12],
596 "port-value-is-pointer", FALSE,
597 "port-value-type", G_TYPE_UINT64,
598 "port-value-size", sizeof(guint64),
599 "port-value-length", 1,
600 NULL);
601
602 fx_playback_audio->file_buffer_size->port_value.ags_port_uint = AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE;
603
604 ags_recall_add_port((AgsRecall *) fx_playback_audio,
605 fx_playback_audio->file_buffer_size);
606
607 /* file format */
608 fx_playback_audio->file_format = g_object_new(AGS_TYPE_PORT,
609 "plugin-name", ags_fx_playback_audio_plugin_name,
610 "specifier", ags_fx_playback_audio_specifier[13],
611 "control-port", ags_fx_playback_audio_control_port[13],
612 "port-value-is-pointer", FALSE,
613 "port-value-type", G_TYPE_UINT64,
614 "port-value-size", sizeof(guint64),
615 "port-value-length", 1,
616 NULL);
617
618 fx_playback_audio->file_format->port_value.ags_port_uint = AGS_SOUNDCARD_DEFAULT_FORMAT;
619
620 ags_recall_add_port((AgsRecall *) fx_playback_audio,
621 fx_playback_audio->file_format);
622 }
623
624 void
ags_fx_playback_audio_set_property(GObject * gobject,guint prop_id,const GValue * value,GParamSpec * param_spec)625 ags_fx_playback_audio_set_property(GObject *gobject,
626 guint prop_id,
627 const GValue *value,
628 GParamSpec *param_spec)
629 {
630 AgsFxPlaybackAudio *fx_playback_audio;
631
632 GRecMutex *recall_mutex;
633
634 fx_playback_audio = AGS_FX_PLAYBACK_AUDIO(gobject);
635
636 /* get recall mutex */
637 recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(fx_playback_audio);
638
639 switch(prop_id){
640 case PROP_BPM:
641 {
642 AgsPort *port;
643
644 port = (AgsPort *) g_value_get_object(value);
645
646 g_rec_mutex_lock(recall_mutex);
647
648 if(port == fx_playback_audio->bpm){
649 g_rec_mutex_unlock(recall_mutex);
650
651 return;
652 }
653
654 if(fx_playback_audio->bpm != NULL){
655 g_object_unref(G_OBJECT(fx_playback_audio->bpm));
656 }
657
658 if(port != NULL){
659 g_object_ref(G_OBJECT(port));
660 }
661
662 fx_playback_audio->bpm = port;
663
664 g_rec_mutex_unlock(recall_mutex);
665 }
666 break;
667 case PROP_TACT:
668 {
669 AgsPort *port;
670
671 port = (AgsPort *) g_value_get_object(value);
672
673 g_rec_mutex_lock(recall_mutex);
674
675 if(port == fx_playback_audio->tact){
676 g_rec_mutex_unlock(recall_mutex);
677
678 return;
679 }
680
681 if(fx_playback_audio->tact != NULL){
682 g_object_unref(G_OBJECT(fx_playback_audio->tact));
683 }
684
685 if(port != NULL){
686 g_object_ref(G_OBJECT(port));
687 }
688
689 fx_playback_audio->tact = port;
690
691 g_rec_mutex_unlock(recall_mutex);
692 }
693 break;
694 case PROP_DELAY:
695 {
696 AgsPort *port;
697
698 port = (AgsPort *) g_value_get_object(value);
699
700 g_rec_mutex_lock(recall_mutex);
701
702 if(port == fx_playback_audio->delay){
703 g_rec_mutex_unlock(recall_mutex);
704
705 return;
706 }
707
708 if(fx_playback_audio->delay != NULL){
709 g_object_unref(G_OBJECT(fx_playback_audio->delay));
710 }
711
712 if(port != NULL){
713 g_object_ref(G_OBJECT(port));
714 }
715
716 fx_playback_audio->delay = port;
717
718 g_rec_mutex_unlock(recall_mutex);
719 }
720 break;
721 case PROP_DURATION:
722 {
723 AgsPort *port;
724
725 port = (AgsPort *) g_value_get_object(value);
726
727 g_rec_mutex_lock(recall_mutex);
728
729 if(port == fx_playback_audio->duration){
730 g_rec_mutex_unlock(recall_mutex);
731
732 return;
733 }
734
735 if(fx_playback_audio->duration != NULL){
736 g_object_unref(G_OBJECT(fx_playback_audio->duration));
737 }
738
739 if(port != NULL){
740 g_object_ref(G_OBJECT(port));
741 }
742
743 fx_playback_audio->duration = port;
744
745 g_rec_mutex_unlock(recall_mutex);
746 }
747 break;
748 case PROP_LOOP:
749 {
750 AgsPort *port;
751
752 port = (AgsPort *) g_value_get_object(value);
753
754 g_rec_mutex_lock(recall_mutex);
755
756 if(port == fx_playback_audio->loop){
757 g_rec_mutex_unlock(recall_mutex);
758
759 return;
760 }
761
762 if(fx_playback_audio->loop != NULL){
763 g_object_unref(G_OBJECT(fx_playback_audio->loop));
764 }
765
766 if(port != NULL){
767 g_object_ref(G_OBJECT(port));
768 }
769
770 fx_playback_audio->loop = port;
771
772 g_rec_mutex_unlock(recall_mutex);
773 }
774 break;
775 case PROP_LOOP_START:
776 {
777 AgsPort *port;
778
779 port = (AgsPort *) g_value_get_object(value);
780
781 g_rec_mutex_lock(recall_mutex);
782
783 if(port == fx_playback_audio->loop_start){
784 g_rec_mutex_unlock(recall_mutex);
785
786 return;
787 }
788
789 if(fx_playback_audio->loop_start != NULL){
790 g_object_unref(G_OBJECT(fx_playback_audio->loop_start));
791 }
792
793 if(port != NULL){
794 g_object_ref(G_OBJECT(port));
795 }
796
797 fx_playback_audio->loop_start = port;
798
799 g_rec_mutex_unlock(recall_mutex);
800 }
801 break;
802 case PROP_LOOP_END:
803 {
804 AgsPort *port;
805
806 port = (AgsPort *) g_value_get_object(value);
807
808 g_rec_mutex_lock(recall_mutex);
809
810 if(port == fx_playback_audio->loop_end){
811 g_rec_mutex_unlock(recall_mutex);
812
813 return;
814 }
815
816 if(fx_playback_audio->loop_end != NULL){
817 g_object_unref(G_OBJECT(fx_playback_audio->loop_end));
818 }
819
820 if(port != NULL){
821 g_object_ref(G_OBJECT(port));
822 }
823
824 fx_playback_audio->loop_end = port;
825
826 g_rec_mutex_unlock(recall_mutex);
827 }
828 break;
829 case PROP_CAPTURE_MODE:
830 {
831 AgsPort *port;
832
833 port = (AgsPort *) g_value_get_object(value);
834
835 g_rec_mutex_lock(recall_mutex);
836
837 if(port == fx_playback_audio->capture_mode){
838 g_rec_mutex_unlock(recall_mutex);
839
840 return;
841 }
842
843 if(fx_playback_audio->capture_mode != NULL){
844 g_object_unref(G_OBJECT(fx_playback_audio->capture_mode));
845 }
846
847 if(port != NULL){
848 g_object_ref(G_OBJECT(port));
849 }
850
851 fx_playback_audio->capture_mode = port;
852
853 g_rec_mutex_unlock(recall_mutex);
854 }
855 break;
856 case PROP_EXPORT:
857 {
858 AgsPort *port;
859
860 port = (AgsPort *) g_value_get_object(value);
861
862 g_rec_mutex_lock(recall_mutex);
863
864 if(port == fx_playback_audio->export){
865 g_rec_mutex_unlock(recall_mutex);
866
867 return;
868 }
869
870 if(fx_playback_audio->export != NULL){
871 g_object_unref(G_OBJECT(fx_playback_audio->export));
872 }
873
874 if(port != NULL){
875 g_object_ref(G_OBJECT(port));
876 }
877
878 fx_playback_audio->export = port;
879
880 g_rec_mutex_unlock(recall_mutex);
881 }
882 break;
883 case PROP_FILENAME:
884 {
885 AgsPort *port;
886
887 port = (AgsPort *) g_value_get_object(value);
888
889 g_rec_mutex_lock(recall_mutex);
890
891 if(port == fx_playback_audio->filename){
892 g_rec_mutex_unlock(recall_mutex);
893
894 return;
895 }
896
897 if(fx_playback_audio->filename != NULL){
898 g_object_unref(G_OBJECT(fx_playback_audio->filename));
899 }
900
901 if(port != NULL){
902 g_object_ref(G_OBJECT(port));
903 }
904
905 fx_playback_audio->filename = port;
906
907 g_rec_mutex_unlock(recall_mutex);
908 }
909 break;
910 case PROP_FILE_AUDIO_CHANNELS:
911 {
912 AgsPort *port;
913
914 port = (AgsPort *) g_value_get_object(value);
915
916 g_rec_mutex_lock(recall_mutex);
917
918 if(port == fx_playback_audio->file_audio_channels){
919 g_rec_mutex_unlock(recall_mutex);
920
921 return;
922 }
923
924 if(fx_playback_audio->file_audio_channels != NULL){
925 g_object_unref(G_OBJECT(fx_playback_audio->file_audio_channels));
926 }
927
928 if(port != NULL){
929 g_object_ref(G_OBJECT(port));
930 }
931
932 fx_playback_audio->file_audio_channels = port;
933
934 g_rec_mutex_unlock(recall_mutex);
935 }
936 break;
937 case PROP_FILE_SAMPLERATE:
938 {
939 AgsPort *port;
940
941 port = (AgsPort *) g_value_get_object(value);
942
943 g_rec_mutex_lock(recall_mutex);
944
945 if(port == fx_playback_audio->file_samplerate){
946 g_rec_mutex_unlock(recall_mutex);
947
948 return;
949 }
950
951 if(fx_playback_audio->file_samplerate != NULL){
952 g_object_unref(G_OBJECT(fx_playback_audio->file_samplerate));
953 }
954
955 if(port != NULL){
956 g_object_ref(G_OBJECT(port));
957 }
958
959 fx_playback_audio->file_samplerate = port;
960
961 g_rec_mutex_unlock(recall_mutex);
962 }
963 break;
964 case PROP_FILE_BUFFER_SIZE:
965 {
966 AgsPort *port;
967
968 port = (AgsPort *) g_value_get_object(value);
969
970 g_rec_mutex_lock(recall_mutex);
971
972 if(port == fx_playback_audio->file_buffer_size){
973 g_rec_mutex_unlock(recall_mutex);
974
975 return;
976 }
977
978 if(fx_playback_audio->file_buffer_size != NULL){
979 g_object_unref(G_OBJECT(fx_playback_audio->file_buffer_size));
980 }
981
982 if(port != NULL){
983 g_object_ref(G_OBJECT(port));
984 }
985
986 fx_playback_audio->file_buffer_size = port;
987
988 g_rec_mutex_unlock(recall_mutex);
989 }
990 break;
991 case PROP_FILE_FORMAT:
992 {
993 AgsPort *port;
994
995 port = (AgsPort *) g_value_get_object(value);
996
997 g_rec_mutex_lock(recall_mutex);
998
999 if(port == fx_playback_audio->file_format){
1000 g_rec_mutex_unlock(recall_mutex);
1001
1002 return;
1003 }
1004
1005 if(fx_playback_audio->file_format != NULL){
1006 g_object_unref(G_OBJECT(fx_playback_audio->file_format));
1007 }
1008
1009 if(port != NULL){
1010 g_object_ref(G_OBJECT(port));
1011 }
1012
1013 fx_playback_audio->file_format = port;
1014
1015 g_rec_mutex_unlock(recall_mutex);
1016 }
1017 break;
1018 default:
1019 G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
1020 break;
1021 };
1022 }
1023
1024 void
ags_fx_playback_audio_get_property(GObject * gobject,guint prop_id,GValue * value,GParamSpec * param_spec)1025 ags_fx_playback_audio_get_property(GObject *gobject,
1026 guint prop_id,
1027 GValue *value,
1028 GParamSpec *param_spec)
1029 {
1030 AgsFxPlaybackAudio *fx_playback_audio;
1031
1032 GRecMutex *recall_mutex;
1033
1034 fx_playback_audio = AGS_FX_PLAYBACK_AUDIO(gobject);
1035
1036 /* get recall mutex */
1037 recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(fx_playback_audio);
1038
1039 switch(prop_id){
1040 case PROP_BPM:
1041 {
1042 g_rec_mutex_lock(recall_mutex);
1043
1044 g_value_set_object(value, fx_playback_audio->bpm);
1045
1046 g_rec_mutex_unlock(recall_mutex);
1047 }
1048 break;
1049 case PROP_TACT:
1050 {
1051 g_rec_mutex_lock(recall_mutex);
1052
1053 g_value_set_object(value, fx_playback_audio->tact);
1054
1055 g_rec_mutex_unlock(recall_mutex);
1056 }
1057 break;
1058 case PROP_DELAY:
1059 {
1060 g_rec_mutex_lock(recall_mutex);
1061
1062 g_value_set_object(value, fx_playback_audio->delay);
1063
1064 g_rec_mutex_unlock(recall_mutex);
1065 }
1066 break;
1067 case PROP_DURATION:
1068 {
1069 g_rec_mutex_lock(recall_mutex);
1070
1071 g_value_set_object(value, fx_playback_audio->duration);
1072
1073 g_rec_mutex_unlock(recall_mutex);
1074 }
1075 break;
1076 case PROP_LOOP:
1077 {
1078 g_rec_mutex_lock(recall_mutex);
1079
1080 g_value_set_object(value, fx_playback_audio->loop);
1081
1082 g_rec_mutex_unlock(recall_mutex);
1083 }
1084 break;
1085 case PROP_LOOP_START:
1086 {
1087 g_rec_mutex_lock(recall_mutex);
1088
1089 g_value_set_object(value, fx_playback_audio->loop_start);
1090
1091 g_rec_mutex_unlock(recall_mutex);
1092 }
1093 break;
1094 case PROP_LOOP_END:
1095 {
1096 g_rec_mutex_lock(recall_mutex);
1097
1098 g_value_set_object(value, fx_playback_audio->loop_end);
1099
1100 g_rec_mutex_unlock(recall_mutex);
1101 }
1102 break;
1103 case PROP_CAPTURE_MODE:
1104 {
1105 g_rec_mutex_lock(recall_mutex);
1106
1107 g_value_set_object(value, fx_playback_audio->capture_mode);
1108
1109 g_rec_mutex_unlock(recall_mutex);
1110 }
1111 break;
1112 case PROP_EXPORT:
1113 {
1114 g_rec_mutex_lock(recall_mutex);
1115
1116 g_value_set_object(value, fx_playback_audio->export);
1117
1118 g_rec_mutex_unlock(recall_mutex);
1119 }
1120 break;
1121 case PROP_FILENAME:
1122 {
1123 g_rec_mutex_lock(recall_mutex);
1124
1125 g_value_set_object(value, fx_playback_audio->filename);
1126
1127 g_rec_mutex_unlock(recall_mutex);
1128 }
1129 break;
1130 case PROP_FILE_AUDIO_CHANNELS:
1131 {
1132 g_rec_mutex_lock(recall_mutex);
1133
1134 g_value_set_object(value, fx_playback_audio->file_audio_channels);
1135
1136 g_rec_mutex_unlock(recall_mutex);
1137 }
1138 break;
1139 case PROP_FILE_SAMPLERATE:
1140 {
1141 g_rec_mutex_lock(recall_mutex);
1142
1143 g_value_set_object(value, fx_playback_audio->file_samplerate);
1144
1145 g_rec_mutex_unlock(recall_mutex);
1146 }
1147 break;
1148 case PROP_FILE_BUFFER_SIZE:
1149 {
1150 g_rec_mutex_lock(recall_mutex);
1151
1152 g_value_set_object(value, fx_playback_audio->file_buffer_size);
1153
1154 g_rec_mutex_unlock(recall_mutex);
1155 }
1156 break;
1157 case PROP_FILE_FORMAT:
1158 {
1159 g_rec_mutex_lock(recall_mutex);
1160
1161 g_value_set_object(value, fx_playback_audio->file_format);
1162
1163 g_rec_mutex_unlock(recall_mutex);
1164 }
1165 break;
1166 default:
1167 G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
1168 break;
1169 };
1170 }
1171
1172 void
ags_fx_playback_audio_dispose(GObject * gobject)1173 ags_fx_playback_audio_dispose(GObject *gobject)
1174 {
1175 AgsFxPlaybackAudio *fx_playback_audio;
1176
1177 fx_playback_audio = AGS_FX_PLAYBACK_AUDIO(gobject);
1178
1179 if(fx_playback_audio->feed_audio_signal != NULL){
1180 g_list_free_full(fx_playback_audio->feed_audio_signal,
1181 (GDestroyNotify) g_object_unref);
1182
1183 fx_playback_audio->feed_audio_signal = NULL;
1184 }
1185
1186 if(fx_playback_audio->master_audio_signal != NULL){
1187 g_list_free_full(fx_playback_audio->master_audio_signal,
1188 (GDestroyNotify) g_object_unref);
1189
1190 fx_playback_audio->master_audio_signal = NULL;
1191 }
1192
1193 if(fx_playback_audio->bpm != NULL){
1194 g_object_unref(fx_playback_audio->bpm);
1195
1196 fx_playback_audio->bpm = NULL;
1197 }
1198
1199 if(fx_playback_audio->tact != NULL){
1200 g_object_unref(fx_playback_audio->tact);
1201
1202 fx_playback_audio->tact = NULL;
1203 }
1204
1205 if(fx_playback_audio->delay != NULL){
1206 g_object_unref(fx_playback_audio->delay);
1207
1208 fx_playback_audio->delay = NULL;
1209 }
1210
1211 if(fx_playback_audio->duration != NULL){
1212 g_object_unref(fx_playback_audio->duration);
1213
1214 fx_playback_audio->duration = NULL;
1215 }
1216
1217 if(fx_playback_audio->loop != NULL){
1218 g_object_unref(fx_playback_audio->loop);
1219
1220 fx_playback_audio->loop = NULL;
1221 }
1222
1223 if(fx_playback_audio->loop_start != NULL){
1224 g_object_unref(fx_playback_audio->loop_start);
1225
1226 fx_playback_audio->loop_start = NULL;
1227 }
1228
1229 if(fx_playback_audio->loop_end != NULL){
1230 g_object_unref(fx_playback_audio->loop_end);
1231
1232 fx_playback_audio->loop_end = NULL;
1233 }
1234
1235 if(fx_playback_audio->capture_mode != NULL){
1236 g_object_unref(fx_playback_audio->capture_mode);
1237
1238 fx_playback_audio->capture_mode = NULL;
1239 }
1240
1241 if(fx_playback_audio->export != NULL){
1242 g_object_unref(fx_playback_audio->export);
1243
1244 fx_playback_audio->export = NULL;
1245 }
1246
1247 if(fx_playback_audio->filename != NULL){
1248 g_object_unref(fx_playback_audio->filename);
1249
1250 fx_playback_audio->filename = NULL;
1251 }
1252
1253 if(fx_playback_audio->file_audio_channels != NULL){
1254 g_object_unref(fx_playback_audio->file_audio_channels);
1255
1256 fx_playback_audio->file_audio_channels = NULL;
1257 }
1258
1259 if(fx_playback_audio->file_samplerate != NULL){
1260 g_object_unref(fx_playback_audio->file_samplerate);
1261
1262 fx_playback_audio->file_samplerate = NULL;
1263 }
1264
1265 if(fx_playback_audio->file_buffer_size != NULL){
1266 g_object_unref(fx_playback_audio->file_buffer_size);
1267
1268 fx_playback_audio->file_buffer_size = NULL;
1269 }
1270
1271 if(fx_playback_audio->file_format != NULL){
1272 g_object_unref(fx_playback_audio->file_format);
1273
1274 fx_playback_audio->file_format = NULL;
1275 }
1276
1277 /* call parent */
1278 G_OBJECT_CLASS(ags_fx_playback_audio_parent_class)->dispose(gobject);
1279 }
1280
1281 void
ags_fx_playback_audio_finalize(GObject * gobject)1282 ags_fx_playback_audio_finalize(GObject *gobject)
1283 {
1284 AgsFxPlaybackAudio *fx_playback_audio;
1285
1286 fx_playback_audio = AGS_FX_PLAYBACK_AUDIO(gobject);
1287
1288 if(fx_playback_audio->feed_audio_signal != NULL){
1289 g_list_free_full(fx_playback_audio->feed_audio_signal,
1290 (GDestroyNotify) g_object_unref);
1291 }
1292
1293 if(fx_playback_audio->master_audio_signal != NULL){
1294 g_list_free_full(fx_playback_audio->master_audio_signal,
1295 (GDestroyNotify) g_object_unref);
1296 }
1297
1298 if(fx_playback_audio->audio_file != NULL){
1299 g_object_unref(fx_playback_audio->audio_file);
1300 }
1301
1302 if(fx_playback_audio->bpm != NULL){
1303 g_object_unref(fx_playback_audio->bpm);
1304 }
1305
1306 if(fx_playback_audio->tact != NULL){
1307 g_object_unref(fx_playback_audio->tact);
1308 }
1309
1310 if(fx_playback_audio->delay != NULL){
1311 g_object_unref(fx_playback_audio->delay);
1312 }
1313
1314 if(fx_playback_audio->duration != NULL){
1315 g_object_unref(fx_playback_audio->duration);
1316 }
1317
1318 if(fx_playback_audio->loop != NULL){
1319 g_object_unref(fx_playback_audio->loop);
1320 }
1321
1322 if(fx_playback_audio->loop_start != NULL){
1323 g_object_unref(fx_playback_audio->loop_start);
1324 }
1325
1326 if(fx_playback_audio->loop_end != NULL){
1327 g_object_unref(fx_playback_audio->loop_end);
1328 }
1329
1330 if(fx_playback_audio->capture_mode != NULL){
1331 g_object_unref(fx_playback_audio->capture_mode);
1332 }
1333
1334 if(fx_playback_audio->export != NULL){
1335 g_object_unref(fx_playback_audio->export);
1336 }
1337
1338 if(fx_playback_audio->filename != NULL){
1339 g_object_unref(fx_playback_audio->filename);
1340 }
1341
1342 if(fx_playback_audio->file_audio_channels != NULL){
1343 g_object_unref(fx_playback_audio->file_audio_channels);
1344 }
1345
1346 if(fx_playback_audio->file_samplerate != NULL){
1347 g_object_unref(fx_playback_audio->file_samplerate);
1348 }
1349
1350 if(fx_playback_audio->file_buffer_size != NULL){
1351 g_object_unref(fx_playback_audio->file_buffer_size);
1352 }
1353
1354 if(fx_playback_audio->file_format != NULL){
1355 g_object_unref(fx_playback_audio->file_format);
1356 }
1357
1358 /* call parent */
1359 G_OBJECT_CLASS(ags_fx_playback_audio_parent_class)->finalize(gobject);
1360 }
1361
1362 /**
1363 * ags_fx_playback_audio_test_flags:
1364 * @fx_playback_audio: the #AgsFxPlaybackAudio
1365 * @flags: the flags
1366 *
1367 * Test @flags of @fx_playback_audio.
1368 *
1369 * Returns: %TRUE on success, otherwise %FALSE
1370 *
1371 * Since: 3.3.0
1372 */
1373 gboolean
ags_fx_playback_audio_test_flags(AgsFxPlaybackAudio * fx_playback_audio,guint flags)1374 ags_fx_playback_audio_test_flags(AgsFxPlaybackAudio *fx_playback_audio, guint flags)
1375 {
1376 gboolean success;
1377
1378 GRecMutex *recall_mutex;
1379
1380 if(!AGS_IS_FX_PLAYBACK_AUDIO(fx_playback_audio)){
1381 return(FALSE);
1382 }
1383
1384 /* get recall mutex */
1385 recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(fx_playback_audio);
1386
1387 /* test flags */
1388 g_rec_mutex_lock(recall_mutex);
1389
1390 success = ((flags & (fx_playback_audio->flags)) != 0) ? TRUE: FALSE;
1391
1392 g_rec_mutex_unlock(recall_mutex);
1393
1394 return(success);
1395 }
1396
1397 /**
1398 * ags_fx_playback_audio_set_flags:
1399 * @fx_playback_audio: the #AgsFxPlaybackAudio
1400 * @flags: the flags
1401 *
1402 * Set @flags of @fx_playback_audio.
1403 *
1404 * Since: 3.3.0
1405 */
1406 void
ags_fx_playback_audio_set_flags(AgsFxPlaybackAudio * fx_playback_audio,guint flags)1407 ags_fx_playback_audio_set_flags(AgsFxPlaybackAudio *fx_playback_audio, guint flags)
1408 {
1409 GRecMutex *recall_mutex;
1410
1411 if(!AGS_IS_FX_PLAYBACK_AUDIO(fx_playback_audio)){
1412 return;
1413 }
1414
1415 /* get recall mutex */
1416 recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(fx_playback_audio);
1417
1418 /* set flags */
1419 g_rec_mutex_lock(recall_mutex);
1420
1421 fx_playback_audio->flags |= flags;
1422
1423 g_rec_mutex_unlock(recall_mutex);
1424 }
1425
1426 /**
1427 * ags_fx_playback_audio_unset_flags:
1428 * @fx_playback_audio: the #AgsFxPlaybackAudio
1429 * @flags: the flags
1430 *
1431 * Unset @flags of @fx_playback_audio.
1432 *
1433 * Since: 3.3.0
1434 */
1435 void
ags_fx_playback_audio_unset_flags(AgsFxPlaybackAudio * fx_playback_audio,guint flags)1436 ags_fx_playback_audio_unset_flags(AgsFxPlaybackAudio *fx_playback_audio, guint flags)
1437 {
1438 GRecMutex *recall_mutex;
1439
1440 if(!AGS_IS_FX_PLAYBACK_AUDIO(fx_playback_audio)){
1441 return;
1442 }
1443
1444 /* get recall mutex */
1445 recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(fx_playback_audio);
1446
1447 /* unset flags */
1448 g_rec_mutex_lock(recall_mutex);
1449
1450 fx_playback_audio->flags &= (~flags);
1451
1452 g_rec_mutex_unlock(recall_mutex);
1453 }
1454
1455 /**
1456 * ags_fx_playback_audio_get_feed_audio_signal:
1457 * @fx_playback_audio: the #AgsFxPlaybackAudio
1458 *
1459 * Get feed audio_signal of @fx_playback_audio.
1460 *
1461 * Returns: (element-type AgsAudio.AudioSignal) (transfer full): the #GList-struct containing feed audio_signal
1462 *
1463 * Since: 3.3.0
1464 */
1465 GList*
ags_fx_playback_audio_get_feed_audio_signal(AgsFxPlaybackAudio * fx_playback_audio)1466 ags_fx_playback_audio_get_feed_audio_signal(AgsFxPlaybackAudio *fx_playback_audio)
1467 {
1468 GList *feed_audio_signal;
1469
1470 GRecMutex *recall_mutex;
1471
1472 if(!AGS_IS_FX_PLAYBACK_AUDIO(fx_playback_audio)){
1473 return(NULL);
1474 }
1475
1476 /* get recall mutex */
1477 recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(fx_playback_audio);
1478
1479 /* unset flags */
1480 g_rec_mutex_lock(recall_mutex);
1481
1482 feed_audio_signal = g_list_copy_deep(fx_playback_audio->feed_audio_signal,
1483 (GCopyFunc) g_object_ref,
1484 NULL);
1485
1486 g_rec_mutex_unlock(recall_mutex);
1487
1488 return(feed_audio_signal);
1489 }
1490
1491 /**
1492 * ags_fx_playback_audio_add_feed_audio_signal:
1493 * @fx_playback_audio: the #AgsFxPlaybackAudio
1494 * @audio_signal: the #AgsAudioSignal
1495 *
1496 * Add @audio_signal to @fx_playback_audio.
1497 *
1498 * Since: 3.3.0
1499 */
1500 void
ags_fx_playback_audio_add_feed_audio_signal(AgsFxPlaybackAudio * fx_playback_audio,AgsAudioSignal * audio_signal)1501 ags_fx_playback_audio_add_feed_audio_signal(AgsFxPlaybackAudio *fx_playback_audio,
1502 AgsAudioSignal *audio_signal)
1503 {
1504 GRecMutex *recall_mutex;
1505
1506 if(!AGS_IS_FX_PLAYBACK_AUDIO(fx_playback_audio)){
1507 return;
1508 }
1509
1510 /* get recall mutex */
1511 recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(fx_playback_audio);
1512
1513 /* add */
1514 g_rec_mutex_lock(recall_mutex);
1515
1516 if(g_list_find(fx_playback_audio->feed_audio_signal, audio_signal) == NULL){
1517 g_object_ref(audio_signal);
1518
1519 fx_playback_audio->feed_audio_signal = g_list_prepend(fx_playback_audio->feed_audio_signal,
1520 audio_signal);
1521 }
1522
1523 g_rec_mutex_unlock(recall_mutex);
1524 }
1525
1526 /**
1527 * ags_fx_playback_audio_remove_feed_audio_signal:
1528 * @fx_playback_audio: the #AgsFxPlaybackAudio
1529 * @audio_signal: the #AgsAudioSignal
1530 *
1531 * Remove @audio_signal from @fx_playback_audio.
1532 *
1533 * Since: 3.3.0
1534 */
1535 void
ags_fx_playback_audio_remove_feed_audio_signal(AgsFxPlaybackAudio * fx_playback_audio,AgsAudioSignal * audio_signal)1536 ags_fx_playback_audio_remove_feed_audio_signal(AgsFxPlaybackAudio *fx_playback_audio,
1537 AgsAudioSignal *audio_signal)
1538 {
1539 GRecMutex *recall_mutex;
1540
1541 if(!AGS_IS_FX_PLAYBACK_AUDIO(fx_playback_audio)){
1542 return;
1543 }
1544
1545 /* get recall mutex */
1546 recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(fx_playback_audio);
1547
1548 /* remove */
1549 g_rec_mutex_lock(recall_mutex);
1550
1551 if(g_list_find(fx_playback_audio->feed_audio_signal, audio_signal) != NULL){
1552 fx_playback_audio->feed_audio_signal = g_list_remove(fx_playback_audio->feed_audio_signal,
1553 audio_signal);
1554 g_object_unref(audio_signal);
1555 }
1556
1557 g_rec_mutex_unlock(recall_mutex);
1558 }
1559
1560 /**
1561 * ags_fx_playback_audio_get_master_audio_signal:
1562 * @fx_playback_audio: the #AgsFxPlaybackAudio
1563 *
1564 * Get master audio_signal of @fx_playback_audio.
1565 *
1566 * Returns: (element-type AgsAudio.AudioSignal) (transfer full): the #GList-struct containing master audio_signal
1567 *
1568 * Since: 3.3.0
1569 */
1570 GList*
ags_fx_playback_audio_get_master_audio_signal(AgsFxPlaybackAudio * fx_playback_audio)1571 ags_fx_playback_audio_get_master_audio_signal(AgsFxPlaybackAudio *fx_playback_audio)
1572 {
1573 GList *master_audio_signal;
1574
1575 GRecMutex *recall_mutex;
1576
1577 if(!AGS_IS_FX_PLAYBACK_AUDIO(fx_playback_audio)){
1578 return(NULL);
1579 }
1580
1581 /* get recall mutex */
1582 recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(fx_playback_audio);
1583
1584 /* unset flags */
1585 g_rec_mutex_lock(recall_mutex);
1586
1587 master_audio_signal = g_list_copy_deep(fx_playback_audio->master_audio_signal,
1588 (GCopyFunc) g_object_ref,
1589 NULL);
1590
1591 g_rec_mutex_unlock(recall_mutex);
1592
1593 return(master_audio_signal);
1594 }
1595
1596 /**
1597 * ags_fx_playback_audio_add_master_audio_signal:
1598 * @fx_playback_audio: the #AgsFxPlaybackAudio
1599 * @audio_signal: the #AgsAudioSignal
1600 *
1601 * Add @audio_signal to @fx_playback_audio.
1602 *
1603 * Since: 3.3.0
1604 */
1605 void
ags_fx_playback_audio_add_master_audio_signal(AgsFxPlaybackAudio * fx_playback_audio,AgsAudioSignal * audio_signal)1606 ags_fx_playback_audio_add_master_audio_signal(AgsFxPlaybackAudio *fx_playback_audio,
1607 AgsAudioSignal *audio_signal)
1608 {
1609 GRecMutex *recall_mutex;
1610
1611 if(!AGS_IS_FX_PLAYBACK_AUDIO(fx_playback_audio)){
1612 return;
1613 }
1614
1615 /* get recall mutex */
1616 recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(fx_playback_audio);
1617
1618 /* add */
1619 g_rec_mutex_lock(recall_mutex);
1620
1621 if(g_list_find(fx_playback_audio->master_audio_signal, audio_signal) == NULL){
1622 g_object_ref(audio_signal);
1623
1624 fx_playback_audio->master_audio_signal = g_list_prepend(fx_playback_audio->master_audio_signal,
1625 audio_signal);
1626 }
1627
1628 g_rec_mutex_unlock(recall_mutex);
1629 }
1630
1631 /**
1632 * ags_fx_playback_audio_remove_master_audio_signal:
1633 * @fx_playback_audio: the #AgsFxPlaybackAudio
1634 * @audio_signal: the #AgsAudioSignal
1635 *
1636 * Remove @audio_signal from @fx_playback_audio.
1637 *
1638 * Since: 3.3.0
1639 */
1640 void
ags_fx_playback_audio_remove_master_audio_signal(AgsFxPlaybackAudio * fx_playback_audio,AgsAudioSignal * audio_signal)1641 ags_fx_playback_audio_remove_master_audio_signal(AgsFxPlaybackAudio *fx_playback_audio,
1642 AgsAudioSignal *audio_signal)
1643 {
1644 GRecMutex *recall_mutex;
1645
1646 if(!AGS_IS_FX_PLAYBACK_AUDIO(fx_playback_audio)){
1647 return;
1648 }
1649
1650 /* get recall mutex */
1651 recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(fx_playback_audio);
1652
1653 /* remove */
1654 g_rec_mutex_lock(recall_mutex);
1655
1656 if(g_list_find(fx_playback_audio->master_audio_signal, audio_signal) != NULL){
1657 fx_playback_audio->master_audio_signal = g_list_remove(fx_playback_audio->master_audio_signal,
1658 audio_signal);
1659 g_object_unref(audio_signal);
1660 }
1661
1662 g_rec_mutex_unlock(recall_mutex);
1663 }
1664
1665 /**
1666 * ags_fx_playback_audio_open_audio_file:
1667 * @fx_playback_audio: the #AgsFxPlaybackAudio
1668 *
1669 * Open audio file of @fx_playback_audio.
1670 *
1671 * Since: 3.3.0
1672 */
1673 void
ags_fx_playback_audio_open_audio_file(AgsFxPlaybackAudio * fx_playback_audio)1674 ags_fx_playback_audio_open_audio_file(AgsFxPlaybackAudio *fx_playback_audio)
1675 {
1676 //TODO:JK: implement me
1677 }
1678
1679 /**
1680 * ags_fx_playback_audio_new:
1681 * @audio: the #AgsAudio
1682 *
1683 * Create a new instance of #AgsFxPlaybackAudio
1684 *
1685 * Returns: the new #AgsFxPlaybackAudio
1686 *
1687 * Since: 3.3.0
1688 */
1689 AgsFxPlaybackAudio*
ags_fx_playback_audio_new(AgsAudio * audio)1690 ags_fx_playback_audio_new(AgsAudio *audio)
1691 {
1692 AgsFxPlaybackAudio *fx_playback_audio;
1693
1694 fx_playback_audio = (AgsFxPlaybackAudio *) g_object_new(AGS_TYPE_FX_PLAYBACK_AUDIO,
1695 "audio", audio,
1696 NULL);
1697
1698 return(fx_playback_audio);
1699 }
1700