1 /* GSequencer - Advanced GTK Sequencer
2 * Copyright (C) 2005-2015 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/task/ags_add_effect.h>
21
22 #include <ags/i18n.h>
23
24 void ags_add_effect_class_init(AgsAddEffectClass *add_effect);
25 void ags_add_effect_connectable_interface_init(AgsConnectableInterface *connectable);
26 void ags_add_effect_init(AgsAddEffect *add_effect);
27 void ags_add_effect_set_property(GObject *gobject,
28 guint prop_id,
29 const GValue *value,
30 GParamSpec *param_spec);
31 void ags_add_effect_get_property(GObject *gobject,
32 guint prop_id,
33 GValue *value,
34 GParamSpec *param_spec);
35 void ags_add_effect_connect(AgsConnectable *connectable);
36 void ags_add_effect_disconnect(AgsConnectable *connectable);
37 void ags_add_effect_dispose(GObject *gobject);
38 void ags_add_effect_finalize(GObject *gobject);
39
40 void ags_add_effect_launch(AgsTask *task);
41
42 /**
43 * SECTION:ags_add_effect
44 * @short_description: add effect object to context
45 * @title: AgsAddEffect
46 * @section_id:
47 * @include: ags/audio/task/ags_add_effect.h
48 *
49 * The #AgsAddEffect task adds the specified effect to #AgsChannel.
50 */
51
52 static gpointer ags_add_effect_parent_class = NULL;
53 static AgsConnectableInterface *ags_add_effect_parent_connectable_interface;
54
55 enum{
56 PROP_0,
57 PROP_CHANNEL,
58 PROP_FILENAME,
59 PROP_EFFECT,
60 };
61
62 GType
ags_add_effect_get_type()63 ags_add_effect_get_type()
64 {
65 static volatile gsize g_define_type_id__volatile = 0;
66
67 if(g_once_init_enter (&g_define_type_id__volatile)){
68 GType ags_type_add_effect = 0;
69
70 static const GTypeInfo ags_add_effect_info = {
71 sizeof (AgsAddEffectClass),
72 NULL, /* base_init */
73 NULL, /* base_finalize */
74 (GClassInitFunc) ags_add_effect_class_init,
75 NULL, /* class_finalize */
76 NULL, /* class_data */
77 sizeof (AgsAddEffect),
78 0, /* n_preallocs */
79 (GInstanceInitFunc) ags_add_effect_init,
80 };
81
82 static const GInterfaceInfo ags_connectable_interface_info = {
83 (GInterfaceInitFunc) ags_add_effect_connectable_interface_init,
84 NULL, /* interface_finalize */
85 NULL, /* interface_data */
86 };
87
88 ags_type_add_effect = g_type_register_static(AGS_TYPE_TASK,
89 "AgsAddEffect",
90 &ags_add_effect_info,
91 0);
92
93 g_type_add_interface_static(ags_type_add_effect,
94 AGS_TYPE_CONNECTABLE,
95 &ags_connectable_interface_info);
96
97 g_once_init_leave(&g_define_type_id__volatile, ags_type_add_effect);
98 }
99
100 return g_define_type_id__volatile;
101 }
102
103 void
ags_add_effect_class_init(AgsAddEffectClass * add_effect)104 ags_add_effect_class_init(AgsAddEffectClass *add_effect)
105 {
106 GObjectClass *gobject;
107 AgsTaskClass *task;
108 GParamSpec *param_spec;
109
110 ags_add_effect_parent_class = g_type_class_peek_parent(add_effect);
111
112 /* gobject */
113 gobject = (GObjectClass *) add_effect;
114
115 gobject->set_property = ags_add_effect_set_property;
116 gobject->get_property = ags_add_effect_get_property;
117
118 gobject->dispose = ags_add_effect_dispose;
119 gobject->finalize = ags_add_effect_finalize;
120
121 /* properties */
122 /**
123 * AgsAddEffect:channel:
124 *
125 * The assigned #AgsChannel
126 *
127 * Since: 3.0.0
128 */
129 param_spec = g_param_spec_object("channel",
130 i18n_pspec("channel of add effect"),
131 i18n_pspec("The channel of add effect task"),
132 AGS_TYPE_CHANNEL,
133 G_PARAM_READABLE | G_PARAM_WRITABLE);
134 g_object_class_install_property(gobject,
135 PROP_CHANNEL,
136 param_spec);
137
138 /**
139 * AgsAddEffect:filename:
140 *
141 * The assigned filename.
142 *
143 * Since: 3.0.0
144 */
145 param_spec = g_param_spec_string("filename",
146 i18n_pspec("the filename"),
147 i18n_pspec("The filename containing the effect"),
148 NULL,
149 G_PARAM_READABLE | G_PARAM_WRITABLE);
150 g_object_class_install_property(gobject,
151 PROP_FILENAME,
152 param_spec);
153
154 /**
155 * AgsAddEffect:effect:
156 *
157 * The assigned effect.
158 *
159 * Since: 3.0.0
160 */
161 param_spec = g_param_spec_string("effect",
162 i18n_pspec("the effect"),
163 i18n_pspec("The effect"),
164 NULL,
165 G_PARAM_READABLE | G_PARAM_WRITABLE);
166 g_object_class_install_property(gobject,
167 PROP_EFFECT,
168 param_spec);
169
170 /* task */
171 task = (AgsTaskClass *) add_effect;
172
173 task->launch = ags_add_effect_launch;
174 }
175
176 void
ags_add_effect_connectable_interface_init(AgsConnectableInterface * connectable)177 ags_add_effect_connectable_interface_init(AgsConnectableInterface *connectable)
178 {
179 ags_add_effect_parent_connectable_interface = g_type_interface_peek_parent(connectable);
180
181 connectable->connect = ags_add_effect_connect;
182 connectable->disconnect = ags_add_effect_disconnect;
183 }
184
185 void
ags_add_effect_init(AgsAddEffect * add_effect)186 ags_add_effect_init(AgsAddEffect *add_effect)
187 {
188 add_effect->channel = NULL;
189 add_effect->filename = NULL;
190 add_effect->effect = NULL;
191 }
192
193 void
ags_add_effect_set_property(GObject * gobject,guint prop_id,const GValue * value,GParamSpec * param_spec)194 ags_add_effect_set_property(GObject *gobject,
195 guint prop_id,
196 const GValue *value,
197 GParamSpec *param_spec)
198 {
199 AgsAddEffect *add_effect;
200
201 add_effect = AGS_ADD_EFFECT(gobject);
202
203 switch(prop_id){
204 case PROP_CHANNEL:
205 {
206 AgsChannel *channel;
207
208 channel = (AgsChannel *) g_value_get_object(value);
209
210 if(add_effect->channel == channel){
211 return;
212 }
213
214 if(add_effect->channel != NULL){
215 g_object_unref(add_effect->channel);
216 }
217
218 if(channel != NULL){
219 g_object_ref(channel);
220 }
221
222 add_effect->channel = channel;
223 }
224 break;
225 case PROP_FILENAME:
226 {
227 gchar *filename;
228
229 filename = g_value_get_string(value);
230
231 if(add_effect->filename == filename){
232 return;
233 }
234
235 if(add_effect->filename != NULL){
236 g_free(add_effect->filename);
237 }
238
239 add_effect->filename = g_strdup(filename);
240 }
241 break;
242 case PROP_EFFECT:
243 {
244 gchar *effect;
245
246 effect = g_value_get_string(value);
247
248 if(add_effect->effect == effect){
249 return;
250 }
251
252 if(add_effect->effect != NULL){
253 g_free(add_effect->effect);
254 }
255
256 add_effect->effect = g_strdup(effect);
257 }
258 break;
259 default:
260 G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
261 break;
262 }
263 }
264
265 void
ags_add_effect_get_property(GObject * gobject,guint prop_id,GValue * value,GParamSpec * param_spec)266 ags_add_effect_get_property(GObject *gobject,
267 guint prop_id,
268 GValue *value,
269 GParamSpec *param_spec)
270 {
271 AgsAddEffect *add_effect;
272
273 add_effect = AGS_ADD_EFFECT(gobject);
274
275 switch(prop_id){
276 case PROP_CHANNEL:
277 {
278 g_value_set_object(value, add_effect->channel);
279 }
280 break;
281 case PROP_FILENAME:
282 {
283 g_value_set_string(value, add_effect->filename);
284 }
285 break;
286 case PROP_EFFECT:
287 {
288 g_value_set_string(value, add_effect->effect);
289 }
290 break;
291 default:
292 G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
293 break;
294 }
295 }
296
297 void
ags_add_effect_connect(AgsConnectable * connectable)298 ags_add_effect_connect(AgsConnectable *connectable)
299 {
300 ags_add_effect_parent_connectable_interface->connect(connectable);
301
302 /* empty */
303 }
304
305 void
ags_add_effect_disconnect(AgsConnectable * connectable)306 ags_add_effect_disconnect(AgsConnectable *connectable)
307 {
308 ags_add_effect_parent_connectable_interface->disconnect(connectable);
309
310 /* empty */
311 }
312
313 void
ags_add_effect_dispose(GObject * gobject)314 ags_add_effect_dispose(GObject *gobject)
315 {
316 AgsAddEffect *add_effect;
317
318 add_effect = AGS_ADD_EFFECT(gobject);
319
320 if(add_effect->channel != NULL){
321 g_object_unref(add_effect->channel);
322
323 add_effect->channel = NULL;
324 }
325
326 if(add_effect->filename != NULL){
327 g_free(add_effect->filename);
328
329 add_effect->filename = NULL;
330 }
331
332 if(add_effect->effect != NULL){
333 g_free(add_effect->effect);
334
335 add_effect->effect = NULL;
336 }
337
338 /* call parent */
339 G_OBJECT_CLASS(ags_add_effect_parent_class)->dispose(gobject);
340 }
341
342 void
ags_add_effect_finalize(GObject * gobject)343 ags_add_effect_finalize(GObject *gobject)
344 {
345 AgsAddEffect *add_effect;
346
347 add_effect = AGS_ADD_EFFECT(gobject);
348
349 if(add_effect->channel != NULL){
350 g_object_unref(add_effect->channel);
351 }
352
353 g_free(add_effect->filename);
354 g_free(add_effect->effect);
355
356 /* call parent */
357 G_OBJECT_CLASS(ags_add_effect_parent_class)->finalize(gobject);
358 }
359
360 void
ags_add_effect_launch(AgsTask * task)361 ags_add_effect_launch(AgsTask *task)
362 {
363 AgsAddEffect *add_effect;
364
365 GList *recall_list;
366
367 add_effect = AGS_ADD_EFFECT(task);
368
369 recall_list = ags_channel_add_effect(add_effect->channel,
370 add_effect->filename,
371 add_effect->effect);
372 g_list_free(recall_list);
373 }
374
375 /**
376 * ags_add_effect_new:
377 * @channel: the #AgsChannel to set up the effect
378 * @filename: the filename including @effect
379 * @effect: the effect's name
380 *
381 * Create a new instance of #AgsAddEffect.
382 *
383 * Returns: the new #AgsAddEffect.
384 *
385 * Since: 3.0.0
386 */
387 AgsAddEffect*
ags_add_effect_new(AgsChannel * channel,gchar * filename,gchar * effect)388 ags_add_effect_new(AgsChannel *channel,
389 gchar *filename,
390 gchar *effect)
391 {
392 AgsAddEffect *add_effect;
393
394 add_effect = (AgsAddEffect *) g_object_new(AGS_TYPE_ADD_EFFECT,
395 "channel", channel,
396 "filename", filename,
397 "effect", effect,
398 NULL);
399
400 return(add_effect);
401 }
402