comparison src/Input/vorbis/fileinfo.c @ 0:13389e613d67 trunk

[svn] - initial import of audacious-plugins tree (lots to do)
author nenolod
date Mon, 18 Sep 2006 01:11:49 -0700
parents
children 0ad4849f6219
comparison
equal deleted inserted replaced
-1:000000000000 0:13389e613d67
1 /* BMP - Cross-platform multimedia player
2 * Copyright (C) 2003-2004 BMP development team.
3 *
4 * Based on XMMS:
5 * Copyright (C) 1998-2003 XMMS development team.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 * 02110-1301, USA.
21 *
22 */
23
24 #ifdef HAVE_CONFIG_H
25 # include "config.h"
26 #endif
27
28 #include <glib.h>
29 #include <glib/gi18n.h>
30 #include <gtk/gtk.h>
31 #include <ogg/ogg.h>
32 #include <vorbis/codec.h>
33 #include <vorbis/vorbisfile.h>
34
35 #include <math.h>
36 #include <stdlib.h>
37 #include <string.h>
38
39 #include <unistd.h>
40
41 #include "audacious/util.h"
42 #include <libaudacious/util.h>
43 #include <libaudacious/vfs.h>
44
45 #include "vorbis.h"
46 #include "vcedit.h"
47
48 #include "ogg.xpm"
49
50 static struct vte_struct {
51 VFSFile *in;
52 gchar *filename;
53 } vte;
54
55 static void fail(const gchar * error);
56 static void save_cb(GtkWidget * w, gpointer data);
57 static void remove_cb(GtkWidget * w, gpointer data);
58 static gint init_files(vcedit_state * state);
59 static gint close_files(vcedit_state * state);
60
61 extern GMutex *vf_mutex;
62 static GtkWidget *window = NULL;
63 static GList *genre_list = NULL;
64
65 static GtkWidget *title_entry, *album_entry, *performer_entry;
66 static GtkWidget *tracknumber_entry, *date_entry;
67 static GtkWidget *genre_combo, *user_comment_entry;
68 #ifdef ALL_VORBIS_TAGS
69 static GtkWidget *description_entry, *version_entry, *isrc_entry;
70 static GtkWidget *copyright_entry, *organization_entry, *location_entry;
71 #endif
72 static GtkWidget *rg_track_entry, *rg_album_entry, *rg_track_peak_entry,
73 *rg_album_peak_entry;
74 static GtkWidget *rg_track_label, *rg_album_label, *rg_track_peak_label,
75 *rg_album_peak_label;
76 static GtkWidget *rg_show_button;
77
78 GtkWidget *save_button, *remove_button;
79 GtkWidget *rg_frame, *rg_table;
80
81 /* From mpg123.c, as no standardized Ogg Vorbis genres exists. */
82 static const gchar *vorbis_genres[] = {
83 N_("Blues"), N_("Classic Rock"), N_("Country"), N_("Dance"),
84 N_("Disco"), N_("Funk"), N_("Grunge"), N_("Hip-Hop"),
85 N_("Jazz"), N_("Metal"), N_("New Age"), N_("Oldies"),
86 N_("Other"), N_("Pop"), N_("R&B"), N_("Rap"), N_("Reggae"),
87 N_("Rock"), N_("Techno"), N_("Industrial"), N_("Alternative"),
88 N_("Ska"), N_("Death Metal"), N_("Pranks"), N_("Soundtrack"),
89 N_("Euro-Techno"), N_("Ambient"), N_("Trip-Hop"), N_("Vocal"),
90 N_("Jazz+Funk"), N_("Fusion"), N_("Trance"), N_("Classical"),
91 N_("Instrumental"), N_("Acid"), N_("House"), N_("Game"),
92 N_("Sound Clip"), N_("Gospel"), N_("Noise"), N_("AlternRock"),
93 N_("Bass"), N_("Soul"), N_("Punk"), N_("Space"),
94 N_("Meditative"), N_("Instrumental Pop"),
95 N_("Instrumental Rock"), N_("Ethnic"), N_("Gothic"),
96 N_("Darkwave"), N_("Techno-Industrial"), N_("Electronic"),
97 N_("Pop-Folk"), N_("Eurodance"), N_("Dream"),
98 N_("Southern Rock"), N_("Comedy"), N_("Cult"),
99 N_("Gangsta Rap"), N_("Top 40"), N_("Christian Rap"),
100 N_("Pop/Funk"), N_("Jungle"), N_("Native American"),
101 N_("Cabaret"), N_("New Wave"), N_("Psychedelic"), N_("Rave"),
102 N_("Showtunes"), N_("Trailer"), N_("Lo-Fi"), N_("Tribal"),
103 N_("Acid Punk"), N_("Acid Jazz"), N_("Polka"), N_("Retro"),
104 N_("Musical"), N_("Rock & Roll"), N_("Hard Rock"), N_("Folk"),
105 N_("Folk/Rock"), N_("National Folk"), N_("Swing"),
106 N_("Fast-Fusion"), N_("Bebob"), N_("Latin"), N_("Revival"),
107 N_("Celtic"), N_("Bluegrass"), N_("Avantgarde"),
108 N_("Gothic Rock"), N_("Progressive Rock"),
109 N_("Psychedelic Rock"), N_("Symphonic Rock"), N_("Slow Rock"),
110 N_("Big Band"), N_("Chorus"), N_("Easy Listening"),
111 N_("Acoustic"), N_("Humour"), N_("Speech"), N_("Chanson"),
112 N_("Opera"), N_("Chamber Music"), N_("Sonata"), N_("Symphony"),
113 N_("Booty Bass"), N_("Primus"), N_("Porn Groove"),
114 N_("Satire"), N_("Slow Jam"), N_("Club"), N_("Tango"),
115 N_("Samba"), N_("Folklore"), N_("Ballad"), N_("Power Ballad"),
116 N_("Rhythmic Soul"), N_("Freestyle"), N_("Duet"),
117 N_("Punk Rock"), N_("Drum Solo"), N_("A Cappella"),
118 N_("Euro-House"), N_("Dance Hall"), N_("Goa"),
119 N_("Drum & Bass"), N_("Club-House"), N_("Hardcore"),
120 N_("Terror"), N_("Indie"), N_("BritPop"), N_("Negerpunk"),
121 N_("Polsk Punk"), N_("Beat"), N_("Christian Gangsta Rap"),
122 N_("Heavy Metal"), N_("Black Metal"), N_("Crossover"),
123 N_("Contemporary Christian"), N_("Christian Rock"),
124 N_("Merengue"), N_("Salsa"), N_("Thrash Metal"),
125 N_("Anime"), N_("JPop"), N_("Synthpop")
126 };
127
128 static const gchar *
129 get_comment(vorbis_comment * vc, const gchar * tag)
130 {
131 const gchar *value;
132
133 g_return_val_if_fail(tag != NULL, "");
134
135 if (!vc)
136 return "";
137
138 if ((value = vorbis_comment_query(vc, (gchar *) tag, 0)))
139 return value;
140 else
141 return "";
142 }
143
144 static gboolean
145 str_equal_nocase(gconstpointer a,
146 gconstpointer b)
147 {
148 return strcasecmp((const gchar *) a, (const gchar *) b) == 0;
149 }
150
151 static GHashTable *
152 hash_table_from_vorbis_comment(vorbis_comment * vc)
153 {
154 GHashTable *table;
155 gint i;
156
157 table = g_hash_table_new_full(g_str_hash, str_equal_nocase,
158 g_free, g_free);
159
160 for (i = 0; i < vc->comments; i++) {
161 gchar **frags;
162 #ifdef DEBUG
163 g_message(vc->user_comments[i]);
164 #endif
165 frags = g_strsplit(vc->user_comments[i], "=", 2);
166
167 /* FIXME: need more rigorous checks to guard against
168 borqued comments */
169
170 /* No RHS? */
171 if (!frags[1]) frags[1] = g_strdup("");
172
173 g_hash_table_replace(table, frags[0], frags[1]);
174 g_free(frags);
175 }
176
177 return table;
178 }
179
180 static void
181 comment_hash_add_tag(GHashTable * table,
182 const gchar * tag,
183 const gchar * value)
184 {
185 g_hash_table_replace(table, g_strdup(tag), g_strdup(value));
186 }
187
188
189 static void
190 vorbis_comment_add_swapped(gchar * key,
191 gchar * value,
192 vorbis_comment * vc)
193 {
194 vorbis_comment_add_tag(vc, key, value);
195 }
196
197 static void
198 hash_table_to_vorbis_comment(vorbis_comment * vc, GHashTable * table)
199 {
200 vorbis_comment_clear(vc);
201 g_hash_table_foreach(table, (GHFunc) vorbis_comment_add_swapped,
202 vc);
203 }
204
205
206 static void
207 fail(const gchar * error)
208 {
209 gchar *errorstring;
210 errorstring = g_strdup_printf(_("An error occured:\n%s"), error);
211
212 xmms_show_message(_("Error!"), errorstring, _("Ok"), FALSE, NULL, NULL);
213
214 g_free(errorstring);
215 return;
216 }
217
218
219 static void
220 save_cb(GtkWidget * w, gpointer data)
221 {
222 const gchar *track_name, *performer, *album_name, *date, *track_number;
223 const gchar *genre, *user_comment;
224 #ifdef ALL_VORBIS_TAGS
225 const gchar *description, *version, *isrc, *copyright, *organization;
226 const gchar *location;
227 #endif
228 const gchar *rg_track_gain, *rg_album_gain, *rg_track_peak, *rg_album_peak;
229
230 GHashTable *comment_hash;
231
232 vcedit_state *state;
233 vorbis_comment *comment;
234
235 if (!g_strncasecmp(vte.filename, "http://", 7))
236 return;
237
238 state = vcedit_new_state();
239
240 g_mutex_lock(vf_mutex);
241 if (init_files(state) < 0) {
242 fail(_("Failed to modify tag (open)"));
243 goto close;
244 }
245
246 comment = vcedit_comments(state);
247 comment_hash = hash_table_from_vorbis_comment(comment);
248
249 track_name = gtk_entry_get_text(GTK_ENTRY(title_entry));
250 performer = gtk_entry_get_text(GTK_ENTRY(performer_entry));
251 album_name = gtk_entry_get_text(GTK_ENTRY(album_entry));
252 track_number = gtk_entry_get_text(GTK_ENTRY(tracknumber_entry));
253 genre = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(genre_combo)->entry));
254 date = gtk_entry_get_text(GTK_ENTRY(date_entry));
255 user_comment = gtk_entry_get_text(GTK_ENTRY(user_comment_entry));
256 #ifdef ALL_VORBIS_TAGS
257 location = gtk_entry_get_text(GTK_ENTRY(location_entry));
258 description = gtk_entry_get_text(GTK_ENTRY(description_entry));
259 version = gtk_entry_get_text(GTK_ENTRY(version_entry));
260 isrc = gtk_entry_get_text(GTK_ENTRY(isrc_entry));
261 organization = gtk_entry_get_text(GTK_ENTRY(organization_entry));
262 copyright = gtk_entry_get_text(GTK_ENTRY(copyright_entry));
263 #endif
264 rg_track_gain = gtk_entry_get_text(GTK_ENTRY(rg_track_entry));
265 rg_album_gain = gtk_entry_get_text(GTK_ENTRY(rg_album_entry));
266 rg_track_peak = gtk_entry_get_text(GTK_ENTRY(rg_track_peak_entry));
267 rg_album_peak = gtk_entry_get_text(GTK_ENTRY(rg_album_peak_entry));
268
269 comment_hash_add_tag(comment_hash, "title", track_name);
270 comment_hash_add_tag(comment_hash, "artist", performer);
271 comment_hash_add_tag(comment_hash, "album", album_name);
272 comment_hash_add_tag(comment_hash, "tracknumber", track_number);
273 comment_hash_add_tag(comment_hash, "genre", genre);
274 comment_hash_add_tag(comment_hash, "date", date);
275 comment_hash_add_tag(comment_hash, "comment", user_comment);
276
277 #ifdef ALL_VORBIS_TAGS
278 comment_hash_add_tag(comment_hash, "location", location);
279 comment_hash_add_tag(comment_hash, "description", description);
280 comment_hash_add_tag(comment_hash, "version", version);
281 comment_hash_add_tag(comment_hash, "isrc", isrc);
282 comment_hash_add_tag(comment_hash, "organization", organization);
283 comment_hash_add_tag(comment_hash, "copyright", copyright);
284 #endif
285
286 comment_hash_add_tag(comment_hash, "replaygain_track_gain", rg_track_gain);
287 comment_hash_add_tag(comment_hash, "replaygain_album_gain", rg_album_gain);
288 comment_hash_add_tag(comment_hash, "replaygain_track_peak", rg_track_peak);
289 comment_hash_add_tag(comment_hash, "replaygain_album_peak", rg_album_peak);
290
291 hash_table_to_vorbis_comment(comment, comment_hash);
292 g_hash_table_destroy(comment_hash);
293
294 if (close_files(state) < 0)
295 fail(_("Failed to modify tag (close)"));
296 else {
297 gtk_widget_set_sensitive(save_button, FALSE);
298 gtk_widget_set_sensitive(remove_button, TRUE);
299 }
300
301
302 close:
303 vcedit_clear(state);
304 g_mutex_unlock(vf_mutex);
305 }
306
307 static void
308 remove_cb(GtkWidget * w, gpointer data)
309 {
310 vcedit_state *state;
311 vorbis_comment *comment;
312
313 if (!g_strncasecmp(vte.filename, "http://", 7))
314 return;
315
316 state = vcedit_new_state();
317
318 g_mutex_lock(vf_mutex);
319 if (init_files(state) < 0) {
320 fail(_("Failed to modify tag"));
321 goto close;
322 }
323
324 comment = vcedit_comments(state);
325
326 vorbis_comment_clear(comment);
327
328 if (close_files(state) < 0) {
329 fail(_("Failed to modify tag"));
330 }
331 else {
332 gtk_entry_set_text(GTK_ENTRY(title_entry), "");
333 gtk_entry_set_text(GTK_ENTRY(album_entry), "");
334 gtk_entry_set_text(GTK_ENTRY(performer_entry), "");
335 gtk_entry_set_text(GTK_ENTRY(tracknumber_entry), "");
336 gtk_entry_set_text(GTK_ENTRY(date_entry), "");
337 gtk_entry_set_text(GTK_ENTRY(genre_combo), "");
338 gtk_entry_set_text(GTK_ENTRY(user_comment_entry), "");
339 }
340
341 close:
342 vcedit_clear(state);
343 g_mutex_unlock(vf_mutex);
344 /* gtk_widget_destroy(window); */
345 }
346
347 static void
348 rg_show_cb(GtkWidget * w, gpointer data)
349 {
350 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rg_show_button))) {
351 gtk_widget_show(rg_frame);
352 }
353 else {
354 gtk_widget_hide(rg_frame);
355 }
356 }
357
358 static gint
359 init_files(vcedit_state * state)
360 {
361 if ((vte.in = vfs_fopen(vte.filename, "rb")) == NULL) {
362 #ifdef DEBUG
363 g_message("fileinfo.c: couldn't open file %s", vte.filename);
364 #endif
365 return -1;
366 }
367
368 if (vcedit_open(state, vte.in) < 0) {
369 #ifdef DEBUG
370 g_message("fileinfo.c: couldn't open file for editing %s",
371 vte.filename);
372 #endif
373 vfs_fclose(vte.in);
374 return -1;
375 }
376
377 #ifdef DEBUG
378 g_message("fileinfo.c: file successfully opened for editing %s",
379 vte.filename);
380 #endif
381
382 return 0;
383 }
384
385 static gint
386 close_files(vcedit_state * state)
387 {
388 gint retval = 0, ofh;
389 gchar *tmpfn;
390 VFSFile *out;
391
392 tmpfn = g_strdup_printf("%s.XXXXXX", vte.filename);
393
394 if ((ofh = mkstemp(tmpfn)) < 0) {
395 g_free(tmpfn);
396 vfs_fclose(vte.in);
397 #ifdef DEBUG
398 g_critical("fileinfo.c: couldn't create temp file");
399 #endif
400 return -1;
401 }
402 else {
403 #ifdef DEBUG
404 g_message("fileinfo.c: created temp file %s", tmpfn);
405 #endif
406 }
407
408 if ((out = vfs_fopen(tmpfn, "wb")) == NULL) {
409 close(ofh);
410 remove(tmpfn);
411 g_free(tmpfn);
412 vfs_fclose(vte.in);
413 #ifdef DEBUG
414 g_critical("fileinfo.c: couldn't open temp file");
415 #endif
416 return -1;
417 }
418 else {
419 #ifdef DEBUG
420 g_message("fileinfo.c: opened temp file %s", tmpfn);
421 #endif
422 }
423
424 if (vcedit_write(state, out) < 0) {
425 #ifdef DEBUG
426 g_warning("vcedit_write: %s", state->lasterror);
427 #endif
428 retval = -1;
429 }
430
431 vfs_fclose(vte.in);
432
433 if (vfs_fclose(out) != 0) {
434 #ifdef DEBUG
435 g_critical("fileinfo.c: couldn't close out file");
436 #endif
437 retval = -1;
438 }
439 else {
440 #ifdef DEBUG
441 g_message("fileinfo.c: outfile closed");
442 #endif
443 }
444
445 if (retval < 0 || rename(tmpfn, vte.filename) < 0) {
446 remove(tmpfn);
447 retval = -1;
448 #ifdef DEBUG
449 g_critical("fileinfo.c: couldn't rename file");
450 #endif
451 }
452 else {
453 #ifdef DEBUG
454 g_message("fileinfo.c: file %s renamed successfully to %s", tmpfn,
455 vte.filename);
456 #endif
457 }
458
459 g_free(tmpfn);
460 return retval;
461 }
462
463
464 static void
465 label_set_text(GtkLabel * label, const gchar * format, ...)
466 {
467 va_list args;
468 gchar *text;
469
470 va_start(args, format);
471 text = g_strdup_vprintf(format, args);
472 va_end(args);
473
474 gtk_label_set_text(label, text);
475 g_free(text);
476 }
477
478 void
479 change_buttons(void)
480 {
481 gtk_widget_set_sensitive(GTK_WIDGET(save_button), TRUE);
482 }
483
484
485 /***********************************************************************/
486
487 void
488 vorbis_file_info_box(gchar * filename)
489 {
490 gchar *filename_utf8, *title;
491 const gchar *rg_track_gain, *rg_track_peak;
492 const gchar *rg_album_gain, *rg_album_peak;
493
494 gint time, minutes, seconds, bitrate, rate, channels, filesize;
495 gsize i;
496
497 OggVorbis_File vf;
498 vorbis_info *vi;
499 vorbis_comment *comment = NULL;
500
501 VFSFile *fh;
502
503 gboolean clear_vf = FALSE;
504
505 GtkWidget *pixmapwid;
506 GdkPixbuf *pixbuf;
507 PangoAttrList *attrs;
508 PangoAttribute *attr;
509
510 GtkWidget *boxx;
511 GtkWidget *img;
512 GtkWidget *test_table;
513
514 static GtkWidget *info_frame, *info_box, *bitrate_label, *rate_label;
515 static GtkWidget *bitrate_label_val, *rate_label_val;
516
517 static GtkWidget *channel_label, *length_label, *filesize_label;
518 static GtkWidget *channel_label_val, *length_label_val,
519 *filesize_label_val;
520
521 static GtkWidget *filename_entry, *tag_frame;
522
523 g_free(vte.filename);
524 vte.filename = g_strdup(filename);
525
526 if (!window) {
527 GtkWidget *hbox, *label, *filename_hbox, *vbox, *left_vbox;
528 GtkWidget *table, *bbox, *cancel_button;
529
530 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
531 gtk_window_set_type_hint(GTK_WINDOW(window),
532 GDK_WINDOW_TYPE_HINT_DIALOG);
533 gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
534 g_signal_connect(G_OBJECT(window), "destroy",
535 G_CALLBACK(gtk_widget_destroyed), &window);
536 gtk_container_set_border_width(GTK_CONTAINER(window), 10);
537
538 vbox = gtk_vbox_new(FALSE, 10);
539 gtk_container_add(GTK_CONTAINER(window), vbox);
540
541 filename_hbox = gtk_hbox_new(FALSE, 5);
542 gtk_box_pack_start(GTK_BOX(vbox), filename_hbox, FALSE, TRUE, 0);
543
544 pixbuf = gdk_pixbuf_new_from_xpm_data((const gchar **)
545 gnome_mime_audio_ogg_xpm);
546 pixmapwid = gtk_image_new_from_pixbuf(pixbuf);
547 gtk_misc_set_alignment(GTK_MISC(pixmapwid), 0, 0);
548 gtk_box_pack_start(GTK_BOX(filename_hbox), pixmapwid, FALSE, FALSE,
549 0);
550
551 attrs = pango_attr_list_new();
552
553 attr = pango_attr_weight_new(PANGO_WEIGHT_BOLD);
554 attr->start_index = 0;
555 attr->end_index = -1;
556 pango_attr_list_insert(attrs, attr);
557
558 label = gtk_label_new(_("Name:"));
559 gtk_label_set_attributes(GTK_LABEL(label), attrs);
560 gtk_box_pack_start(GTK_BOX(filename_hbox), label, FALSE, FALSE, 0);
561
562 filename_entry = gtk_entry_new();
563 gtk_editable_set_editable(GTK_EDITABLE(filename_entry), FALSE);
564 gtk_box_pack_start(GTK_BOX(filename_hbox), filename_entry, TRUE,
565 TRUE, 0);
566
567 hbox = gtk_hbox_new(FALSE, 10);
568 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
569
570 left_vbox = gtk_table_new(4, 7, FALSE);
571 gtk_box_pack_start(GTK_BOX(hbox), left_vbox, FALSE, FALSE, 0);
572
573 tag_frame = gtk_frame_new(_(" Ogg Vorbis Tag "));
574 gtk_table_attach(GTK_TABLE(left_vbox), tag_frame, 2, 4, 0, 1,
575 GTK_FILL, GTK_FILL, 0, 4);
576
577 table = gtk_table_new(16, 6, FALSE);
578 gtk_container_set_border_width(GTK_CONTAINER(table), 5);
579 gtk_container_add(GTK_CONTAINER(tag_frame), table);
580
581 label = gtk_label_new(_("Title:"));
582 gtk_label_set_attributes(GTK_LABEL(label), attrs);
583 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
584 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
585 GTK_FILL, GTK_FILL, 5, 5);
586
587 title_entry = gtk_entry_new();
588 gtk_table_attach(GTK_TABLE(table), title_entry, 1, 4, 0, 1,
589 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
590 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
591
592 label = gtk_label_new(_("Artist:"));
593 gtk_label_set_attributes(GTK_LABEL(label), attrs);
594 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
595 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
596 GTK_FILL, GTK_FILL, 5, 5);
597
598 performer_entry = gtk_entry_new();
599 gtk_table_attach(GTK_TABLE(table), performer_entry, 1, 4, 1, 2,
600 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
601 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
602
603 label = gtk_label_new(_("Album:"));
604 gtk_label_set_attributes(GTK_LABEL(label), attrs);
605 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
606 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3,
607 GTK_FILL, GTK_FILL, 5, 5);
608
609 album_entry = gtk_entry_new();
610 gtk_table_attach(GTK_TABLE(table), album_entry, 1, 4, 2, 3,
611 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
612 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
613
614 label = gtk_label_new(_("Comment:"));
615 gtk_label_set_attributes(GTK_LABEL(label), attrs);
616 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
617 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4,
618 GTK_FILL, GTK_FILL, 5, 5);
619
620 user_comment_entry = gtk_entry_new();
621 gtk_table_attach(GTK_TABLE(table), user_comment_entry, 1, 4, 3,
622 4, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
623 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
624
625 label = gtk_label_new(_("Date:"));
626 gtk_label_set_attributes(GTK_LABEL(label), attrs);
627 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
628 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 4, 5,
629 GTK_FILL, GTK_FILL, 5, 5);
630
631 date_entry = gtk_entry_new();
632 gtk_widget_set_size_request(date_entry, 60, -1);
633 gtk_table_attach(GTK_TABLE(table), date_entry, 1, 2, 4, 5,
634 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
635 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
636
637 label = gtk_label_new(_("Track number:"));
638 gtk_label_set_attributes(GTK_LABEL(label), attrs);
639 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
640 gtk_table_attach(GTK_TABLE(table), label, 2, 3, 4, 5,
641 GTK_FILL, GTK_FILL, 5, 5);
642
643 tracknumber_entry = gtk_entry_new_with_max_length(4);
644 gtk_widget_set_size_request(tracknumber_entry, 20, -1);
645 gtk_table_attach(GTK_TABLE(table), tracknumber_entry, 3, 4, 4,
646 5, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
647 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
648
649 label = gtk_label_new(_("Genre:"));
650 gtk_label_set_attributes(GTK_LABEL(label), attrs);
651 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
652 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 5, 6,
653 GTK_FILL, GTK_FILL, 5, 5);
654
655 genre_combo = gtk_combo_new();
656 if (!genre_list) {
657 for (i = 0; i < G_N_ELEMENTS(vorbis_genres); i++)
658 genre_list = g_list_prepend(genre_list, _(vorbis_genres[i]));
659 genre_list = g_list_sort(genre_list, (GCompareFunc) g_strcasecmp);
660 }
661 gtk_combo_set_popdown_strings(GTK_COMBO(genre_combo), genre_list);
662 gtk_table_attach(GTK_TABLE(table), genre_combo, 1, 4, 5, 6,
663 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
664 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
665
666 #ifdef ALL_VORBIS_TAGS
667 label = gtk_label_new(_("Description:"));
668 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
669 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 6, 7,
670 GTK_FILL, GTK_FILL, 5, 5);
671
672 description_entry = gtk_entry_new();
673 gtk_table_attach(GTK_TABLE(table), description_entry, 1, 4, 6,
674 7, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
675 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
676
677 label = gtk_label_new(_("Location:"));
678 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
679 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 7, 8,
680 GTK_FILL, GTK_FILL, 5, 5);
681
682 location_entry = gtk_entry_new();
683 gtk_table_attach(GTK_TABLE(table), location_entry, 1, 4, 7, 8,
684 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
685 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
686
687 label = gtk_label_new(_("Version:"));
688 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
689 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 8, 9,
690 GTK_FILL, GTK_FILL, 5, 5);
691
692 version_entry = gtk_entry_new();
693 gtk_widget_set_size_request(version_entry, 60, -1);
694 gtk_table_attach(GTK_TABLE(table), version_entry, 1, 2, 8, 9,
695 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
696 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
697
698 label = gtk_label_new(_("ISRC number:"));
699 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
700 gtk_table_attach(GTK_TABLE(table), label, 2, 3, 8, 9,
701 GTK_FILL, GTK_FILL, 5, 5);
702
703 isrc_entry = gtk_entry_new();
704 gtk_widget_set_size_request(isrc_entry, 20, -1);
705 gtk_table_attach(GTK_TABLE(table), isrc_entry, 3, 4, 8, 9,
706 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
707 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
708
709 label = gtk_label_new(_("Organization:"));
710 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
711 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 9, 10,
712 GTK_FILL, GTK_FILL, 5, 5);
713
714 organization_entry = gtk_entry_new();
715 gtk_table_attach(GTK_TABLE(table), organization_entry, 1, 4, 9,
716 10, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
717 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
718
719 label = gtk_label_new(_("Copyright:"));
720 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
721 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 10, 11,
722 GTK_FILL, GTK_FILL, 5, 5);
723
724 copyright_entry = gtk_entry_new();
725 gtk_table_attach(GTK_TABLE(table), copyright_entry, 1, 4, 10,
726 11, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
727 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
728 #endif
729 boxx = gtk_hbutton_box_new();
730 gtk_hbutton_box_set_layout_default(GTK_BUTTONBOX_SPREAD);
731
732 remove_button = gtk_button_new_from_stock(GTK_STOCK_DELETE);
733 g_signal_connect_swapped(G_OBJECT(remove_button),
734 "clicked", G_CALLBACK(remove_cb), NULL);
735 gtk_container_add(GTK_CONTAINER(boxx), remove_button);
736
737 save_button = gtk_button_new_from_stock(GTK_STOCK_SAVE);
738 g_signal_connect(G_OBJECT(save_button), "clicked",
739 G_CALLBACK(save_cb), NULL);
740 gtk_container_add(GTK_CONTAINER(boxx), save_button);
741
742 gtk_table_attach(GTK_TABLE(table), boxx, 0, 5, 6, 7, GTK_FILL, 0,
743 0, 8);
744
745 rg_show_button = gtk_toggle_button_new();
746 img = gtk_image_new_from_stock(GTK_STOCK_GO_FORWARD,
747 GTK_ICON_SIZE_MENU);
748 gtk_container_add(GTK_CONTAINER(rg_show_button), img);
749 g_signal_connect(G_OBJECT(rg_show_button), "toggled",
750 G_CALLBACK(rg_show_cb), NULL);
751
752 gtk_table_attach(GTK_TABLE(left_vbox), rg_show_button, 4, 5, 0, 2,
753 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
754 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 5, 5);
755
756 rg_frame = gtk_frame_new(_(" Ogg Vorbis ReplayGain "));
757 gtk_table_attach(GTK_TABLE(left_vbox), rg_frame, 5, 6, 0, 4,
758 GTK_FILL, GTK_FILL, 0, 4);
759 rg_table = gtk_table_new(16, 4, FALSE);
760 gtk_container_add(GTK_CONTAINER(rg_frame), GTK_WIDGET(rg_table));
761
762 rg_track_label = gtk_label_new(_("Track gain:"));
763 gtk_misc_set_alignment(GTK_MISC(rg_track_label), 1, 0.5);
764 gtk_table_attach(GTK_TABLE(rg_table), rg_track_label, 5, 6, 0, 1,
765 GTK_FILL, GTK_FILL, 5, 5);
766
767 rg_track_entry = gtk_entry_new();
768 gtk_table_attach(GTK_TABLE(rg_table), rg_track_entry, 6, 7, 0,
769 1, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
770 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
771
772 rg_track_peak_label = gtk_label_new(_("Track peak:"));
773 gtk_misc_set_alignment(GTK_MISC(rg_track_peak_label), 1, 0.5);
774 gtk_table_attach(GTK_TABLE(rg_table), rg_track_peak_label, 5, 6, 1,
775 2, GTK_FILL, GTK_FILL, 5, 5);
776
777 rg_track_peak_entry = gtk_entry_new();
778 gtk_table_attach(GTK_TABLE(rg_table), rg_track_peak_entry, 6, 7, 1,
779 2, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
780 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
781
782
783 rg_album_label = gtk_label_new(_("Album gain:"));
784 gtk_misc_set_alignment(GTK_MISC(rg_album_label), 1, 0.5);
785 gtk_table_attach(GTK_TABLE(rg_table), rg_album_label, 5, 6, 2, 3,
786 GTK_FILL, GTK_FILL, 5, 5);
787
788 rg_album_entry = gtk_entry_new();
789 gtk_table_attach(GTK_TABLE(rg_table), rg_album_entry, 6, 7, 2,
790 3, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
791 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
792
793 rg_album_peak_label = gtk_label_new(_("Album peak:"));
794 gtk_misc_set_alignment(GTK_MISC(rg_album_peak_label), 1, 0.5);
795 gtk_table_attach(GTK_TABLE(rg_table), rg_album_peak_label, 5, 6, 3,
796 4, GTK_FILL, GTK_FILL, 5, 5);
797
798 rg_album_peak_entry = gtk_entry_new();
799 gtk_table_attach(GTK_TABLE(rg_table), rg_album_peak_entry, 6, 7, 3,
800 4, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
801 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
802
803 bbox = gtk_hbutton_box_new();
804 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
805 gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
806 gtk_table_attach(GTK_TABLE(left_vbox), bbox, 0, 4, 1, 2, GTK_FILL,
807 0, 0, 8);
808
809 cancel_button = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
810 g_signal_connect_swapped(G_OBJECT(cancel_button),
811 "clicked",
812 G_CALLBACK(gtk_widget_destroy),
813 G_OBJECT(window));
814 GTK_WIDGET_SET_FLAGS(cancel_button, GTK_CAN_DEFAULT);
815 gtk_box_pack_start(GTK_BOX(bbox), cancel_button, TRUE, TRUE, 0);
816 gtk_widget_grab_default(cancel_button);
817
818
819 gtk_table_set_col_spacing(GTK_TABLE(left_vbox), 1, 10);
820
821
822 info_frame = gtk_frame_new(_(" Ogg Vorbis Info "));
823 gtk_table_attach(GTK_TABLE(left_vbox), info_frame, 0, 2, 0, 1,
824 GTK_FILL, GTK_FILL, 0, 4);
825
826 info_box = gtk_vbox_new(FALSE, 5);
827 gtk_container_add(GTK_CONTAINER(info_frame), info_box);
828 gtk_container_set_border_width(GTK_CONTAINER(info_box), 10);
829 gtk_box_set_spacing(GTK_BOX(info_box), 0);
830
831 /* FIXME: Obvious... */
832 test_table = gtk_table_new(2, 10, FALSE);
833 gtk_container_set_border_width(GTK_CONTAINER(test_table), 0);
834 gtk_container_add(GTK_CONTAINER(info_box), test_table);
835
836
837 bitrate_label = gtk_label_new(_("Bit rate:"));
838 gtk_label_set_attributes(GTK_LABEL(bitrate_label), attrs);
839 gtk_misc_set_alignment(GTK_MISC(bitrate_label), 1, 0.5);
840 gtk_label_set_justify(GTK_LABEL(bitrate_label), GTK_JUSTIFY_RIGHT);
841 gtk_table_attach(GTK_TABLE(test_table), bitrate_label, 0, 1, 0, 1,
842 GTK_FILL, GTK_FILL, 5, 2);
843
844 bitrate_label_val = gtk_label_new("");
845 gtk_misc_set_alignment(GTK_MISC(bitrate_label_val), 0, 0);
846 gtk_label_set_justify(GTK_LABEL(bitrate_label_val), GTK_JUSTIFY_LEFT);
847 gtk_table_attach(GTK_TABLE(test_table), bitrate_label_val, 1, 2, 0,
848 1, GTK_FILL, GTK_FILL, 10, 2);
849
850 rate_label = gtk_label_new(_("Sample rate:"));
851 gtk_label_set_attributes(GTK_LABEL(rate_label), attrs);
852 gtk_misc_set_alignment(GTK_MISC(rate_label), 1, 0.5);
853 gtk_label_set_justify(GTK_LABEL(rate_label), GTK_JUSTIFY_RIGHT);
854 gtk_table_attach(GTK_TABLE(test_table), rate_label, 0, 1, 1, 2,
855 GTK_FILL, GTK_FILL, 5, 2);
856
857 rate_label_val = gtk_label_new("");
858 gtk_misc_set_alignment(GTK_MISC(rate_label_val), 0, 0);
859 gtk_label_set_justify(GTK_LABEL(rate_label_val), GTK_JUSTIFY_LEFT);
860 gtk_table_attach(GTK_TABLE(test_table), rate_label_val, 1, 2, 1, 2,
861 GTK_FILL, GTK_FILL, 10, 2);
862
863 channel_label = gtk_label_new(_("Channels:"));
864 gtk_label_set_attributes(GTK_LABEL(channel_label), attrs);
865 gtk_misc_set_alignment(GTK_MISC(channel_label), 1, 0.5);
866 gtk_label_set_justify(GTK_LABEL(channel_label), GTK_JUSTIFY_RIGHT);
867 gtk_table_attach(GTK_TABLE(test_table), channel_label, 0, 1, 2, 3,
868 GTK_FILL, GTK_FILL, 5, 2);
869
870 channel_label_val = gtk_label_new("");
871 gtk_misc_set_alignment(GTK_MISC(channel_label_val), 0, 0);
872 gtk_label_set_justify(GTK_LABEL(channel_label_val), GTK_JUSTIFY_LEFT);
873 gtk_table_attach(GTK_TABLE(test_table), channel_label_val, 1, 2, 2,
874 3, GTK_FILL, GTK_FILL, 10, 2);
875
876 length_label = gtk_label_new(_("Length:"));
877 gtk_label_set_attributes(GTK_LABEL(length_label), attrs);
878 gtk_misc_set_alignment(GTK_MISC(length_label), 1, 0.5);
879 gtk_label_set_justify(GTK_LABEL(length_label), GTK_JUSTIFY_RIGHT);
880 gtk_table_attach(GTK_TABLE(test_table), length_label, 0, 1, 3, 4,
881 GTK_FILL, GTK_FILL, 5, 2);
882
883 length_label_val = gtk_label_new("");
884 gtk_misc_set_alignment(GTK_MISC(length_label_val), 0, 0);
885 gtk_label_set_justify(GTK_LABEL(length_label_val), GTK_JUSTIFY_LEFT);
886 gtk_table_attach(GTK_TABLE(test_table), length_label_val, 1, 2, 3,
887 4, GTK_FILL, GTK_FILL, 10, 2);
888
889 filesize_label = gtk_label_new(_("File size:"));
890 gtk_label_set_attributes(GTK_LABEL(filesize_label), attrs);
891 gtk_misc_set_alignment(GTK_MISC(filesize_label), 1, 0.5);
892 gtk_label_set_justify(GTK_LABEL(filesize_label), GTK_JUSTIFY_RIGHT);
893 gtk_table_attach(GTK_TABLE(test_table), filesize_label, 0, 1, 4, 5,
894 GTK_FILL, GTK_FILL, 5, 2);
895
896 filesize_label_val = gtk_label_new("");
897 gtk_misc_set_alignment(GTK_MISC(filesize_label_val), 0, 0);
898 gtk_label_set_justify(GTK_LABEL(filesize_label_val),
899 GTK_JUSTIFY_LEFT);
900 gtk_table_attach(GTK_TABLE(test_table), filesize_label_val, 1, 2,
901 4, 5, GTK_FILL, GTK_FILL, 10, 2);
902
903 pango_attr_list_unref(attrs);
904 }
905 else
906 gtk_window_present(GTK_WINDOW(window));
907
908 if (!g_strncasecmp(vte.filename, "http://", 7))
909 gtk_widget_set_sensitive(tag_frame, FALSE);
910 else
911 gtk_widget_set_sensitive(tag_frame, TRUE);
912
913 gtk_label_set_text(GTK_LABEL(bitrate_label), _("Bit rate:"));
914 gtk_label_set_text(GTK_LABEL(bitrate_label_val), _("N/A"));
915
916 gtk_label_set_text(GTK_LABEL(rate_label), _("Sample rate:"));
917 gtk_label_set_text(GTK_LABEL(rate_label_val), _("N/A"));
918
919 gtk_label_set_text(GTK_LABEL(channel_label), _("Channels:"));
920 gtk_label_set_text(GTK_LABEL(channel_label_val), _("N/A"));
921
922 gtk_label_set_text(GTK_LABEL(length_label), _("Length:"));
923 gtk_label_set_text(GTK_LABEL(length_label_val), _("N/A"));
924
925 gtk_label_set_text(GTK_LABEL(filesize_label), _("File size:"));
926 gtk_label_set_text(GTK_LABEL(filesize_label_val), _("N/A"));
927
928 if ((fh = vfs_fopen(vte.filename, "r")) != NULL) {
929 g_mutex_lock(vf_mutex);
930
931 if (ov_open_callbacks(fh, &vf, NULL, 0, vorbis_callbacks) == 0) {
932 comment = ov_comment(&vf, -1);
933 if ((vi = ov_info(&vf, 0)) != NULL) {
934 bitrate = vi->bitrate_nominal / 1000;
935 rate = vi->rate;
936 channels = vi->channels;
937 clear_vf = TRUE;
938 gtk_widget_set_sensitive(GTK_WIDGET(save_button), FALSE);
939 gtk_widget_set_sensitive(GTK_WIDGET(remove_button), TRUE);
940 }
941 else {
942 bitrate = 0;
943 rate = 0;
944 channels = 0;
945 gtk_widget_set_sensitive(GTK_WIDGET(save_button), FALSE);
946 gtk_widget_set_sensitive(GTK_WIDGET(remove_button), FALSE);
947 }
948
949 time = ov_time_total(&vf, -1);
950 minutes = time / 60;
951 seconds = time % 60;
952 vfs_fseek(fh, 0, SEEK_END);
953 filesize = vfs_ftell(fh);
954
955 label_set_text(GTK_LABEL(bitrate_label_val),
956 _("%d KBit/s (nominal)"), bitrate);
957 label_set_text(GTK_LABEL(rate_label_val), _("%d Hz"), rate);
958 label_set_text(GTK_LABEL(channel_label_val), _("%d"), channels);
959 label_set_text(GTK_LABEL(length_label_val),
960 _("%d:%.2d"), minutes, seconds);
961 label_set_text(GTK_LABEL(filesize_label_val),
962 _("%d Bytes"), filesize);
963
964 }
965 else
966 vfs_fclose(fh);
967 }
968
969 rg_track_gain = get_comment(comment, "replaygain_track_gain");
970 if (*rg_track_gain == '\0')
971 rg_track_gain = get_comment(comment, "rg_radio"); /* Old */
972
973 rg_album_gain = get_comment(comment, "replaygain_album_gain");
974 if (*rg_album_gain == '\0')
975 rg_album_gain = get_comment(comment, "rg_audiophile"); /* Old */
976
977 rg_track_peak = get_comment(comment, "replaygain_track_peak");
978 if (*rg_track_peak == '\0')
979 rg_track_peak = get_comment(comment, "rg_peak"); /* Old */
980
981 rg_album_peak = get_comment(comment, "replaygain_album_peak"); /* Old had no album peak */
982
983 /* Fill it all in .. */
984 gtk_entry_set_text(GTK_ENTRY(title_entry),
985 get_comment(comment, "title"));
986 gtk_entry_set_text(GTK_ENTRY(performer_entry),
987 get_comment(comment, "artist"));
988 gtk_entry_set_text(GTK_ENTRY(album_entry),
989 get_comment(comment, "album"));
990 gtk_entry_set_text(GTK_ENTRY(user_comment_entry),
991 get_comment(comment, "comment"));
992 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(genre_combo)->entry),
993 get_comment(comment, "genre"));
994 gtk_entry_set_text(GTK_ENTRY(tracknumber_entry),
995 get_comment(comment, "tracknumber"));
996 gtk_entry_set_text(GTK_ENTRY(date_entry),
997 get_comment(comment, "date"));
998 #ifdef ALL_VORBIS_TAGS
999 gtk_entry_set_text(GTK_ENTRY(version_entry),
1000 get_comment(comment, "version"));
1001 gtk_entry_set_text(GTK_ENTRY(description_entry),
1002 get_comment(comment, "description"));
1003 gtk_entry_set_text(GTK_ENTRY(organization_entry),
1004 get_comment(comment, "organization"));
1005 gtk_entry_set_text(GTK_ENTRY(copyright_entry),
1006 get_comment(comment, "copyright"));
1007 gtk_entry_set_text(GTK_ENTRY(isrc_entry),
1008 get_comment(comment, "isrc"));
1009 gtk_entry_set_text(GTK_ENTRY(location_entry),
1010 get_comment(comment, "location"));
1011 #endif
1012
1013 filename_utf8 = filename_to_utf8(vte.filename);
1014
1015 title = g_strdup_printf(_("%s - Audacious"), g_basename(filename_utf8));
1016 gtk_window_set_title(GTK_WINDOW(window), title);
1017 g_free(title);
1018
1019 gtk_entry_set_text(GTK_ENTRY(filename_entry), filename_utf8);
1020 gtk_editable_set_position(GTK_EDITABLE(filename_entry), -1);
1021
1022 g_free(filename_utf8);
1023
1024 gtk_entry_set_text(GTK_ENTRY(rg_track_entry), rg_track_gain);
1025 gtk_entry_set_text(GTK_ENTRY(rg_album_entry), rg_album_gain);
1026 gtk_entry_set_text(GTK_ENTRY(rg_track_peak_entry), rg_track_peak);
1027 gtk_editable_set_position(GTK_EDITABLE(rg_track_peak_entry), -1);
1028 gtk_entry_set_text(GTK_ENTRY(rg_album_peak_entry), rg_album_peak);
1029 gtk_editable_set_position(GTK_EDITABLE(rg_album_peak_entry), -1);
1030
1031 /* if (*rg_track_gain == '\0' && *rg_album_gain == '\0' &&
1032 *rg_track_peak == '\0' && *rg_album_peak == '\0') {
1033 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rg_show_button),
1034 FALSE);
1035 }
1036 else
1037 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rg_show_button),
1038 TRUE);*/
1039
1040 /* ov_clear closes the file */
1041 if (clear_vf) ov_clear(&vf);
1042 g_mutex_unlock(vf_mutex);
1043
1044
1045 gtk_widget_set_sensitive(tag_frame, vfs_is_writeable(vte.filename));
1046
1047 g_signal_connect_swapped(title_entry, "changed", change_buttons,
1048 save_button);
1049 g_signal_connect_swapped(performer_entry, "changed", change_buttons,
1050 save_button);
1051 g_signal_connect_swapped(album_entry, "changed", change_buttons,
1052 save_button);
1053 g_signal_connect_swapped(date_entry, "changed", change_buttons,
1054 save_button);
1055 g_signal_connect_swapped(user_comment_entry, "changed", change_buttons,
1056 save_button);
1057 g_signal_connect_swapped(tracknumber_entry, "changed", change_buttons,
1058 save_button);
1059 g_signal_connect_swapped(GTK_COMBO(genre_combo)->entry, "changed",
1060 G_CALLBACK(change_buttons), save_button);
1061
1062 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
1063 gtk_widget_show_all(window);
1064 gtk_widget_hide(rg_frame);
1065
1066 gtk_widget_set_sensitive(save_button, FALSE);
1067 gtk_widget_set_sensitive(remove_button, FALSE);
1068 }