2
* This file is part of GNAC - Gnome Audio Converter
4
* Copyright (C) 2007 - 2012 Gnac
6
* - DUPASQUIER Benoit <bdupasqu@src.gnome.org>
7
* - JOAQUIM David <djoaquim@src.gnome.org>
8
* - ROUX Alexandre <alexroux@src.gnome.org>
10
* GNAC is free software; you can redistribute it and/or modify
11
* it under the terms of the GNU General Public License as published by
12
* the Free Software Foundation; either version 3 of the License, or
13
* (at your option) any later version.
15
* GNAC is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU General Public License for more details.
20
* You should have received a copy of the GNU General Public License
21
* along with GNAC; if not, write to the Free Software
22
* Foundation, Inc., 51 Franklin St, Fifth Floor,
23
* Boston, MA 02110-1301 USA
26
#include <glib/gstdio.h>
28
#include "../gnac-profiles-properties.h"
29
#include "gnac-profiles-wavpack.h"
34
AudioProfileGeneric *generic;
38
gdouble bits_per_sample;
39
gdouble extra_processing;
40
gchar *joint_stereo_mode;
50
BasicFormatInfo wavpack_bfi = {
51
PKGDATADIR "/profiles/gnac-profiles-wavpack.xml",
53
PKGDATADIR "/profiles/wavpack.xml",
67
gnac_profiles_wavpack_bitrate_control_on_changed(GtkComboBox *widget);
69
static AudioProfileWavpack *
70
gnac_profiles_wavpack_audio_profile_new(void);
74
gnac_profiles_wavpack_on_bitrate_control_changed(GtkComboBox *widget,
77
gnac_profiles_wavpack_bitrate_control_on_changed(widget);
78
gnac_profiles_wavpack_generate_pipeline();
83
gnac_profiles_wavpack_init(void)
88
gnac_profiles_default_init(&wavpack_bfi);
91
gnac_profiles_utils_init_widget(&wavpack_bfi, "combo-mode",
92
"//variable[@id='mode']");
95
gnac_profiles_utils_init_widget(&wavpack_bfi, "slider-bitrate",
96
"//variable[@id='bitrate']");
99
gnac_profiles_utils_init_widget(&wavpack_bfi, "slider-bits-per-sample",
100
"//variable[@id='bits-per-sample']");
103
widget = gnac_profiles_utils_init_widget(&wavpack_bfi,
104
"slider-extra-processing", "//variable[@id='extra-processing']");
105
widget2 = gnac_profiles_utils_get_widget(&wavpack_bfi,
106
"label-extra-processing"),
107
gnac_profiles_utils_add_description_tooltip(&wavpack_bfi,
108
"//variable[@id='extra-processing']/description",
109
widget, widget2, NULL);
112
gnac_profiles_utils_init_widget(&wavpack_bfi,
113
"combo-joint-stereo-mode", "//variable[@id='joint-stereo-mode']");
116
widget = gnac_profiles_utils_init_widget(&wavpack_bfi, "checkbutton-md5",
117
"//variable[@id='md5']");
118
gnac_profiles_utils_add_description_tooltip(&wavpack_bfi,
119
"//variable[@id='md5']/description", widget, NULL);
122
widget = gnac_profiles_utils_init_widget(&wavpack_bfi,
123
"combo-bitrate-control", "//variable[@id='bitrate-control']");
124
widget2 = gnac_profiles_utils_get_widget(&wavpack_bfi,
125
"checkbutton-bitrate-control");
126
gnac_profiles_wavpack_bitrate_control_on_toggle(widget,
127
GTK_TOGGLE_BUTTON(widget2));
129
gnac_profiles_xml_engine_free_doc_xpath(wavpack_bfi.doc);
130
wavpack_bfi.doc = NULL;
132
return wavpack_bfi.format_id;
137
gnac_profiles_wavpack_show_abr_widgets(gboolean show)
139
GtkWidget *abr_widgets[] = {
140
gnac_profiles_utils_get_widget(&wavpack_bfi, "label-bitrate"),
141
gnac_profiles_utils_get_widget(&wavpack_bfi, "slider-bitrate"),
142
gnac_profiles_utils_get_widget(&wavpack_bfi, "label-bits-per-sample"),
143
gnac_profiles_utils_get_widget(&wavpack_bfi, "slider-bits-per-sample"),
147
for (i = 0; i < G_N_ELEMENTS(abr_widgets); i++) {
148
if (show) gtk_widget_show_all(abr_widgets[i]);
149
else gtk_widget_hide(abr_widgets[i]);
155
gnac_profiles_wavpack_show_bps_widgets(gboolean show)
157
GtkWidget *bps_widgets[] = {
158
gnac_profiles_utils_get_widget(&wavpack_bfi, "label-bits-per-sample"),
159
gnac_profiles_utils_get_widget(&wavpack_bfi, "slider-bits-per-sample"),
163
for (i = 0; i < G_N_ELEMENTS(bps_widgets); i++) {
164
if (show) gtk_widget_show_all(bps_widgets[i]);
165
else gtk_widget_hide(bps_widgets[i]);
171
gnac_profiles_wavpack_bitrate_control_on_changed(GtkComboBox *widget)
173
GtkToggleButton *bitrate_ctrl_btn = GTK_TOGGLE_BUTTON(
174
gnac_profiles_utils_get_widget(&wavpack_bfi, "checkbutton-bitrate-control"));
175
gboolean bitrate_ctrl_enabled = gtk_toggle_button_get_active(bitrate_ctrl_btn);
176
ControlMethod control_method = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
178
gnac_profiles_wavpack_show_abr_widgets(
179
bitrate_ctrl_enabled && control_method == AVERAGE_BITRATE);
180
gnac_profiles_wavpack_show_bps_widgets(
181
bitrate_ctrl_enabled && control_method == BITS_PER_SAMPLE);
186
gnac_profiles_wavpack_generate_pipeline(void)
188
gchar *pipeline = gnac_profiles_default_generate_pipeline(&wavpack_bfi);
189
GtkWidget *widget = gnac_profiles_utils_get_widget(&wavpack_bfi,
190
"combo-bitrate-control");
192
pipeline = gnac_profiles_utils_add_properties(pipeline, &wavpack_bfi,
194
pipeline = gnac_profiles_utils_add_properties_slider(pipeline, &wavpack_bfi,
195
"%.0f", "slider-extra-processing", NULL);
196
pipeline = gnac_profiles_utils_add_properties_checked_combo(pipeline,
198
"combo-joint-stereo-mode", "checkbutton-joint-stereo-mode",
200
pipeline = gnac_profiles_utils_add_properties(pipeline, &wavpack_bfi,
201
"checkbutton-md5", NULL);
202
GtkWidget *check = gnac_profiles_utils_get_widget(&wavpack_bfi,
203
"checkbutton-bitrate-control");
205
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check))) {
206
ControlMethod control_method = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
208
if (control_method == AVERAGE_BITRATE) {
209
widget = gnac_profiles_utils_get_widget(&wavpack_bfi, "slider-bitrate");
210
pipeline = gnac_profiles_utils_add_property_slider(pipeline,
211
"%.0f", 1000, widget);
213
pipeline = gnac_profiles_utils_add_properties_slider(pipeline,
214
&wavpack_bfi, "%.0f", "slider-bits-per-sample", NULL);
218
gnac_profiles_properties_update_textbuffer(pipeline);
220
g_free(wavpack_bfi.pipeline);
222
wavpack_bfi.pipeline = pipeline;
227
gnac_profiles_wavpack_bitrate_control_on_toggle(GtkWidget *widget,
228
GtkToggleButton *togglebutton)
230
GtkWidget *label = gnac_profiles_utils_get_widget(&wavpack_bfi,
231
"label-control-method");
232
GtkWidget *hbox = gnac_profiles_utils_get_widget(&wavpack_bfi,
233
"hbox-control-method");
235
if (gtk_toggle_button_get_active(togglebutton)) {
236
gtk_widget_show(hbox);
237
gtk_widget_show(label);
239
gtk_widget_hide(hbox);
240
gtk_widget_hide(label);
243
gnac_profiles_wavpack_bitrate_control_on_changed(GTK_COMBO_BOX(widget));
244
gnac_profiles_wavpack_generate_pipeline();
249
gnac_profiles_wavpack_joint_stereo_mode_on_toggle(GtkWidget *widget,
250
GtkToggleButton *togglebutton)
252
gnac_profiles_utils_on_toggle_optionnal_property(togglebutton, widget);
253
gnac_profiles_wavpack_generate_pipeline();
258
gnac_profiles_wavpack_reset_ui(void)
260
gnac_profiles_default_reset_ui(&wavpack_bfi);
261
gnac_profiles_utils_reset_values(&wavpack_bfi,
262
"combo-mode", "combo-bitrate-control", "combo-joint-stereo-mode",
263
"checkbutton-md5", "slider-bitrate", "slider-bits-per-sample",
264
"slider-extra-processing", NULL);
265
gnac_profiles_utils_set_active_toggle_button(&wavpack_bfi, FALSE,
266
"checkbutton-bitrate-control", NULL);
271
gnac_profiles_wavpack_set_fields(gpointer data)
274
gnac_profiles_wavpack_reset_ui();
278
AudioProfileWavpack *profile = (AudioProfileWavpack *) data;
279
gnac_profiles_utils_set_values(&wavpack_bfi,
280
"combo-mode", profile->mode,
281
"slider-extra-processing", profile->extra_processing,
282
"checkbutton-md5", profile->md5, NULL);
283
gnac_profiles_utils_set_values_checked(&wavpack_bfi,
284
"combo-joint-stereo-mode", "checkbutton-joint-stereo-mode",
285
profile->joint_stereo_mode, NULL);
287
GtkWidget *widget = gnac_profiles_utils_get_widget(&wavpack_bfi,
288
"combo-bitrate-control");
289
GtkWidget *check = gnac_profiles_utils_get_widget(&wavpack_bfi,
290
"checkbutton-bitrate-control");
292
if (profile->bitrate != -1.0) {
293
gnac_profiles_utils_set_values(&wavpack_bfi,
294
"slider-bitrate", profile->bitrate, NULL);
295
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
296
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), AVERAGE_BITRATE);
297
} else if (profile->bits_per_sample != -1) {
298
gnac_profiles_utils_set_values(&wavpack_bfi,
299
"slider-bits-per-sample", profile->bits_per_sample, NULL);
300
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
301
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), BITS_PER_SAMPLE);
307
gnac_profiles_wavpack_get_combo_format_name(void)
309
return gnac_profiles_default_get_combo_format_name(&wavpack_bfi);
313
static AudioProfileWavpack *
314
gnac_profiles_wavpack_audio_profile_new(void)
316
AudioProfileWavpack *profile = g_malloc(sizeof(AudioProfileWavpack));
318
profile->mode = NULL;
319
profile->bitrate = -1;
320
profile->bits_per_sample = -1;
321
profile->extra_processing = -1;
322
profile->joint_stereo_mode = NULL;
330
gnac_profiles_wavpack_free_audio_profile(gpointer data)
334
AudioProfileWavpack *profile = (AudioProfileWavpack *) data;
335
gnac_profiles_utils_free_audio_profile_generic(profile->generic);
336
g_free(profile->mode);
337
g_free(profile->joint_stereo_mode);
338
g_free(profile->md5);
344
gnac_profiles_wavpack_generate_audio_profile(GError **error)
346
AudioProfileGeneric *generic = gnac_profiles_default_generate_audio_profile(
348
AudioProfileWavpack *profile = gnac_profiles_wavpack_audio_profile_new();
349
profile->generic = generic;
351
gnac_profiles_utils_get_values_and_set(&wavpack_bfi,
352
"combo-mode", &profile->mode,
353
"slider-extra-processing", &profile->extra_processing,
354
"checkbutton-md5", &profile->md5, NULL);
355
gnac_profiles_utils_get_values_checked_combo_and_set(&wavpack_bfi,
356
"combo-joint-stereo-mode", "checkbutton-joint-stereo-mode",
357
&profile->joint_stereo_mode, NULL);
359
GtkWidget *widget = gnac_profiles_utils_get_widget(&wavpack_bfi,
360
"combo-bitrate-control");
361
GtkWidget *check = gnac_profiles_utils_get_widget(&wavpack_bfi,
362
"checkbutton-bitrate-control");
364
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check))) {
365
ControlMethod control_method = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
367
if (control_method == AVERAGE_BITRATE) {
368
gnac_profiles_utils_get_values_and_set(&wavpack_bfi,
369
"slider-bitrate", &profile->bitrate, NULL);
371
gnac_profiles_utils_get_values_and_set(&wavpack_bfi,
372
"slider-bits-per-sample", &profile->bits_per_sample, NULL);
381
gnac_profiles_wavpack_get_widget(void)
383
return gnac_profiles_default_get_properties_alignment(&wavpack_bfi);
388
gnac_profiles_wavpack_save_profile(gpointer data)
392
gchar *bitrate = NULL;
393
gchar *bits_per_sample = NULL;
394
AudioProfileWavpack *profile = (AudioProfileWavpack *) data;
396
if (profile->bitrate != -1) {
397
bitrate = gnac_profiles_utils_gdouble_to_gchararray(profile->bitrate);
398
} else if (profile->bits_per_sample != -1) {
399
bits_per_sample = gnac_profiles_utils_gdouble_to_gchararray(
400
profile->bits_per_sample);
403
gchar *extra_processing = gnac_profiles_utils_gdouble_to_gchararray(
404
profile->extra_processing);
406
XMLDoc *doc = gnac_profiles_default_save_profile(profile->generic,
408
gnac_profiles_xml_engine_add_values(doc,
409
"mode", profile->mode,
411
"bits-per-sample", bits_per_sample,
412
"extra-processing", extra_processing,
413
"joint-stereo-mode", profile->joint_stereo_mode,
416
gnac_profiles_xml_engine_save_doc(doc, profile->generic->name);
418
gnac_profiles_xml_engine_free_doc_xpath(doc);
420
g_free(bits_per_sample);
421
g_free(extra_processing);
426
gnac_profiles_wavpack_load_specific_properties(XMLDoc *doc,
427
AudioProfileGeneric *generic)
430
gchar *bits_per_sample;
431
gchar *extra_processing;
433
AudioProfileWavpack *profile = gnac_profiles_wavpack_audio_profile_new();
434
profile->generic = generic;
435
gnac_profiles_utils_load_saved_profile(doc,
436
"/audio-profile/format-specific/",
437
"mode", &profile->mode,
439
"bits-per-sample", &bits_per_sample,
440
"extra-processing", &extra_processing,
441
"joint-stereo-mode", &profile->joint_stereo_mode,
442
"md5", &profile->md5,
445
profile->extra_processing = gnac_profiles_utils_gchararray_to_gdouble(
447
g_free(extra_processing);
450
profile->bitrate = gnac_profiles_utils_gchararray_to_gdouble(bitrate);
452
} else if (bits_per_sample) {
453
profile->bits_per_sample = gnac_profiles_utils_gchararray_to_gdouble(
455
g_free(bits_per_sample);
463
gnac_profiles_wavpack_clean_up(void)
465
gnac_profiles_default_clean_up(&wavpack_bfi);
466
gnac_profiles_utils_free_values(&wavpack_bfi,
467
"combo-bitrate-control", "combo-mode", "combo-joint-stereo-mode",
468
"checkbutton-md5", "slider-bitrate", "slider-bits-per-sample",
469
"slider-extra-processing", NULL);
470
gnac_profiles_utils_free_basic_format_info(&wavpack_bfi);
475
gnac_profiles_wavpack_get_plugin_name(void)
477
return wavpack_bfi.format_plugin_name;
482
gnac_profiles_wavpack_get_description(void)
484
return wavpack_bfi.description;
489
gnac_profiles_wavpack_get_funcs(void)
491
FormatModuleFuncs funcs = {
492
gnac_profiles_wavpack_init,
493
gnac_profiles_wavpack_get_description,
494
gnac_profiles_wavpack_generate_pipeline,
495
gnac_profiles_wavpack_generate_audio_profile,
496
gnac_profiles_wavpack_free_audio_profile,
497
gnac_profiles_wavpack_set_fields,
498
gnac_profiles_wavpack_get_widget,
499
gnac_profiles_wavpack_save_profile,
500
gnac_profiles_wavpack_load_specific_properties,
501
gnac_profiles_wavpack_clean_up,
503
gnac_profiles_wavpack_get_combo_format_name,
504
gnac_profiles_wavpack_get_plugin_name