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