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