Mercurial > audlegacy-plugins
annotate src/filewriter/filewriter.c @ 2055:2f2ffbc2d04d
gentitle changes
author | William Pitcock <nenolod@atheme.org> |
---|---|
date | Sat, 13 Oct 2007 20:43:07 -0500 |
parents | fa9f85cebade |
children | cf4fa45ffd80 |
rev | line source |
---|---|
984 | 1 /* FileWriter-Plugin |
2 * (C) copyright 2007 merging of Disk Writer and Out-Lame by Michael Färber | |
3 * | |
4 * Original Out-Lame-Plugin: | |
5 * (C) copyright 2002 Lars Siebold <khandha5@gmx.net> | |
6 * (C) copyright 2006-2007 porting to audacious by Yoshiki Yazawa <yaz@cc.rim.or.jp> | |
7 * | |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
21 */ | |
22 | |
23 #include "filewriter.h" | |
24 #include "plugins.h" | |
25 | |
1569
25ea2127eefa
filewriter: fix symbol collisions
William Pitcock <nenolod@atheme.org>
parents:
1525
diff
changeset
|
26 struct format_info input; |
25ea2127eefa
filewriter: fix symbol collisions
William Pitcock <nenolod@atheme.org>
parents:
1525
diff
changeset
|
27 |
984 | 28 static GtkWidget *configure_win = NULL, *configure_vbox; |
29 static GtkWidget *path_hbox, *path_label, *path_dirbrowser; | |
30 static GtkWidget *configure_bbox, *configure_ok, *configure_cancel; | |
31 | |
32 static GtkWidget *fileext_hbox, *fileext_label, *fileext_combo, *plugin_button; | |
1000 | 33 |
34 enum fileext_t | |
35 { | |
36 WAV = 0, | |
37 #ifdef FILEWRITER_MP3 | |
38 MP3, | |
39 #endif | |
40 #ifdef FILEWRITER_VORBIS | |
41 VORBIS, | |
42 #endif | |
43 #ifdef FILEWRITER_FLAC | |
44 FLAC, | |
45 #endif | |
46 FILEEXT_MAX | |
47 }; | |
48 | |
984 | 49 static gint fileext = WAV; |
1000 | 50 static gchar *fileext_str[] = |
51 { | |
52 "wav", | |
53 #ifdef FILEWRITER_MP3 | |
54 "mp3", | |
55 #endif | |
56 #ifdef FILEWRITER_VORBIS | |
57 "ogg", | |
58 #endif | |
59 #ifdef FILEWRITER_FLAC | |
60 "flac" | |
61 #endif | |
62 }; | |
63 | |
984 | 64 static FileWriter plugin; |
65 | |
66 static GtkWidget *saveplace_hbox, *saveplace; | |
67 static gboolean save_original = TRUE; | |
68 | |
69 static GtkWidget *filenamefrom_hbox, *filenamefrom_label, *filenamefrom_toggle; | |
70 static gboolean filenamefromtags = TRUE; | |
71 | |
72 static GtkWidget *use_suffix_toggle = NULL; | |
73 static gboolean use_suffix = FALSE; | |
74 | |
75 static GtkWidget *prependnumber_toggle; | |
76 static gboolean prependnumber = FALSE; | |
77 | |
78 static gchar *file_path = NULL; | |
79 | |
80 static void file_init(void); | |
81 static void file_about(void); | |
82 static gint file_open(AFormat fmt, gint rate, gint nch); | |
83 static void file_write(void *ptr, gint length); | |
84 static void file_close(void); | |
85 static void file_flush(gint time); | |
86 static void file_pause(short p); | |
87 static gint file_free(void); | |
88 static gint file_playing(void); | |
89 static gint file_get_written_time(void); | |
90 static gint file_get_output_time(void); | |
91 static void file_configure(void); | |
92 | |
93 OutputPlugin file_op = | |
94 { | |
1651 | 95 .description = "FileWriter Plugin", |
96 .init = file_init, | |
97 .about = file_about, | |
98 .configure = file_configure, | |
99 .open_audio = file_open, | |
100 .write_audio = file_write, | |
101 .close_audio = file_close, | |
102 .flush = file_flush, | |
103 .pause = file_pause, | |
104 .buffer_free = file_free, | |
105 .buffer_playing = file_playing, | |
106 .output_time = file_get_output_time, | |
107 .written_time = file_get_written_time | |
984 | 108 }; |
109 | |
1076 | 110 OutputPlugin *file_oplist[] = { &file_op, NULL }; |
111 | |
1651 | 112 SIMPLE_OUTPUT_PLUGIN(filewriter, file_oplist); |
984 | 113 |
114 static void set_plugin(void) | |
115 { | |
116 if (fileext < 0 || fileext >= FILEEXT_MAX) | |
117 fileext = 0; | |
118 | |
119 if (fileext == WAV) | |
120 plugin = wav_plugin; | |
1000 | 121 #ifdef FILEWRITER_MP3 |
984 | 122 if (fileext == MP3) |
123 plugin = mp3_plugin; | |
1000 | 124 #endif |
125 #ifdef FILEWRITER_VORBIS | |
986 | 126 if (fileext == VORBIS) |
127 plugin = vorbis_plugin; | |
1000 | 128 #endif |
129 #ifdef FILEWRITER_FLAC | |
991 | 130 if (fileext == FLAC) |
131 plugin = flac_plugin; | |
1000 | 132 #endif |
984 | 133 } |
134 | |
135 static void file_init(void) | |
136 { | |
137 ConfigDb *db; | |
138 | |
139 db = bmp_cfg_db_open(); | |
140 bmp_cfg_db_get_int(db, "filewriter", "fileext", &fileext); | |
141 bmp_cfg_db_get_string(db, "filewriter", "file_path", &file_path); | |
142 bmp_cfg_db_get_bool(db, "filewriter", "save_original", &save_original); | |
143 bmp_cfg_db_get_bool(db, "filewriter", "use_suffix", &use_suffix); | |
144 bmp_cfg_db_get_bool(db, "filewriter", "filenamefromtags", &filenamefromtags); | |
145 bmp_cfg_db_get_bool(db, "filewriter", "prependnumber", &prependnumber); | |
146 bmp_cfg_db_close(db); | |
147 | |
148 if (!file_path) | |
149 file_path = g_strdup(g_get_home_dir()); | |
150 | |
151 set_plugin(); | |
152 if (plugin.init) | |
153 plugin.init(); | |
154 } | |
155 | |
156 void file_about(void) | |
157 { | |
158 static GtkWidget *dialog; | |
159 | |
160 if (dialog != NULL) | |
161 return; | |
162 | |
1677
f6f5603a0954
xmms_show_message() changed to audacious_info_dialog()
Matti Hamalainen <ccr@tnsp.org>
parents:
1651
diff
changeset
|
163 dialog = audacious_info_dialog(_("About FileWriter-Plugin"), |
1298
94eee8a16189
The "i18n" saga is still going on...
Stany HENRY <StrassBoy@gmail.com>
parents:
1269
diff
changeset
|
164 _("FileWriter-Plugin\n\n" |
984 | 165 "This program is free software; you can redistribute it and/or modify\n" |
166 "it under the terms of the GNU General Public License as published by\n" | |
167 "the Free Software Foundation; either version 2 of the License, or\n" | |
168 "(at your option) any later version.\n" | |
169 "\n" | |
170 "This program is distributed in the hope that it will be useful,\n" | |
171 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" | |
172 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" | |
173 "GNU General Public License for more details.\n" | |
174 "\n" | |
175 "You should have received a copy of the GNU General Public License\n" | |
176 "along with this program; if not, write to the Free Software\n" | |
177 "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,\n" | |
1298
94eee8a16189
The "i18n" saga is still going on...
Stany HENRY <StrassBoy@gmail.com>
parents:
1269
diff
changeset
|
178 "USA."), _("Ok"), FALSE, NULL, NULL); |
984 | 179 gtk_signal_connect(GTK_OBJECT(dialog), "destroy", |
180 GTK_SIGNAL_FUNC(gtk_widget_destroyed), &dialog); | |
181 } | |
182 | |
183 static gint file_open(AFormat fmt, gint rate, gint nch) | |
184 { | |
1011
4a693f5b7054
[svn] - replace xmms_remote_*() with playlist functions.
yaz
parents:
1004
diff
changeset
|
185 gchar *filename = NULL, *temp = NULL; |
1687
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1569
diff
changeset
|
186 const gchar *directory; |
984 | 187 gint pos; |
1004
be2d04b2bd28
[svn] - move bmp_title_input_free() into file_open() to avoid memory leak.
yaz
parents:
1000
diff
changeset
|
188 gint rv; |
1011
4a693f5b7054
[svn] - replace xmms_remote_*() with playlist functions.
yaz
parents:
1004
diff
changeset
|
189 Playlist *playlist; |
984 | 190 |
191 input.format = fmt; | |
192 input.frequency = rate; | |
193 input.channels = nch; | |
194 | |
1011
4a693f5b7054
[svn] - replace xmms_remote_*() with playlist functions.
yaz
parents:
1004
diff
changeset
|
195 playlist = playlist_get_active(); |
4a693f5b7054
[svn] - replace xmms_remote_*() with playlist functions.
yaz
parents:
1004
diff
changeset
|
196 if(!playlist) |
4a693f5b7054
[svn] - replace xmms_remote_*() with playlist functions.
yaz
parents:
1004
diff
changeset
|
197 return 0; |
984 | 198 |
1011
4a693f5b7054
[svn] - replace xmms_remote_*() with playlist functions.
yaz
parents:
1004
diff
changeset
|
199 pos = playlist_get_position(playlist); |
4a693f5b7054
[svn] - replace xmms_remote_*() with playlist functions.
yaz
parents:
1004
diff
changeset
|
200 tuple = playlist_get_tuple(playlist, pos); |
4a693f5b7054
[svn] - replace xmms_remote_*() with playlist functions.
yaz
parents:
1004
diff
changeset
|
201 if(!tuple) |
4a693f5b7054
[svn] - replace xmms_remote_*() with playlist functions.
yaz
parents:
1004
diff
changeset
|
202 return 0; |
984 | 203 |
204 if (filenamefromtags) | |
205 { | |
2055 | 206 gchar *utf8 = aud_tuple_formatter_make_title_string(tuple, aud_get_gentitle_format()); |
1011
4a693f5b7054
[svn] - replace xmms_remote_*() with playlist functions.
yaz
parents:
1004
diff
changeset
|
207 |
984 | 208 g_strchomp(utf8); //chop trailing ^J --yaz |
209 | |
210 filename = g_locale_from_utf8(utf8, -1, NULL, NULL, NULL); | |
211 g_free(utf8); | |
212 while (filename != NULL && (temp = strchr(filename, '/')) != NULL) | |
213 *temp = '-'; | |
214 } | |
215 if (filename == NULL) | |
216 { | |
1976
5fa26178eaef
s/tuple_/aud_tuple_/g
William Pitcock <nenolod@atheme.org>
parents:
1712
diff
changeset
|
217 filename = g_strdup(aud_tuple_get_string(tuple, FIELD_FILE_NAME, NULL)); |
984 | 218 if (!use_suffix) |
219 if ((temp = strrchr(filename, '.')) != NULL) | |
220 *temp = '\0'; | |
221 } | |
222 if (filename == NULL) | |
223 filename = g_strdup_printf("aud-%d", pos); | |
224 | |
225 | |
226 if (prependnumber) | |
227 { | |
1976
5fa26178eaef
s/tuple_/aud_tuple_/g
William Pitcock <nenolod@atheme.org>
parents:
1712
diff
changeset
|
228 gint number = aud_tuple_get_int(tuple, FIELD_TRACK_NUMBER, NULL); |
1687
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1569
diff
changeset
|
229 if (!tuple || !number) |
984 | 230 number = pos + 1; |
231 | |
232 temp = g_strdup_printf("%.02d %s", number, filename); | |
233 g_free(filename); | |
234 filename = temp; | |
235 } | |
236 | |
237 if (save_original) | |
1976
5fa26178eaef
s/tuple_/aud_tuple_/g
William Pitcock <nenolod@atheme.org>
parents:
1712
diff
changeset
|
238 directory = aud_tuple_get_string(tuple, FIELD_FILE_PATH, NULL); |
984 | 239 else |
1687
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1569
diff
changeset
|
240 directory = file_path; |
984 | 241 |
1269
0e160bafce1c
- adapt filewriter for file:// scheme.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1113
diff
changeset
|
242 temp = g_strdup_printf("file://%s/%s.%s", |
984 | 243 directory, filename, fileext_str[fileext]); |
244 g_free(filename); | |
245 filename = temp; | |
246 | |
1978 | 247 output_file = aud_vfs_fopen(filename, "w"); |
984 | 248 g_free(filename); |
249 | |
250 if (!output_file) | |
251 return 0; | |
252 | |
1712
bf2ec8f4289b
- Fix open-is-a-macro for newer glibcs
Ralf Ertzinger <ralf@skytale.net>
parents:
1703
diff
changeset
|
253 rv = (plugin.open)(); |
1004
be2d04b2bd28
[svn] - move bmp_title_input_free() into file_open() to avoid memory leak.
yaz
parents:
1000
diff
changeset
|
254 |
be2d04b2bd28
[svn] - move bmp_title_input_free() into file_open() to avoid memory leak.
yaz
parents:
1000
diff
changeset
|
255 return rv; |
984 | 256 } |
257 | |
258 static void convert_buffer(gpointer buffer, gint length) | |
259 { | |
260 gint i; | |
261 | |
262 if (input.format == FMT_S8) | |
263 { | |
264 guint8 *ptr1 = buffer; | |
265 gint8 *ptr2 = buffer; | |
266 | |
267 for (i = 0; i < length; i++) | |
268 *(ptr1++) = *(ptr2++) ^ 128; | |
269 } | |
270 if (input.format == FMT_S16_BE) | |
271 { | |
272 gint16 *ptr = buffer; | |
273 | |
274 for (i = 0; i < length >> 1; i++, ptr++) | |
275 *ptr = GUINT16_SWAP_LE_BE(*ptr); | |
276 } | |
277 if (input.format == FMT_S16_NE) | |
278 { | |
279 gint16 *ptr = buffer; | |
280 | |
281 for (i = 0; i < length >> 1; i++, ptr++) | |
282 *ptr = GINT16_TO_LE(*ptr); | |
283 } | |
284 if (input.format == FMT_U16_BE) | |
285 { | |
286 gint16 *ptr1 = buffer; | |
287 guint16 *ptr2 = buffer; | |
288 | |
289 for (i = 0; i < length >> 1; i++, ptr2++) | |
290 *(ptr1++) = GINT16_TO_LE(GUINT16_FROM_BE(*ptr2) ^ 32768); | |
291 } | |
292 if (input.format == FMT_U16_LE) | |
293 { | |
294 gint16 *ptr1 = buffer; | |
295 guint16 *ptr2 = buffer; | |
296 | |
297 for (i = 0; i < length >> 1; i++, ptr2++) | |
298 *(ptr1++) = GINT16_TO_LE(GUINT16_FROM_LE(*ptr2) ^ 32768); | |
299 } | |
300 if (input.format == FMT_U16_NE) | |
301 { | |
302 gint16 *ptr1 = buffer; | |
303 guint16 *ptr2 = buffer; | |
304 | |
305 for (i = 0; i < length >> 1; i++, ptr2++) | |
306 *(ptr1++) = GINT16_TO_LE((*ptr2) ^ 32768); | |
307 } | |
308 } | |
309 | |
310 static void file_write(void *ptr, gint length) | |
311 { | |
312 if (input.format == FMT_S8 || input.format == FMT_S16_BE || | |
313 input.format == FMT_U16_LE || input.format == FMT_U16_BE || | |
314 input.format == FMT_U16_NE) | |
315 convert_buffer(ptr, length); | |
316 #ifdef WORDS_BIGENDIAN | |
317 if (input.format == FMT_S16_NE) | |
318 convert_buffer(ptr, length); | |
319 #endif | |
320 | |
321 plugin.write(ptr, length); | |
322 } | |
323 | |
324 static void file_close(void) | |
325 { | |
326 plugin.close(); | |
327 | |
328 if (output_file) | |
329 { | |
330 written = 0; | |
1978 | 331 aud_vfs_fclose(output_file); |
984 | 332 } |
333 output_file = NULL; | |
334 } | |
335 | |
336 static void file_flush(gint time) | |
337 { | |
338 if (time < 0) | |
339 return; | |
340 | |
341 file_close(); | |
342 file_open(input.format, input.frequency, input.channels); | |
343 | |
344 offset = time; | |
345 } | |
346 | |
347 static void file_pause(short p) | |
348 { | |
349 } | |
350 | |
351 static gint file_free(void) | |
352 { | |
353 return plugin.free(); | |
354 } | |
355 | |
356 static gint file_playing(void) | |
357 { | |
358 return plugin.playing(); | |
359 } | |
360 | |
361 static gint file_get_written_time(void) | |
362 { | |
363 return plugin.get_written_time(); | |
364 } | |
365 | |
366 static gint file_get_output_time(void) | |
367 { | |
368 return file_get_written_time(); | |
369 } | |
370 | |
371 static void configure_ok_cb(gpointer data) | |
372 { | |
373 ConfigDb *db; | |
374 | |
375 fileext = gtk_combo_box_get_active(GTK_COMBO_BOX(fileext_combo)); | |
376 | |
377 g_free(file_path); | |
378 file_path = g_strdup(gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(path_dirbrowser))); | |
379 | |
380 use_suffix = | |
381 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(use_suffix_toggle)); | |
382 | |
383 prependnumber = | |
384 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prependnumber_toggle)); | |
385 | |
386 db = bmp_cfg_db_open(); | |
387 bmp_cfg_db_set_int(db, "filewriter", "fileext", fileext); | |
388 bmp_cfg_db_set_string(db, "filewriter", "file_path", file_path); | |
389 bmp_cfg_db_set_bool(db, "filewriter", "save_original", save_original); | |
390 bmp_cfg_db_set_bool(db, "filewriter", "filenamefromtags", filenamefromtags); | |
391 bmp_cfg_db_set_bool(db, "filewriter", "use_suffix", use_suffix); | |
392 bmp_cfg_db_set_bool(db, "filewriter", "prependnumber", prependnumber); | |
393 | |
394 bmp_cfg_db_close(db); | |
395 | |
396 gtk_widget_destroy(configure_win); | |
397 if (path_dirbrowser) | |
398 gtk_widget_destroy(path_dirbrowser); | |
399 } | |
400 | |
401 static void fileext_cb(GtkWidget *combo, gpointer data) | |
402 { | |
403 fileext = gtk_combo_box_get_active(GTK_COMBO_BOX(fileext_combo)); | |
404 set_plugin(); | |
405 | |
406 gtk_widget_set_sensitive(plugin_button, plugin.configure != NULL); | |
407 } | |
408 | |
409 static void plugin_configure_cb(GtkWidget *button, gpointer data) | |
410 { | |
411 if (plugin.configure) | |
412 plugin.configure(); | |
413 } | |
414 | |
415 | |
416 static void saveplace_original_cb(GtkWidget *button, gpointer data) | |
417 { | |
418 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) | |
419 { | |
420 gtk_widget_set_sensitive(path_hbox, FALSE); | |
421 save_original = TRUE; | |
422 } | |
423 } | |
424 | |
425 static void saveplace_custom_cb(GtkWidget *button, gpointer data) | |
426 { | |
427 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) | |
428 { | |
429 gtk_widget_set_sensitive(path_hbox, TRUE); | |
430 save_original = FALSE; | |
431 } | |
432 } | |
433 | |
434 static void filenamefromtags_cb(GtkWidget *button, gpointer data) | |
435 { | |
436 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) | |
437 { | |
438 gtk_widget_set_sensitive(use_suffix_toggle, FALSE); | |
439 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(use_suffix_toggle), FALSE); | |
440 use_suffix = FALSE; | |
441 filenamefromtags = TRUE; | |
442 } | |
443 } | |
444 | |
445 static void filenamefromfilename_cb(GtkWidget *button, gpointer data) | |
446 { | |
447 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) | |
448 { | |
449 gtk_widget_set_sensitive(use_suffix_toggle, TRUE); | |
450 filenamefromtags = FALSE; | |
451 } | |
452 } | |
453 | |
454 | |
455 static void configure_destroy(void) | |
456 { | |
457 if (path_dirbrowser) | |
458 gtk_widget_destroy(path_dirbrowser); | |
459 } | |
460 | |
461 static void file_configure(void) | |
462 { | |
463 GtkTooltips *use_suffix_tooltips; | |
464 | |
465 if (!configure_win) | |
466 { | |
467 configure_win = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
468 | |
469 gtk_signal_connect(GTK_OBJECT(configure_win), "destroy", | |
470 GTK_SIGNAL_FUNC(configure_destroy), NULL); | |
471 gtk_signal_connect(GTK_OBJECT(configure_win), "destroy", | |
472 GTK_SIGNAL_FUNC(gtk_widget_destroyed), | |
473 &configure_win); | |
474 | |
475 gtk_window_set_title(GTK_WINDOW(configure_win), | |
985 | 476 _("File Writer Configuration")); |
984 | 477 gtk_window_set_position(GTK_WINDOW(configure_win), GTK_WIN_POS_MOUSE); |
478 | |
479 gtk_container_set_border_width(GTK_CONTAINER(configure_win), 10); | |
480 | |
481 configure_vbox = gtk_vbox_new(FALSE, 10); | |
482 gtk_container_add(GTK_CONTAINER(configure_win), configure_vbox); | |
483 | |
484 | |
485 fileext_hbox = gtk_hbox_new(FALSE, 5); | |
486 gtk_box_pack_start(GTK_BOX(configure_vbox), fileext_hbox, FALSE, FALSE, 0); | |
487 | |
986 | 488 fileext_label = gtk_label_new(_("Output file format:")); |
984 | 489 gtk_box_pack_start(GTK_BOX(fileext_hbox), fileext_label, FALSE, FALSE, 0); |
490 | |
491 fileext_combo = gtk_combo_box_new_text(); | |
492 gtk_combo_box_append_text(GTK_COMBO_BOX(fileext_combo), "WAV"); | |
1000 | 493 #ifdef FILEWRITER_MP3 |
984 | 494 gtk_combo_box_append_text(GTK_COMBO_BOX(fileext_combo), "MP3"); |
1000 | 495 #endif |
496 #ifdef FILEWRITER_VORBIS | |
986 | 497 gtk_combo_box_append_text(GTK_COMBO_BOX(fileext_combo), "Vorbis"); |
1000 | 498 #endif |
499 #ifdef FILEWRITER_FLAC | |
991 | 500 gtk_combo_box_append_text(GTK_COMBO_BOX(fileext_combo), "FLAC"); |
1000 | 501 #endif |
984 | 502 gtk_box_pack_start(GTK_BOX(fileext_hbox), fileext_combo, FALSE, FALSE, 0); |
503 gtk_combo_box_set_active(GTK_COMBO_BOX(fileext_combo), fileext); | |
504 g_signal_connect(G_OBJECT(fileext_combo), "changed", G_CALLBACK(fileext_cb), NULL); | |
505 | |
506 plugin_button = gtk_button_new_with_label(_("Configure")); | |
507 gtk_widget_set_sensitive(plugin_button, plugin.configure != NULL); | |
508 g_signal_connect(G_OBJECT(plugin_button), "clicked", G_CALLBACK(plugin_configure_cb), NULL); | |
509 gtk_box_pack_end(GTK_BOX(fileext_hbox), plugin_button, FALSE, FALSE, 0); | |
510 | |
511 | |
512 | |
513 | |
514 gtk_box_pack_start(GTK_BOX(configure_vbox), gtk_hseparator_new(), FALSE, FALSE, 0); | |
515 | |
516 | |
517 | |
518 saveplace_hbox = gtk_hbox_new(FALSE, 5); | |
519 gtk_container_add(GTK_CONTAINER(configure_vbox), saveplace_hbox); | |
520 | |
521 saveplace = gtk_radio_button_new_with_label(NULL, _("Save into original directory")); | |
522 g_signal_connect(G_OBJECT(saveplace), "toggled", G_CALLBACK(saveplace_original_cb), NULL); | |
523 gtk_box_pack_start(GTK_BOX(saveplace_hbox), saveplace, FALSE, FALSE, 0); | |
524 | |
525 saveplace = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(saveplace), | |
526 _("Save into custom directory")); | |
527 g_signal_connect(G_OBJECT(saveplace), "toggled", G_CALLBACK(saveplace_custom_cb), NULL); | |
528 gtk_box_pack_start(GTK_BOX(saveplace_hbox), saveplace, FALSE, FALSE, 0); | |
529 | |
530 if (!save_original) | |
531 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(saveplace), TRUE); | |
532 | |
533 | |
534 | |
535 path_hbox = gtk_hbox_new(FALSE, 5); | |
536 gtk_box_pack_start(GTK_BOX(configure_vbox), path_hbox, FALSE, FALSE, 0); | |
537 | |
538 path_label = gtk_label_new(_("Output file folder:")); | |
539 gtk_box_pack_start(GTK_BOX(path_hbox), path_label, FALSE, FALSE, 0); | |
540 | |
541 path_dirbrowser = | |
1298
94eee8a16189
The "i18n" saga is still going on...
Stany HENRY <StrassBoy@gmail.com>
parents:
1269
diff
changeset
|
542 gtk_file_chooser_button_new (_("Pick a folder"), |
984 | 543 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); |
544 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(path_dirbrowser), | |
545 file_path); | |
546 gtk_box_pack_start(GTK_BOX(path_hbox), path_dirbrowser, TRUE, TRUE, 0); | |
547 | |
548 if (save_original) | |
549 gtk_widget_set_sensitive(path_hbox, FALSE); | |
550 | |
551 | |
552 | |
553 | |
554 gtk_box_pack_start(GTK_BOX(configure_vbox), gtk_hseparator_new(), FALSE, FALSE, 0); | |
555 | |
556 | |
557 | |
558 | |
559 filenamefrom_hbox = gtk_hbox_new(FALSE, 5); | |
560 gtk_container_add(GTK_CONTAINER(configure_vbox), filenamefrom_hbox); | |
561 | |
562 filenamefrom_label = gtk_label_new(_("Get filename from:")); | |
563 gtk_box_pack_start(GTK_BOX(filenamefrom_hbox), filenamefrom_label, FALSE, FALSE, 0); | |
564 | |
565 filenamefrom_toggle = gtk_radio_button_new_with_label(NULL, _("original file tags")); | |
566 g_signal_connect(G_OBJECT(filenamefrom_toggle), "toggled", G_CALLBACK(filenamefromtags_cb), NULL); | |
567 gtk_box_pack_start(GTK_BOX(filenamefrom_hbox), filenamefrom_toggle, FALSE, FALSE, 0); | |
568 | |
569 filenamefrom_toggle = | |
570 gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(filenamefrom_toggle), | |
571 _("original filename")); | |
572 g_signal_connect(G_OBJECT(filenamefrom_toggle), "toggled", G_CALLBACK(filenamefromfilename_cb), NULL); | |
573 gtk_box_pack_start(GTK_BOX(filenamefrom_hbox), filenamefrom_toggle, FALSE, FALSE, 0); | |
574 | |
575 if (!filenamefromtags) | |
576 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(filenamefrom_toggle), TRUE); | |
577 | |
578 | |
579 | |
580 | |
581 use_suffix_toggle = gtk_check_button_new_with_label(_("Don't strip file name extension")); | |
582 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(use_suffix_toggle), use_suffix); | |
583 gtk_box_pack_start(GTK_BOX(configure_vbox), use_suffix_toggle, FALSE, FALSE, 0); | |
584 use_suffix_tooltips = gtk_tooltips_new(); | |
1525
bee9eaedefa5
- made the MP3 FileWriter output plugin less braindead
mf0102 <0102@gmx.at>
parents:
1510
diff
changeset
|
585 gtk_tooltips_set_tip(use_suffix_tooltips, use_suffix_toggle, _("If enabled, the extension from the original filename will not be stripped before adding the new file extension to the end."), NULL); |
984 | 586 gtk_tooltips_enable(use_suffix_tooltips); |
587 | |
588 if (filenamefromtags) | |
589 gtk_widget_set_sensitive(use_suffix_toggle, FALSE); | |
590 | |
591 | |
592 | |
593 | |
594 gtk_box_pack_start(GTK_BOX(configure_vbox), gtk_hseparator_new(), FALSE, FALSE, 0); | |
595 | |
596 | |
597 | |
598 | |
599 prependnumber_toggle = gtk_check_button_new_with_label(_("Prepend track number to filename")); | |
600 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prependnumber_toggle), prependnumber); | |
601 gtk_box_pack_start(GTK_BOX(configure_vbox), prependnumber_toggle, FALSE, FALSE, 0); | |
602 | |
603 | |
604 | |
605 configure_bbox = gtk_hbutton_box_new(); | |
606 gtk_button_box_set_layout(GTK_BUTTON_BOX(configure_bbox), | |
607 GTK_BUTTONBOX_END); | |
608 gtk_button_box_set_spacing(GTK_BUTTON_BOX(configure_bbox), 5); | |
609 gtk_box_pack_start(GTK_BOX(configure_vbox), configure_bbox, | |
610 FALSE, FALSE, 0); | |
611 | |
612 configure_cancel = gtk_button_new_from_stock(GTK_STOCK_CANCEL); | |
613 gtk_signal_connect_object(GTK_OBJECT(configure_cancel), "clicked", | |
614 GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
615 GTK_OBJECT(configure_win)); | |
616 gtk_box_pack_start(GTK_BOX(configure_bbox), configure_cancel, | |
617 TRUE, TRUE, 0); | |
618 | |
619 configure_ok = gtk_button_new_from_stock(GTK_STOCK_OK); | |
620 gtk_signal_connect(GTK_OBJECT(configure_ok), "clicked", | |
621 GTK_SIGNAL_FUNC(configure_ok_cb), NULL); | |
622 gtk_box_pack_start(GTK_BOX(configure_bbox), configure_ok, | |
623 TRUE, TRUE, 0); | |
624 | |
625 gtk_widget_show_all(configure_win); | |
626 } | |
627 } | |
628 | |
629 VFSFile *output_file = NULL; | |
630 guint64 written = 0; | |
631 guint64 offset = 0; | |
1441
1b52e7eacd4c
filewriter: new tuple API
William Pitcock <nenolod@atheme-project.org>
parents:
1395
diff
changeset
|
632 Tuple *tuple = NULL; |