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