1 /* GSequencer - Advanced GTK Sequencer
2 * Copyright (C) 2005-2021 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/X/ags_plugin_browser.h>
21 #include <ags/X/ags_plugin_browser_callbacks.h>
22
23 #include <ags/X/ags_lv2_browser.h>
24 #include <ags/X/ags_dssi_browser.h>
25 #include <ags/X/ags_ladspa_browser.h>
26
27 #include <ags/i18n.h>
28
29 void ags_plugin_browser_class_init(AgsPluginBrowserClass *plugin_browser);
30 void ags_plugin_browser_init(AgsPluginBrowser *plugin_browser);
31 void ags_plugin_browser_connectable_interface_init(AgsConnectableInterface *connectable);
32 void ags_plugin_browser_applicable_interface_init(AgsApplicableInterface *applicable);
33
34 gboolean ags_plugin_browser_delete_event(GtkWidget *widget, GdkEventAny *event);
35 void ags_plugin_browser_show(GtkWidget *widget);
36
37 void ags_plugin_browser_connect(AgsConnectable *connectable);
38 void ags_plugin_browser_disconnect(AgsConnectable *connectable);
39
40 void ags_plugin_browser_set_update(AgsApplicable *applicable, gboolean update);
41 void ags_plugin_browser_apply(AgsApplicable *applicable);
42 void ags_plugin_browser_reset(AgsApplicable *applicable);
43
44 /**
45 * SECTION:ags_plugin_browser
46 * @short_description: A composite to select plugin effect.
47 * @title: AgsPluginBrowser
48 * @section_id:
49 * @include: ags/X/ags_plugin_browser.h
50 *
51 * #AgsPluginBrowser is a composite widget to select plugin plugin and the desired
52 * effect.
53 */
54
55 static gpointer ags_plugin_browser_parent_class = NULL;
56
57 GType
ags_plugin_browser_get_type(void)58 ags_plugin_browser_get_type(void)
59 {
60 static volatile gsize g_define_type_id__volatile = 0;
61
62 if(g_once_init_enter (&g_define_type_id__volatile)){
63 GType ags_type_plugin_browser = 0;
64
65 static const GTypeInfo ags_plugin_browser_info = {
66 sizeof (AgsPluginBrowserClass),
67 NULL, /* base_init */
68 NULL, /* base_finalize */
69 (GClassInitFunc) ags_plugin_browser_class_init,
70 NULL, /* class_finalize */
71 NULL, /* class_data */
72 sizeof (AgsPluginBrowser),
73 0, /* n_preallocs */
74 (GInstanceInitFunc) ags_plugin_browser_init,
75 };
76
77 static const GInterfaceInfo ags_connectable_interface_info = {
78 (GInterfaceInitFunc) ags_plugin_browser_connectable_interface_init,
79 NULL, /* interface_finalize */
80 NULL, /* interface_data */
81 };
82
83 static const GInterfaceInfo ags_applicable_interface_info = {
84 (GInterfaceInitFunc) ags_plugin_browser_applicable_interface_init,
85 NULL, /* interface_finalize */
86 NULL, /* interface_data */
87 };
88
89 ags_type_plugin_browser = g_type_register_static(GTK_TYPE_DIALOG,
90 "AgsPluginBrowser", &ags_plugin_browser_info,
91 0);
92
93 g_type_add_interface_static(ags_type_plugin_browser,
94 AGS_TYPE_CONNECTABLE,
95 &ags_connectable_interface_info);
96
97 g_type_add_interface_static(ags_type_plugin_browser,
98 AGS_TYPE_APPLICABLE,
99 &ags_applicable_interface_info);
100
101 g_once_init_leave(&g_define_type_id__volatile, ags_type_plugin_browser);
102 }
103
104 return g_define_type_id__volatile;
105 }
106
107 void
ags_plugin_browser_class_init(AgsPluginBrowserClass * plugin_browser)108 ags_plugin_browser_class_init(AgsPluginBrowserClass *plugin_browser)
109 {
110 GtkWidgetClass *widget;
111
112 ags_plugin_browser_parent_class = g_type_class_peek_parent(plugin_browser);
113
114 /* GtkWidgetClass */
115 widget = (GtkWidgetClass *) plugin_browser;
116
117 widget->delete_event = ags_plugin_browser_delete_event;
118 widget->show = ags_plugin_browser_show;
119 }
120
121 void
ags_plugin_browser_connectable_interface_init(AgsConnectableInterface * connectable)122 ags_plugin_browser_connectable_interface_init(AgsConnectableInterface *connectable)
123 {
124 connectable->is_ready = NULL;
125 connectable->is_connected = NULL;
126 connectable->connect = ags_plugin_browser_connect;
127 connectable->disconnect = ags_plugin_browser_disconnect;
128 }
129
130 void
ags_plugin_browser_applicable_interface_init(AgsApplicableInterface * applicable)131 ags_plugin_browser_applicable_interface_init(AgsApplicableInterface *applicable)
132 {
133 applicable->set_update = ags_plugin_browser_set_update;
134 applicable->apply = ags_plugin_browser_apply;
135 applicable->reset = ags_plugin_browser_reset;
136 }
137
138 void
ags_plugin_browser_init(AgsPluginBrowser * plugin_browser)139 ags_plugin_browser_init(AgsPluginBrowser *plugin_browser)
140 {
141 GtkBox *vbox;
142 GtkBox *hbox;
143 GtkLabel *label;
144
145 plugin_browser->flags = 0;
146
147 gtk_window_set_title((GtkWindow *) plugin_browser,
148 i18n("Plugin browser"));
149
150 vbox = (GtkBox *) gtk_box_new(GTK_ORIENTATION_VERTICAL,
151 0);
152 gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(GTK_DIALOG(plugin_browser)),
153 GTK_WIDGET(vbox),
154 FALSE, FALSE,
155 0);
156
157 hbox = (GtkBox *) gtk_box_new(GTK_ORIENTATION_HORIZONTAL,
158 0);
159 gtk_box_pack_start((GtkBox *) vbox,
160 (GtkWidget *) hbox,
161 FALSE, FALSE,
162 0);
163
164 label = (GtkLabel *) gtk_label_new(i18n("Plugin type:"));
165 gtk_box_pack_start((GtkBox *) hbox,
166 (GtkWidget *) label,
167 FALSE, FALSE,
168 0);
169
170 plugin_browser->plugin_type = (GtkComboBoxText *) gtk_combo_box_text_new();
171 gtk_box_pack_start((GtkBox *) hbox,
172 (GtkWidget *) plugin_browser->plugin_type,
173 FALSE, FALSE,
174 0);
175
176 gtk_combo_box_text_append_text(plugin_browser->plugin_type,
177 "lv2");
178 gtk_combo_box_text_append_text(plugin_browser->plugin_type,
179 "ladspa");
180
181 plugin_browser->active_browser = NULL;
182
183 plugin_browser->lv2_browser = (GtkWidget *) ags_lv2_browser_new();
184 gtk_box_pack_start((GtkBox *) vbox,
185 (GtkWidget *) plugin_browser->lv2_browser,
186 FALSE, FALSE,
187 0);
188
189 plugin_browser->dssi_browser = NULL;
190
191 plugin_browser->ladspa_browser = (GtkWidget *) ags_ladspa_browser_new();
192 gtk_box_pack_start((GtkBox *) vbox,
193 (GtkWidget *) plugin_browser->ladspa_browser,
194 FALSE, FALSE,
195 0);
196
197 plugin_browser->vst_browser = NULL;
198
199 /* action area */
200 gtk_dialog_add_buttons((GtkDialog *) plugin_browser,
201 i18n("_OK"), GTK_RESPONSE_ACCEPT,
202 i18n("_Cancel"), GTK_RESPONSE_REJECT,
203 NULL);
204 }
205
206 gboolean
ags_plugin_browser_delete_event(GtkWidget * widget,GdkEventAny * event)207 ags_plugin_browser_delete_event(GtkWidget *widget, GdkEventAny *event)
208 {
209 gtk_widget_hide(widget);
210
211 return(TRUE);
212 }
213
214 void
ags_plugin_browser_show(GtkWidget * widget)215 ags_plugin_browser_show(GtkWidget *widget)
216 {
217 AgsPluginBrowser *plugin_browser;
218
219 plugin_browser = AGS_PLUGIN_BROWSER(widget);
220
221 GTK_WIDGET_CLASS(ags_plugin_browser_parent_class)->show(widget);
222
223 gtk_widget_hide(plugin_browser->lv2_browser);
224 gtk_widget_hide(plugin_browser->ladspa_browser);
225 }
226
227 void
ags_plugin_browser_connect(AgsConnectable * connectable)228 ags_plugin_browser_connect(AgsConnectable *connectable)
229 {
230 AgsPluginBrowser *plugin_browser;
231
232 plugin_browser = AGS_PLUGIN_BROWSER(connectable);
233
234 if((AGS_PLUGIN_BROWSER_CONNECTED & (plugin_browser->flags)) != 0){
235 return;
236 }
237
238 plugin_browser->flags |= AGS_PLUGIN_BROWSER_CONNECTED;
239
240 g_signal_connect(plugin_browser->plugin_type, "changed",
241 G_CALLBACK(ags_plugin_browser_plugin_type_changed_callback), plugin_browser);
242
243 ags_connectable_connect(AGS_CONNECTABLE(plugin_browser->lv2_browser));
244 ags_connectable_connect(AGS_CONNECTABLE(plugin_browser->ladspa_browser));
245
246 /* AgsPluginBrowser response */
247 g_signal_connect((GObject *) plugin_browser, "response",
248 G_CALLBACK(ags_plugin_browser_response_callback), NULL);
249 }
250
251 void
ags_plugin_browser_disconnect(AgsConnectable * connectable)252 ags_plugin_browser_disconnect(AgsConnectable *connectable)
253 {
254 AgsPluginBrowser *plugin_browser;
255
256 plugin_browser = AGS_PLUGIN_BROWSER(connectable);
257
258 if((AGS_PLUGIN_BROWSER_CONNECTED & (plugin_browser->flags)) == 0){
259 return;
260 }
261
262 plugin_browser->flags &= (~AGS_PLUGIN_BROWSER_CONNECTED);
263
264 g_object_disconnect(plugin_browser->plugin_type,
265 "any_signal::changed",
266 G_CALLBACK(ags_plugin_browser_plugin_type_changed_callback),
267 plugin_browser,
268 NULL);
269
270 ags_connectable_disconnect(AGS_CONNECTABLE(plugin_browser->lv2_browser));
271 ags_connectable_disconnect(AGS_CONNECTABLE(plugin_browser->ladspa_browser));
272
273 /* AgsPluginBrowser buttons */
274 g_object_disconnect((GObject *) plugin_browser,
275 "any_signal::response",
276 G_CALLBACK(ags_plugin_browser_response_callback),
277 NULL,
278 NULL);
279 }
280
281 void
ags_plugin_browser_set_update(AgsApplicable * applicable,gboolean update)282 ags_plugin_browser_set_update(AgsApplicable *applicable, gboolean update)
283 {
284 /* empty */
285 }
286
287 void
ags_plugin_browser_apply(AgsApplicable * applicable)288 ags_plugin_browser_apply(AgsApplicable *applicable)
289 {
290 //TODO:JK: implement me
291 }
292
293 void
ags_plugin_browser_reset(AgsApplicable * applicable)294 ags_plugin_browser_reset(AgsApplicable *applicable)
295 {
296 //TODO:JK: implement me
297 }
298
299 /**
300 * ags_plugin_browser_get_plugin_filename:
301 * @plugin_browser: the #AgsPluginBrowser
302 *
303 * Retrieve selected plugin plugin filename.
304 *
305 * Returns: the active plugin filename
306 *
307 * Since: 3.0.0
308 */
309 gchar*
ags_plugin_browser_get_plugin_filename(AgsPluginBrowser * plugin_browser)310 ags_plugin_browser_get_plugin_filename(AgsPluginBrowser *plugin_browser)
311 {
312 if(AGS_IS_LV2_BROWSER(plugin_browser->active_browser)){
313 return(ags_lv2_browser_get_plugin_filename((AgsLv2Browser *) plugin_browser->lv2_browser));
314 }else if(AGS_IS_LADSPA_BROWSER(plugin_browser->active_browser)){
315 return(ags_ladspa_browser_get_plugin_filename((AgsLadspaBrowser *) plugin_browser->ladspa_browser));
316 }else{
317 return(NULL);
318 }
319 }
320
321 /**
322 * ags_plugin_browser_get_plugin_effect:
323 * @plugin_browser: the #AgsPluginBrowser
324 *
325 * Retrieve selected plugin effect.
326 *
327 * Returns: the active plugin effect
328 *
329 * Since: 3.0.0
330 */
331 gchar*
ags_plugin_browser_get_plugin_effect(AgsPluginBrowser * plugin_browser)332 ags_plugin_browser_get_plugin_effect(AgsPluginBrowser *plugin_browser)
333 {
334 if(AGS_IS_LV2_BROWSER(plugin_browser->active_browser)){
335 return(ags_lv2_browser_get_plugin_effect((AgsLv2Browser *) plugin_browser->lv2_browser));
336 }else if(AGS_IS_LADSPA_BROWSER(plugin_browser->active_browser)){
337 return(ags_ladspa_browser_get_plugin_effect((AgsLadspaBrowser *) plugin_browser->ladspa_browser));
338 }else{
339 return(NULL);
340 }
341 }
342
343 /**
344 * ags_plugin_browser_new:
345 * @parent_window: the #AgsWindow
346 *
347 * Create a new instance of #AgsPluginBrowser
348 *
349 * Returns: the new #AgsPluginBrowser
350 *
351 * Since: 3.0.0
352 */
353 AgsPluginBrowser*
ags_plugin_browser_new(GtkWidget * parent_window)354 ags_plugin_browser_new(GtkWidget *parent_window)
355 {
356 AgsPluginBrowser *plugin_browser;
357
358 plugin_browser = (AgsPluginBrowser *) g_object_new(AGS_TYPE_PLUGIN_BROWSER,
359 NULL);
360
361 plugin_browser->parent_window = parent_window;
362
363 return(plugin_browser);
364 }
365