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/task/ags_switch_buffer_flag.h>
21 
22 #include <ags/audio/ags_devout.h>
23 #include <ags/audio/ags_devin.h>
24 #include <ags/audio/ags_midiin.h>
25 
26 #include <ags/audio/jack/ags_jack_devout.h>
27 #include <ags/audio/jack/ags_jack_devin.h>
28 #include <ags/audio/jack/ags_jack_midiin.h>
29 
30 #include <ags/audio/pulse/ags_pulse_devout.h>
31 #include <ags/audio/pulse/ags_pulse_devin.h>
32 
33 #include <ags/audio/wasapi/ags_wasapi_devout.h>
34 #include <ags/audio/wasapi/ags_wasapi_devin.h>
35 
36 #include <ags/audio/core-audio/ags_core_audio_devout.h>
37 #include <ags/audio/core-audio/ags_core_audio_devin.h>
38 #include <ags/audio/core-audio/ags_core_audio_midiin.h>
39 
40 #include <ags/i18n.h>
41 
42 void ags_switch_buffer_flag_class_init(AgsSwitchBufferFlagClass *switch_buffer_flag);
43 void ags_switch_buffer_flag_init(AgsSwitchBufferFlag *switch_buffer_flag);
44 void ags_switch_buffer_flag_set_property(GObject *gobject,
45 					 guint prop_id,
46 					 const GValue *value,
47 					 GParamSpec *param_spec);
48 void ags_switch_buffer_flag_get_property(GObject *gobject,
49 					 guint prop_id,
50 					 GValue *value,
51 					 GParamSpec *param_spec);
52 void ags_switch_buffer_flag_dispose(GObject *gobject);
53 void ags_switch_buffer_flag_finalize(GObject *gobject);
54 
55 void ags_switch_buffer_flag_launch(AgsTask *task);
56 
57 /**
58  * SECTION:ags_switch_buffer_flag
59  * @short_description: switch buffer flag of device
60  * @title: AgsSwitchBufferFlag
61  * @section_id:
62  * @include: ags/audio/task/ags_switch_buffer_flag.h
63  *
64  * The #AgsSwitchBufferFlag task switches the buffer flag of device.
65  */
66 
67 static gpointer ags_switch_buffer_flag_parent_class = NULL;
68 
69 enum{
70   PROP_0,
71   PROP_DEVICE,
72 };
73 
74 GType
ags_switch_buffer_flag_get_type()75 ags_switch_buffer_flag_get_type()
76 {
77   static volatile gsize g_define_type_id__volatile = 0;
78 
79   if(g_once_init_enter (&g_define_type_id__volatile)){
80     GType ags_type_switch_buffer_flag = 0;
81 
82     static const GTypeInfo ags_switch_buffer_flag_info = {
83       sizeof(AgsSwitchBufferFlagClass),
84       NULL, /* base_init */
85       NULL, /* base_finalize */
86       (GClassInitFunc) ags_switch_buffer_flag_class_init,
87       NULL, /* class_finalize */
88       NULL, /* class_data */
89       sizeof(AgsSwitchBufferFlag),
90       0,    /* n_preallocs */
91       (GInstanceInitFunc) ags_switch_buffer_flag_init,
92     };
93 
94     ags_type_switch_buffer_flag = g_type_register_static(AGS_TYPE_TASK,
95 							 "AgsSwitchBufferFlag",
96 							 &ags_switch_buffer_flag_info,
97 							 0);
98 
99     g_once_init_leave(&g_define_type_id__volatile, ags_type_switch_buffer_flag);
100   }
101 
102   return g_define_type_id__volatile;
103 }
104 
105 void
ags_switch_buffer_flag_class_init(AgsSwitchBufferFlagClass * switch_buffer_flag)106 ags_switch_buffer_flag_class_init(AgsSwitchBufferFlagClass *switch_buffer_flag)
107 {
108   GObjectClass *gobject;
109   AgsTaskClass *task;
110 
111   GParamSpec *param_spec;
112 
113   ags_switch_buffer_flag_parent_class = g_type_class_peek_parent(switch_buffer_flag);
114 
115   /* gobject */
116   gobject = (GObjectClass *) switch_buffer_flag;
117 
118   gobject->set_property = ags_switch_buffer_flag_set_property;
119   gobject->get_property = ags_switch_buffer_flag_get_property;
120 
121   gobject->dispose = ags_switch_buffer_flag_dispose;
122   gobject->finalize = ags_switch_buffer_flag_finalize;
123 
124   /* properties */
125   /**
126    * AgsSwitchBufferFlag:device:
127    *
128    * The assigned #AgsSoundcard or #AgsSequencer
129    *
130    * Since: 3.0.0
131    */
132   param_spec = g_param_spec_object("device",
133 				   i18n_pspec("device of change device"),
134 				   i18n_pspec("The device of change device task"),
135 				   G_TYPE_OBJECT,
136 				   G_PARAM_READABLE | G_PARAM_WRITABLE);
137   g_object_class_install_property(gobject,
138 				  PROP_DEVICE,
139 				  param_spec);
140 
141   /* task */
142   task = (AgsTaskClass *) switch_buffer_flag;
143 
144   task->launch = ags_switch_buffer_flag_launch;
145 }
146 
147 void
ags_switch_buffer_flag_init(AgsSwitchBufferFlag * switch_buffer_flag)148 ags_switch_buffer_flag_init(AgsSwitchBufferFlag *switch_buffer_flag)
149 {
150   switch_buffer_flag->device = NULL;
151 }
152 
153 void
ags_switch_buffer_flag_set_property(GObject * gobject,guint prop_id,const GValue * value,GParamSpec * param_spec)154 ags_switch_buffer_flag_set_property(GObject *gobject,
155 				    guint prop_id,
156 				    const GValue *value,
157 				    GParamSpec *param_spec)
158 {
159   AgsSwitchBufferFlag *switch_buffer_flag;
160 
161   switch_buffer_flag = AGS_SWITCH_BUFFER_FLAG(gobject);
162 
163   switch(prop_id){
164   case PROP_DEVICE:
165     {
166       GObject *device;
167 
168       device = (GObject *) g_value_get_object(value);
169 
170       if(switch_buffer_flag->device == (GObject *) device){
171 	return;
172       }
173 
174       if(switch_buffer_flag->device != NULL){
175 	g_object_unref(switch_buffer_flag->device);
176       }
177 
178       if(device != NULL){
179 	g_object_ref(device);
180       }
181 
182       switch_buffer_flag->device = (GObject *) device;
183     }
184     break;
185   default:
186     G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
187     break;
188   }
189 }
190 
191 void
ags_switch_buffer_flag_get_property(GObject * gobject,guint prop_id,GValue * value,GParamSpec * param_spec)192 ags_switch_buffer_flag_get_property(GObject *gobject,
193 				    guint prop_id,
194 				    GValue *value,
195 				    GParamSpec *param_spec)
196 {
197   AgsSwitchBufferFlag *switch_buffer_flag;
198 
199   switch_buffer_flag = AGS_SWITCH_BUFFER_FLAG(gobject);
200 
201   switch(prop_id){
202   case PROP_DEVICE:
203     {
204       g_value_set_object(value, switch_buffer_flag->device);
205     }
206     break;
207   default:
208     G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
209     break;
210   }
211 }
212 
213 void
ags_switch_buffer_flag_dispose(GObject * gobject)214 ags_switch_buffer_flag_dispose(GObject *gobject)
215 {
216   AgsSwitchBufferFlag *switch_buffer_flag;
217 
218   switch_buffer_flag = AGS_SWITCH_BUFFER_FLAG(gobject);
219 
220   if(switch_buffer_flag->device != NULL){
221     g_object_unref(switch_buffer_flag->device);
222 
223     switch_buffer_flag->device = NULL;
224   }
225 
226   /* call parent*/
227   G_OBJECT_CLASS(ags_switch_buffer_flag_parent_class)->dispose(gobject);
228 }
229 
230 void
ags_switch_buffer_flag_finalize(GObject * gobject)231 ags_switch_buffer_flag_finalize(GObject *gobject)
232 {
233   AgsSwitchBufferFlag *switch_buffer_flag;
234 
235   switch_buffer_flag = AGS_SWITCH_BUFFER_FLAG(gobject);
236 
237   if(switch_buffer_flag->device != NULL){
238     g_object_unref(switch_buffer_flag->device);
239   }
240 
241   /* call parent*/
242   G_OBJECT_CLASS(ags_switch_buffer_flag_parent_class)->finalize(gobject);
243 }
244 
245 void
ags_switch_buffer_flag_launch(AgsTask * task)246 ags_switch_buffer_flag_launch(AgsTask *task)
247 {
248   AgsSwitchBufferFlag *switch_buffer_flag;
249 
250   switch_buffer_flag = AGS_SWITCH_BUFFER_FLAG(task);
251 
252   /* switch buffer flag */
253   if(AGS_IS_DEVOUT(switch_buffer_flag->device)){
254     ags_devout_switch_buffer_flag((AgsDevout *) switch_buffer_flag->device);
255   }else if(AGS_IS_DEVIN(switch_buffer_flag->device)){
256     ags_devin_switch_buffer_flag((AgsDevin *) switch_buffer_flag->device);
257   }else if(AGS_IS_JACK_DEVOUT(switch_buffer_flag->device)){
258     ags_jack_devout_switch_buffer_flag((AgsJackDevout *) switch_buffer_flag->device);
259   }else if(AGS_IS_JACK_DEVIN(switch_buffer_flag->device)){
260     ags_jack_devin_switch_buffer_flag((AgsJackDevin *) switch_buffer_flag->device);
261   }else if(AGS_IS_PULSE_DEVOUT(switch_buffer_flag->device)){
262     ags_pulse_devout_switch_buffer_flag((AgsPulseDevout *) switch_buffer_flag->device);
263   }else if(AGS_IS_PULSE_DEVIN(switch_buffer_flag->device)){
264     ags_pulse_devin_switch_buffer_flag((AgsPulseDevin *) switch_buffer_flag->device);
265   }else if(AGS_IS_WASAPI_DEVOUT(switch_buffer_flag->device)){
266     ags_wasapi_devout_switch_buffer_flag((AgsWasapiDevout *) switch_buffer_flag->device);
267   }else if(AGS_IS_WASAPI_DEVIN(switch_buffer_flag->device)){
268     ags_wasapi_devin_switch_buffer_flag((AgsWasapiDevin *) switch_buffer_flag->device);
269   }else if(AGS_IS_CORE_AUDIO_DEVOUT(switch_buffer_flag->device)){
270     ags_core_audio_devout_switch_buffer_flag((AgsCoreAudioDevout *) switch_buffer_flag->device);
271   }else if(AGS_IS_CORE_AUDIO_DEVIN(switch_buffer_flag->device)){
272     ags_core_audio_devin_switch_buffer_flag((AgsCoreAudioDevin *) switch_buffer_flag->device);
273   }else if(AGS_IS_MIDIIN(switch_buffer_flag->device)){
274     ags_midiin_switch_buffer_flag((AgsMidiin *) switch_buffer_flag->device);
275   }else if(AGS_IS_JACK_MIDIIN(switch_buffer_flag->device)){
276     ags_jack_midiin_switch_buffer_flag((AgsJackMidiin *) switch_buffer_flag->device);
277   }else if(AGS_IS_CORE_AUDIO_MIDIIN(switch_buffer_flag->device)){
278     ags_core_audio_midiin_switch_buffer_flag((AgsCoreAudioMidiin *) switch_buffer_flag->device);
279   }
280 }
281 
282 /**
283  * ags_switch_buffer_flag_new:
284  * @device: the #AgsSoundcard or #AgsSequencer
285  *
286  * Creates an #AgsSwitchBufferFlag.
287  *
288  * Returns: an new #AgsSwitchBufferFlag.
289  *
290  * Since: 3.0.0
291  */
292 AgsSwitchBufferFlag*
ags_switch_buffer_flag_new(GObject * device)293 ags_switch_buffer_flag_new(GObject *device)
294 {
295   AgsSwitchBufferFlag *switch_buffer_flag;
296 
297   switch_buffer_flag = (AgsSwitchBufferFlag *) g_object_new(AGS_TYPE_SWITCH_BUFFER_FLAG,
298 							    "device", device,
299 							    NULL);
300 
301   return(switch_buffer_flag);
302 }
303