comparison Plugins/Input/mpg123/fileinfo.c @ 957:12f57026da8f trunk

[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
author chainsaw
date Sun, 23 Apr 2006 15:50:33 -0700
parents bd38580ec186
children b082b5c77461
comparison
equal deleted inserted replaced
956:6bd91d768233 957:12f57026da8f
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 */ 20 */
21 21
22 #include "mpg123.h" 22 #include "mpg123.h"
23 23
24 #ifdef HAVE_ID3LIB 24 #include <tag_c.h>
25 # include <id3.h>
26 #endif
27 25
28 #include <glib.h> 26 #include <glib.h>
29 #include <glib/gi18n.h> 27 #include <glib/gi18n.h>
30 #include <gtk/gtk.h> 28 #include <gtk/gtk.h>
31 #include <gdk/gdkkeysyms.h> 29 #include <gdk/gdkkeysyms.h>
37 #include <unistd.h> 35 #include <unistd.h>
38 #include <fcntl.h> 36 #include <fcntl.h>
39 #include <errno.h> 37 #include <errno.h>
40 38
41 #include "audacious/util.h" 39 #include "audacious/util.h"
42 #include <libaudacious/util.h> 40 #include "libaudacious/util.h"
43 #include <libaudacious/vfs.h> 41 #include "libaudacious/vfs.h"
44 #include <libaudacious/xentry.h> 42 #include "libaudacious/xentry.h"
45 43
46 #include "mp3.xpm" 44 #include "mp3.xpm"
47 45
48 static GtkWidget *window = NULL; 46 static GtkWidget *window = NULL;
49 static GtkWidget *filename_entry, *id3_frame; 47 static GtkWidget *filename_entry, *id3_frame;
50 static GtkWidget *title_entry, *artist_entry, *album_entry, *year_entry, 48 static GtkWidget *title_entry, *artist_entry, *album_entry, *year_entry,
51 *tracknum_entry, *comment_entry; 49 *tracknum_entry, *comment_entry;
52 static GtkWidget *genre_combo; 50 static GtkWidget *genre_combo;
53 #ifdef HAVE_ID3LIB
54 static GtkWidget * totaltracks_entry;
55 #endif
56 static GtkWidget *mpeg_level, *mpeg_bitrate, *mpeg_samplerate, *mpeg_flags, 51 static GtkWidget *mpeg_level, *mpeg_bitrate, *mpeg_samplerate, *mpeg_flags,
57 *mpeg_error, *mpeg_copy, *mpeg_orig, *mpeg_emph, *mpeg_frames, 52 *mpeg_error, *mpeg_copy, *mpeg_orig, *mpeg_emph, *mpeg_frames,
58 *mpeg_filesize; 53 *mpeg_filesize;
59 static GtkWidget *mpeg_level_val, *mpeg_bitrate_val, *mpeg_samplerate_val, 54 static GtkWidget *mpeg_level_val, *mpeg_bitrate_val, *mpeg_samplerate_val,
60 *mpeg_error_val, *mpeg_copy_val, *mpeg_orig_val, *mpeg_emph_val, 55 *mpeg_error_val, *mpeg_copy_val, *mpeg_orig_val, *mpeg_emph_val,
64 GtkWidget *mpeg_frame, *mpeg_box; 59 GtkWidget *mpeg_frame, *mpeg_box;
65 GtkWidget *label, *filename_vbox; 60 GtkWidget *label, *filename_vbox;
66 GtkWidget *bbox; 61 GtkWidget *bbox;
67 GtkWidget *remove_id3, *cancel, *save; 62 GtkWidget *remove_id3, *cancel, *save;
68 GtkWidget *boxx; 63 GtkWidget *boxx;
69 #if 0
70 GtkWidget *revert;
71 #endif
72 64
73 VFSFile *fh; 65 VFSFile *fh;
74 struct id3v1tag_t tag;
75 const gchar *emphasis[4]; 66 const gchar *emphasis[4];
76 const gchar *bool_label[2]; 67 const gchar *bool_label[2];
77
78 68
79 static GList *genre_list = NULL; 69 static GList *genre_list = NULL;
80 static gchar *current_filename = NULL; 70 static gchar *current_filename = NULL;
81 71
82 extern gchar *mpg123_filename; 72 extern gchar *mpg123_filename;
84 mpg123_mode; 74 mpg123_mode;
85 extern gboolean mpg123_stereo, mpg123_mpeg25; 75 extern gboolean mpg123_stereo, mpg123_mpeg25;
86 76
87 glong info_rate; 77 glong info_rate;
88 78
79 static TagLib_File *taglib_file;
80 static TagLib_Tag *taglib_tag;
81 static const TagLib_AudioProperties *taglib_ap;
82
89 void fill_entries(GtkWidget * w, gpointer data); 83 void fill_entries(GtkWidget * w, gpointer data);
90 84
91 #define MAX_STR_LEN 100 85 #define MAX_STR_LEN 100
92
93 #ifndef HAVE_ID3LIB
94
95 static void
96 set_entry_tag(GtkEntry * entry, gchar * tag, gint length)
97 {
98 gint stripped_len;
99 gchar *text, *text_utf8;
100
101 stripped_len = mpg123_strip_spaces(tag, length);
102 text = g_strdup_printf("%-*.*s", stripped_len, stripped_len, tag);
103
104 if ((text_utf8 = str_to_utf8(text))) {
105 gtk_entry_set_text(entry, text_utf8);
106 g_free(text_utf8);
107 }
108 else {
109 gtk_entry_set_text(entry, "");
110 }
111
112 g_free(text);
113 }
114
115 static void
116 get_entry_tag(GtkEntry * entry, gchar * tag, gint length)
117 {
118 gchar *text = str_to_utf8(gtk_entry_get_text(entry));
119 memset(tag, ' ', length);
120 memcpy(tag, text, strlen(text) > length ? length : strlen(text));
121 }
122
123 static gint
124 find_genre_id(const gchar * text)
125 {
126 gint i;
127
128 for (i = 0; i < GENRE_MAX; i++) {
129 if (!strcmp(mpg123_id3_genres[i], text))
130 return i;
131 }
132 if (text[0] == '\0')
133 return 0xff;
134 return 0;
135 }
136
137 static void
138 press_save(GtkWidget * w, gpointer data)
139 {
140 gtk_button_clicked(GTK_BUTTON(save));
141 }
142
143 #else
144
145 GtkWidget * copy_album_tags_but, * paste_album_tags_but;
146
147 struct album_tags_t {
148 char * performer;
149 char * album;
150 char * year;
151 char * total_tracks;
152 };
153
154 struct album_tags_t album_tags = { NULL, NULL, NULL, NULL };
155
156 #define FREE_AND_ZERO(x) do { g_free(x); x = NULL; } while (0)
157
158 static void free_album_tags()
159 {
160 FREE_AND_ZERO(album_tags.performer);
161 FREE_AND_ZERO(album_tags.album);
162 FREE_AND_ZERO(album_tags.year);
163 FREE_AND_ZERO(album_tags.total_tracks);
164 }
165
166 static inline char * entry_text_dup_or_null(GtkWidget * e)
167 {
168 const char * text = gtk_entry_get_text(GTK_ENTRY(e));
169 if (strlen(text) > 0)
170 return g_strdup(text);
171 else
172 return NULL;
173 }
174
175 static inline void
176 update_paste_sensitive()
177 {
178 gtk_widget_set_sensitive(GTK_WIDGET(paste_album_tags_but),
179 album_tags.performer ||
180 album_tags.album ||
181 album_tags.year ||
182 album_tags.total_tracks);
183
184 }
185
186 static void validate_zeropad_tracknums()
187 {
188 const char * tn_str, * tt_str, * end;
189 char buf[5];
190 int tn, tt;
191
192 tn_str = gtk_entry_get_text(GTK_ENTRY(tracknum_entry));
193 tt_str = gtk_entry_get_text(GTK_ENTRY(totaltracks_entry));
194
195 end = tt_str;
196 tt = strtol(tt_str,(char**)&end,10);
197 if (end != tt_str) {
198 sprintf(buf,"%02d",tt);
199 gtk_entry_set_text(GTK_ENTRY(totaltracks_entry),buf);
200 } else {
201 gtk_entry_set_text(GTK_ENTRY(totaltracks_entry),"");
202 tt = 1000; /* any tracknum is valid */
203 }
204
205 end = tn_str;
206 tn = strtol(tn_str,(char**)&end,10);
207 if (end != tn_str && tn <= tt) {
208 sprintf(buf,"%02d",tn);
209 gtk_entry_set_text(GTK_ENTRY(tracknum_entry),buf);
210 } else
211 gtk_entry_set_text(GTK_ENTRY(tracknum_entry),"");
212
213 }
214
215 static void
216 copy_album_tags()
217 {
218 validate_zeropad_tracknums();
219 free_album_tags();
220 album_tags.performer = entry_text_dup_or_null(artist_entry);
221 album_tags.album = entry_text_dup_or_null(album_entry);
222 album_tags.year = entry_text_dup_or_null(year_entry);
223 album_tags.total_tracks = entry_text_dup_or_null(totaltracks_entry);
224 update_paste_sensitive();
225 }
226
227 static void
228 paste_album_tags()
229 {
230 if (album_tags.performer)
231 gtk_entry_set_text(GTK_ENTRY(artist_entry),album_tags.performer);
232 if (album_tags.album)
233 gtk_entry_set_text(GTK_ENTRY(album_entry),album_tags.album);
234 if (album_tags.year)
235 gtk_entry_set_text(GTK_ENTRY(year_entry),album_tags.year);
236 if (album_tags.total_tracks)
237 gtk_entry_set_text(GTK_ENTRY(totaltracks_entry),album_tags.total_tracks);
238 }
239
240 #endif
241 86
242 static gint 87 static gint
243 genre_comp_func(gconstpointer a, gconstpointer b) 88 genre_comp_func(gconstpointer a, gconstpointer b)
244 { 89 {
245 return strcasecmp(a, b); 90 return strcasecmp(a, b);
262 } 107 }
263 108
264 return TRUE; 109 return TRUE;
265 } 110 }
266 111
267 #ifdef HAVE_ID3LIB
268 /* some helper id3(v2) functions */
269
270 static void str_to_id3v2_frame(const char * str, ID3Tag * tag, ID3_FrameID frame_id)
271 {
272 ID3Frame * frame = ID3Tag_FindFrameWithID(tag,frame_id);
273 ID3Field * text_field;
274 gboolean new_frame = frame?FALSE:TRUE;
275
276 if (new_frame) {
277 frame = ID3Frame_NewID(frame_id);
278 }
279
280 text_field = ID3Frame_GetField(frame,ID3FN_TEXT);
281 ID3Field_SetASCII(text_field, str);
282
283 if (new_frame)
284 ID3Tag_AddFrame(tag,frame);
285 }
286
287 static void genre_combo_to_tag(GtkWidget * combo, ID3Tag * tag)
288 {
289 int idx = -1, i;
290 const char * genre = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry));
291 for(i=0;i<ID3_NR_OF_V1_GENRES;i++)
292 if (!strcmp(genre,ID3_v1_genre_description[i])) {
293 idx = i; break;
294 }
295 if (idx>-1) {
296 char code[7];
297 snprintf(code,7,"(%d)",idx);
298 str_to_id3v2_frame(code,tag,ID3FID_CONTENTTYPE);
299 }
300 }
301
302 static void id3v2_frame_to_entry(GtkWidget * entry,ID3Tag * tag, ID3_FrameID frame_id)
303 {
304 ID3Frame * frame = ID3Tag_FindFrameWithID(tag,frame_id);
305 ID3Field * text_field;
306 if (frame) {
307 gchar *text;
308 char buf[4096];
309 text_field = ID3Frame_GetField(frame,ID3FN_TEXT);
310 ID3Field_GetASCII(text_field,buf,4096);
311 text = str_to_utf8(buf);
312 gtk_entry_set_text(GTK_ENTRY(entry),text);
313 g_free(text);
314 } else
315 gtk_entry_set_text(GTK_ENTRY(entry),"");
316 }
317
318 static void id3v2_frame_to_text_view(GtkWidget * entry,ID3Tag * tag, ID3_FrameID frame_id)
319 {
320 ID3Frame * frame = ID3Tag_FindFrameWithID(tag,frame_id);
321 ID3Field * text_field;
322 if (frame) {
323 char buf[4096];
324 text_field = ID3Frame_GetField(frame,ID3FN_TEXT);
325 ID3Field_GetASCII(text_field,buf,4096);
326 gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(entry)),buf,-1);
327 } else
328 gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(entry)),"",-1);
329 }
330
331 static void id3v2_tracknum_to_entries(GtkWidget * tracknum_entry,
332 GtkWidget * totaltracks_entry,
333 ID3Tag * tag)
334 {
335 ID3Frame * frame = ID3Tag_FindFrameWithID(tag,ID3FID_TRACKNUM);
336 ID3Field * text_field;
337 if (frame) {
338 char buf[4096];
339 char * slash;
340 text_field = ID3Frame_GetField(frame,ID3FN_TEXT);
341 ID3Field_GetASCII(text_field,buf,4096);
342 slash = strchr(buf,'/');
343 if (slash) {
344 slash[0] = 0;
345 gtk_entry_set_text(GTK_ENTRY(tracknum_entry),buf);
346 gtk_entry_set_text(GTK_ENTRY(totaltracks_entry),slash+1);
347 } else {
348 gtk_entry_set_text(GTK_ENTRY(tracknum_entry),buf);
349 gtk_entry_set_text(GTK_ENTRY(totaltracks_entry),"");
350 }
351 } else {
352 gtk_entry_set_text(GTK_ENTRY(tracknum_entry),"");
353 gtk_entry_set_text(GTK_ENTRY(totaltracks_entry),"");
354 }
355 }
356
357 /*
358 if has v2 - link with v2, if not - attempt to link with v1
359 use this only for reading - always save v2
360 */
361 size_t ID3Tag_LinkPreferV2(ID3Tag *tag, const char *fileName)
362 {
363 size_t r;
364
365 r = ID3Tag_Link(tag,fileName);
366 if (ID3Tag_HasTagType(tag,ID3TT_ID3V2)) {
367 ID3Tag_Clear(tag);
368 r = ID3Tag_LinkWithFlags(tag,fileName,ID3TT_ID3V2);
369 }
370 return r;
371 }
372
373 #endif /* HAVE_ID3LIB */
374
375 #ifdef HAVE_ID3LIB
376
377 static void 112 static void
378 save_cb(GtkWidget * w, gpointer data) 113 save_cb(GtkWidget * w, gpointer data)
379 { 114 {
380 ID3Tag * id3tag; 115 int result;
381 const char * tracks_str, * trackno_str, * endptr;
382 int trackno, tracks;
383 116
384 if (str_has_prefix_nocase(current_filename, "http://")) 117 if (str_has_prefix_nocase(current_filename, "http://"))
385 return; 118 return;
386 119
387 validate_zeropad_tracknums(); 120 taglib_file = taglib_file_new(current_filename);
388 121 if(taglib_file) {
389 id3tag = ID3Tag_New(); 122 taglib_tag = taglib_file_tag(taglib_file);
390 ID3Tag_LinkWithFlags(id3tag, current_filename, ID3TT_ID3); 123 taglib_ap = taglib_file_audioproperties(taglib_file);
391 124 } else return;
392 str_to_id3v2_frame(gtk_entry_get_text(GTK_ENTRY(title_entry)),id3tag,ID3FID_TITLE); 125
393 str_to_id3v2_frame(gtk_entry_get_text(GTK_ENTRY(artist_entry)),id3tag,ID3FID_LEADARTIST); 126 taglib_tag_set_title(taglib_tag, gtk_entry_get_text(GTK_ENTRY(title_entry)));
394 str_to_id3v2_frame(gtk_entry_get_text(GTK_ENTRY(album_entry)),id3tag,ID3FID_ALBUM); 127 taglib_tag_set_artist(taglib_tag, gtk_entry_get_text(GTK_ENTRY(artist_entry)));
395 { 128 taglib_tag_set_album(taglib_tag, gtk_entry_get_text(GTK_ENTRY(album_entry)));
396 GtkTextIter start, end; 129 taglib_tag_set_comment(taglib_tag, gtk_entry_get_text(GTK_ENTRY(comment_entry)));
397 GtkTextBuffer * buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(comment_entry)); 130 taglib_tag_set_year(taglib_tag, atoi(gtk_entry_get_text(GTK_ENTRY(year_entry))));
398 gtk_text_buffer_get_start_iter(buffer,&start); 131 taglib_tag_set_track(taglib_tag, atoi(gtk_entry_get_text(GTK_ENTRY(tracknum_entry))));
399 gtk_text_buffer_get_end_iter(buffer,&end); 132 taglib_tag_set_genre(taglib_tag, gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(genre_combo)->entry)));
400 str_to_id3v2_frame(gtk_text_buffer_get_text(buffer,&start,&end,FALSE),id3tag,ID3FID_COMMENT);
401 }
402 str_to_id3v2_frame(gtk_entry_get_text(GTK_ENTRY(year_entry)),id3tag,ID3FID_YEAR);
403
404 /* saving trackno -> may be with album tracks number */
405 trackno_str = gtk_entry_get_text(GTK_ENTRY(tracknum_entry));
406 endptr = trackno_str;
407 trackno = strtol(trackno_str,(char**)&endptr,10);
408 if (endptr != trackno_str) {
409 char buf[10];
410 tracks_str = gtk_entry_get_text(GTK_ENTRY(totaltracks_entry));
411 endptr = tracks_str;
412 tracks = strtol(tracks_str,(char**)&endptr,10);
413 if (endptr != tracks_str)
414 snprintf(buf,10,"%02d/%02d",trackno,tracks);
415 else
416 snprintf(buf,10,"%02d",trackno);
417 str_to_id3v2_frame(buf,id3tag,ID3FID_TRACKNUM);
418 } else
419 str_to_id3v2_frame("",id3tag,ID3FID_TRACKNUM);
420
421
422 genre_combo_to_tag(genre_combo,id3tag);
423 gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE); 133 gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE);
424 134 gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE);
425 ID3Tag_Update(id3tag); 135
426 136 result = taglib_file_save(taglib_file);
427 ID3Tag_Delete(id3tag); 137 taglib_file_free(taglib_file);
428 } 138 taglib_tag_free_strings();
429 139 }
430 #else /* ! HAVE_ID3LIB */
431
432 static void
433 save_cb(GtkWidget * widget,
434 gpointer data)
435 {
436 VFSFile *file;
437 gchar *msg = NULL;
438
439 if (str_has_prefix_nocase(current_filename, "http://"))
440 return;
441
442 if ((file = vfs_fopen(current_filename, "r+b")) != NULL) {
443 gint tracknum;
444
445 vfs_fseek(file, -128, SEEK_END);
446 vfs_fread(&tag, 1, sizeof(struct id3v1tag_t), file);
447
448 if (g_str_has_prefix(tag.tag, "TAG"))
449 vfs_fseek(file, -128L, SEEK_END);
450 else
451 vfs_fseek(file, 0L, SEEK_END);
452
453 tag.tag[0] = 'T';
454 tag.tag[1] = 'A';
455 tag.tag[2] = 'G';
456
457 get_entry_tag(GTK_ENTRY(title_entry), tag.title, 30);
458 get_entry_tag(GTK_ENTRY(artist_entry), tag.artist, 30);
459 get_entry_tag(GTK_ENTRY(album_entry), tag.album, 30);
460 get_entry_tag(GTK_ENTRY(year_entry), tag.year, 4);
461
462 tracknum = atoi(gtk_entry_get_text(GTK_ENTRY(tracknum_entry)));
463 if (tracknum > 0) {
464 get_entry_tag(GTK_ENTRY(comment_entry), tag.u.v1_1.comment, 28);
465 tag.u.v1_1.__zero = 0;
466 tag.u.v1_1.track_number = MIN(tracknum, 255);
467 }
468 else
469 get_entry_tag(GTK_ENTRY(comment_entry), tag.u.v1_0.comment, 30);
470
471 tag.genre = find_genre_id(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO
472 (genre_combo)->entry)));
473 if (vfs_fwrite(&tag, 1, sizeof(tag), file) != sizeof(tag))
474 msg = g_strdup_printf(_("%s\nUnable to write to file: %s"),
475 _("Couldn't write tag!"), strerror(errno));
476 vfs_fclose(file);
477 }
478 else
479 msg = g_strdup_printf(_("%s\nUnable to open file: %s"),
480 _("Couldn't write tag!"), strerror(errno));
481 if (msg) {
482 GtkWidget *mwin = xmms_show_message(_("File Info"), msg, _("Ok"),
483 FALSE, NULL, NULL);
484 gtk_window_set_transient_for(GTK_WINDOW(mwin), GTK_WINDOW(window));
485 g_free(msg);
486 }
487 else {
488 gtk_widget_set_sensitive(GTK_WIDGET(data), TRUE);
489 gtk_widget_set_sensitive(GTK_WIDGET(widget), FALSE);
490 }
491 }
492
493 #endif /* HAVE_ID3LIB */
494 140
495 static void 141 static void
496 label_set_text(GtkWidget * label, gchar * str, ...) 142 label_set_text(GtkWidget * label, gchar * str, ...)
497 { 143 {
498 va_list args; 144 va_list args;
503 va_end(args); 149 va_end(args);
504 150
505 gtk_label_set_text(GTK_LABEL(label), tempstr); 151 gtk_label_set_text(GTK_LABEL(label), tempstr);
506 } 152 }
507 153
508 #ifdef HAVE_ID3LIB
509
510 static void 154 static void
511 remove_id3_cb(GtkWidget * w, gpointer data) 155 remove_id3_cb(GtkWidget * w, gpointer data)
512 { 156 {
513 ID3Tag * id3tag; 157 int result;
514 158
515 if (str_has_prefix_nocase(current_filename, "http://")) 159 if (str_has_prefix_nocase(current_filename, "http://"))
516 return; 160 return;
517 161
518 id3tag = ID3Tag_New(); 162 taglib_file = taglib_file_new(current_filename);
519 ID3Tag_LinkWithFlags(id3tag, current_filename, ID3TT_ID3); 163 if(taglib_file) {
520 164 taglib_tag = taglib_file_tag(taglib_file);
521 ID3Tag_Strip(id3tag,ID3TT_ALL); 165 taglib_ap = taglib_file_audioproperties(taglib_file);
522 ID3Tag_Update(id3tag); 166 } else return;
523 167
524 ID3Tag_Delete(id3tag); 168 taglib_tag_set_title(taglib_tag, "");
525 gtk_entry_set_text(GTK_ENTRY(title_entry), ""); 169 gtk_entry_set_text(GTK_ENTRY(title_entry), "");
170 taglib_tag_set_artist(taglib_tag, "");
526 gtk_entry_set_text(GTK_ENTRY(artist_entry), ""); 171 gtk_entry_set_text(GTK_ENTRY(artist_entry), "");
172 taglib_tag_set_album(taglib_tag, "");
527 gtk_entry_set_text(GTK_ENTRY(album_entry), ""); 173 gtk_entry_set_text(GTK_ENTRY(album_entry), "");
528 gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(comment_entry)), "",-1); 174 taglib_tag_set_comment(taglib_tag, "");
175 gtk_entry_set_text(GTK_ENTRY(comment_entry), "");
176 taglib_tag_set_year(taglib_tag, 0);
529 gtk_entry_set_text(GTK_ENTRY(year_entry), ""); 177 gtk_entry_set_text(GTK_ENTRY(year_entry), "");
530 gtk_entry_set_text(GTK_ENTRY(album_entry), ""); 178 taglib_tag_set_track(taglib_tag, 0);
531 gtk_entry_set_text(GTK_ENTRY(tracknum_entry), ""); 179 gtk_entry_set_text(GTK_ENTRY(tracknum_entry), "");
532 gtk_entry_set_text(GTK_ENTRY(totaltracks_entry), ""); 180 taglib_tag_set_genre(taglib_tag, "");
533 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(genre_combo)->entry), ""); 181 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(genre_combo)->entry), "");
534 gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE); 182 gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE);
535 gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE); 183 gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE);
536 } 184
537 185 result = taglib_file_save(taglib_file);
538 #else 186 taglib_file_free(taglib_file);
539 187 taglib_tag_free_strings();
540 static void 188 }
541 remove_id3_cb(GtkWidget * w, gpointer data)
542 {
543 VFSFile *file;
544 gint len;
545 struct id3v1tag_t tag;
546 gchar *msg = NULL;
547
548 if (str_has_prefix_nocase(current_filename, "http://"))
549 return;
550
551 if ((file = vfs_fopen(current_filename, "rb+")) != NULL) {
552 vfs_fseek(file, -128, SEEK_END);
553 len = vfs_ftell(file);
554
555 vfs_fread(&tag, 1, sizeof(struct id3v1tag_t), file);
556
557 if (g_str_has_prefix(tag.tag, "TAG")) {
558 if (vfs_truncate(file, len))
559 msg = g_strdup_printf(_("%s\n"
560 "Unable to truncate file: %s"),
561 _("Couldn't remove tag!"),
562 strerror(errno));
563 }
564 else
565 msg = strdup(_("No tag to remove!"));
566
567 vfs_fclose(file);
568 }
569 else
570 msg = g_strdup_printf(_("%s\nUnable to open file: %s"),
571 _("Couldn't remove tag!"), strerror(errno));
572 if (msg) {
573 GtkWidget *mwin = xmms_show_message(_("File Info"), msg, _("Ok"),
574 FALSE, NULL, NULL);
575 gtk_window_set_transient_for(GTK_WINDOW(mwin), GTK_WINDOW(window));
576 g_free(msg);
577 }
578 else {
579 gtk_entry_set_text(GTK_ENTRY(title_entry), "");
580 gtk_entry_set_text(GTK_ENTRY(artist_entry), "");
581 gtk_entry_set_text(GTK_ENTRY(album_entry), "");
582 gtk_entry_set_text(GTK_ENTRY(comment_entry), "");
583 gtk_entry_set_text(GTK_ENTRY(year_entry), "");
584 gtk_entry_set_text(GTK_ENTRY(album_entry), "");
585 gtk_entry_set_text(GTK_ENTRY(tracknum_entry), "");
586 gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE);
587 gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE);
588 }
589 }
590
591 #endif
592 189
593 static void 190 static void
594 set_mpeg_level_label(gboolean mpeg25, gint lsf, gint layer) 191 set_mpeg_level_label(gboolean mpeg25, gint lsf, gint layer)
595 { 192 {
596 if (mpeg25) 193 if (mpeg25)
626 223
627 static void 224 static void
628 change_buttons(GtkObject * object) 225 change_buttons(GtkObject * object)
629 { 226 {
630 gtk_widget_set_sensitive(GTK_WIDGET(object), TRUE); 227 gtk_widget_set_sensitive(GTK_WIDGET(object), TRUE);
631 #if 0
632 gtk_widget_set_sensitive(GTK_WIDGET(revert),TRUE);
633 #endif
634 } 228 }
635 229
636 void 230 void
637 mpg123_file_info_box(gchar * filename) 231 mpg123_file_info_box(gchar * filename)
638 { 232 {
651 GdkPixbuf *pixbuf; 245 GdkPixbuf *pixbuf;
652 PangoAttrList *attrs; 246 PangoAttrList *attrs;
653 PangoAttribute *attr; 247 PangoAttribute *attr;
654 GtkWidget *test_table = gtk_table_new(2, 11, FALSE); 248 GtkWidget *test_table = gtk_table_new(2, 11, FALSE);
655 GtkWidget *urk, *blark; 249 GtkWidget *urk, *blark;
656 #ifdef HAVE_ID3LIB 250 GtkWidget * comment_frame;
657 GtkWidget * tracknum_box, * comment_frame;
658 #endif
659 251
660 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 252 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
661 gtk_window_set_type_hint(GTK_WINDOW(window), 253 gtk_window_set_type_hint(GTK_WINDOW(window),
662 GDK_WINDOW_TYPE_HINT_DIALOG); 254 GDK_WINDOW_TYPE_HINT_DIALOG);
663 gtk_window_set_resizable(GTK_WINDOW(window), FALSE); 255 gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
876 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); 468 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
877 gtk_label_set_attributes(GTK_LABEL(label), attrs); 469 gtk_label_set_attributes(GTK_LABEL(label), attrs);
878 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, 470 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL,
879 GTK_FILL, 5, 5); 471 GTK_FILL, 5, 5);
880 472
881 #ifdef HAVE_ID3LIB
882 title_entry = gtk_entry_new(); 473 title_entry = gtk_entry_new();
883 #else
884 title_entry = gtk_entry_new_with_max_length(30);
885 #endif
886 gtk_table_attach(GTK_TABLE(table), title_entry, 1, 6, 0, 1, 474 gtk_table_attach(GTK_TABLE(table), title_entry, 1, 6, 0, 1,
887 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 475 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
888 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); 476 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
889 477
890 label = gtk_label_new(_("Artist:")); 478 label = gtk_label_new(_("Artist:"));
891 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); 479 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
892 gtk_label_set_attributes(GTK_LABEL(label), attrs); 480 gtk_label_set_attributes(GTK_LABEL(label), attrs);
893 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL, 481 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL,
894 GTK_FILL, 5, 5); 482 GTK_FILL, 5, 5);
895 483
896 #ifdef HAVE_ID3LIB
897 artist_entry = gtk_entry_new(); 484 artist_entry = gtk_entry_new();
898 #else
899 artist_entry = gtk_entry_new_with_max_length(30);
900 #endif
901 gtk_table_attach(GTK_TABLE(table), artist_entry, 1, 6, 1, 2, 485 gtk_table_attach(GTK_TABLE(table), artist_entry, 1, 6, 1, 2,
902 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 486 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
903 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); 487 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
904 488
905 label = gtk_label_new(_("Album:")); 489 label = gtk_label_new(_("Album:"));
906 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); 490 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
907 gtk_label_set_attributes(GTK_LABEL(label), attrs); 491 gtk_label_set_attributes(GTK_LABEL(label), attrs);
908 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3, GTK_FILL, 492 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3, GTK_FILL,
909 GTK_FILL, 5, 5); 493 GTK_FILL, 5, 5);
910 494
911 #ifdef HAVE_ID3LIB
912 album_entry = gtk_entry_new(); 495 album_entry = gtk_entry_new();
913 #else
914 album_entry = gtk_entry_new_with_max_length(30);
915 #endif
916 gtk_table_attach(GTK_TABLE(table), album_entry, 1, 6, 2, 3, 496 gtk_table_attach(GTK_TABLE(table), album_entry, 1, 6, 2, 3,
917 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 497 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
918 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); 498 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
919 499
920 label = gtk_label_new(_("Comment:")); 500 label = gtk_label_new(_("Comment:"));
921 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); 501 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
922 gtk_label_set_attributes(GTK_LABEL(label), attrs); 502 gtk_label_set_attributes(GTK_LABEL(label), attrs);
923 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4, GTK_FILL, 503 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4, GTK_FILL,
924 GTK_FILL, 5, 5); 504 GTK_FILL, 5, 5);
925 505
926 #ifdef HAVE_ID3LIB
927 comment_frame = gtk_frame_new(NULL); 506 comment_frame = gtk_frame_new(NULL);
928 gtk_frame_set_shadow_type(GTK_FRAME(comment_frame),GTK_SHADOW_IN); 507 /* gtk_frame_set_shadow_type(GTK_FRAME(comment_frame),GTK_SHADOW_IN); */
929 comment_entry = gtk_text_view_new(); 508 comment_entry = gtk_entry_new();
930 gtk_text_view_set_accepts_tab(GTK_TEXT_VIEW(comment_entry),FALSE);
931 gtk_container_add(GTK_CONTAINER(comment_frame),comment_entry); 509 gtk_container_add(GTK_CONTAINER(comment_frame),comment_entry);
932 gtk_table_attach(GTK_TABLE(table), comment_frame, 1, 6, 3, 4, 510 gtk_table_attach(GTK_TABLE(table), comment_frame, 1, 6, 3, 4,
933 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 511 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
934 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); 512 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
935 #else
936 comment_entry = gtk_entry_new_with_max_length(30);
937 gtk_table_attach(GTK_TABLE(table), comment_entry, 1, 6, 3, 4,
938 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
939 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
940 #endif
941 513
942 label = gtk_label_new(_("Year:")); 514 label = gtk_label_new(_("Year:"));
943 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); 515 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
944 gtk_label_set_attributes(GTK_LABEL(label), attrs); 516 gtk_label_set_attributes(GTK_LABEL(label), attrs);
945 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 4, 5, GTK_FILL, 517 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 4, 5, GTK_FILL,
955 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); 527 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
956 gtk_label_set_attributes(GTK_LABEL(label), attrs); 528 gtk_label_set_attributes(GTK_LABEL(label), attrs);
957 gtk_table_attach(GTK_TABLE(table), label, 2, 3, 4, 5, GTK_FILL, 529 gtk_table_attach(GTK_TABLE(table), label, 2, 3, 4, 5, GTK_FILL,
958 GTK_FILL, 5, 5); 530 GTK_FILL, 5, 5);
959 531
960 #ifdef HAVE_ID3LIB
961 tracknum_box = gtk_hbox_new(FALSE,0);
962 tracknum_entry = gtk_entry_new_with_max_length(2);
963 gtk_entry_set_width_chars(GTK_ENTRY(tracknum_entry),2);
964 totaltracks_entry = gtk_entry_new_with_max_length(2);
965 gtk_entry_set_width_chars(GTK_ENTRY(totaltracks_entry),2);
966 gtk_box_pack_start(GTK_BOX(tracknum_box),
967 tracknum_entry, TRUE, TRUE, 1);
968 gtk_box_pack_start(GTK_BOX(tracknum_box),
969 gtk_label_new(" / "), FALSE, FALSE, 1);
970 gtk_box_pack_start(GTK_BOX(tracknum_box),
971 totaltracks_entry, TRUE, TRUE, 1);
972 gtk_table_attach(GTK_TABLE(table),
973 tracknum_box,
974 3, 4, 4, 5,
975 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
976 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
977
978 #else
979 tracknum_entry = gtk_entry_new_with_max_length(3); 532 tracknum_entry = gtk_entry_new_with_max_length(3);
980 gtk_widget_set_usize(tracknum_entry, 40, -1); 533 gtk_widget_set_usize(tracknum_entry, 40, -1);
981 gtk_table_attach(GTK_TABLE(table), tracknum_entry, 3, 4, 4, 5, 534 gtk_table_attach(GTK_TABLE(table), tracknum_entry, 3, 4, 4, 5,
982 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 535 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
983 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); 536 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
984 #endif
985 537
986 label = gtk_label_new(_("Genre:")); 538 label = gtk_label_new(_("Genre:"));
987 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); 539 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
988 gtk_label_set_attributes(GTK_LABEL(label), attrs); 540 gtk_label_set_attributes(GTK_LABEL(label), attrs);
989 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 5, 6, GTK_FILL, 541 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 5, 6, GTK_FILL,
1012 gtk_hbutton_box_set_layout_default(GTK_BUTTONBOX_SPREAD); 564 gtk_hbutton_box_set_layout_default(GTK_BUTTONBOX_SPREAD);
1013 565
1014 remove_id3 = gtk_button_new_from_stock(GTK_STOCK_DELETE); 566 remove_id3 = gtk_button_new_from_stock(GTK_STOCK_DELETE);
1015 gtk_container_add(GTK_CONTAINER(boxx), remove_id3); 567 gtk_container_add(GTK_CONTAINER(boxx), remove_id3);
1016 568
1017 #if 0
1018 revert = gtk_button_new_from_stock(GTK_STOCK_REVERT_TO_SAVED);
1019 gtk_container_add(GTK_CONTAINER(boxx), revert);
1020 #endif
1021
1022 #ifdef HAVE_ID3LIB
1023 copy_album_tags_but = gtk_button_new_with_label(_("Copy album tags"));
1024 paste_album_tags_but = gtk_button_new_with_label(_("Paste album tags"));
1025
1026 gtk_container_add(GTK_CONTAINER(boxx), copy_album_tags_but);
1027 gtk_container_add(GTK_CONTAINER(boxx), paste_album_tags_but);
1028
1029 g_signal_connect(G_OBJECT(copy_album_tags_but), "clicked",
1030 G_CALLBACK(copy_album_tags), NULL);
1031 g_signal_connect(G_OBJECT(paste_album_tags_but), "clicked",
1032 G_CALLBACK(paste_album_tags), NULL);
1033
1034 gtk_widget_set_sensitive(GTK_WIDGET(paste_album_tags_but), FALSE);
1035 #endif
1036 save = gtk_button_new_from_stock(GTK_STOCK_SAVE); 569 save = gtk_button_new_from_stock(GTK_STOCK_SAVE);
1037 gtk_container_add(GTK_CONTAINER(boxx), save); 570 gtk_container_add(GTK_CONTAINER(boxx), save);
1038 571
1039 g_signal_connect(G_OBJECT(remove_id3), "clicked", 572 g_signal_connect(G_OBJECT(remove_id3), "clicked",
1040 G_CALLBACK(remove_id3_cb), save); 573 G_CALLBACK(remove_id3_cb), save);
1041 g_signal_connect(G_OBJECT(save), "clicked", G_CALLBACK(save_cb), 574 g_signal_connect(G_OBJECT(save), "clicked", G_CALLBACK(save_cb),
1042 remove_id3); 575 remove_id3);
1043 #if 0
1044 g_signal_connect(G_OBJECT(revert), "clicked", G_CALLBACK(fill_entries),
1045 NULL);
1046 #endif
1047
1048 576
1049 gtk_table_attach(GTK_TABLE(table), boxx, 0, 5, 6, 7, GTK_FILL, 0, 577 gtk_table_attach(GTK_TABLE(table), boxx, 0, 5, 6, 7, GTK_FILL, 0,
1050 0, 8); 578 0, 8);
1051 579
1052 bbox = gtk_hbutton_box_new(); 580 bbox = gtk_hbutton_box_new();
1073 G_CALLBACK(change_buttons), save); 601 G_CALLBACK(change_buttons), save);
1074 g_signal_connect_swapped(G_OBJECT(album_entry), "changed", 602 g_signal_connect_swapped(G_OBJECT(album_entry), "changed",
1075 G_CALLBACK(change_buttons), save); 603 G_CALLBACK(change_buttons), save);
1076 g_signal_connect_swapped(G_OBJECT(year_entry), "changed", 604 g_signal_connect_swapped(G_OBJECT(year_entry), "changed",
1077 G_CALLBACK(change_buttons), save); 605 G_CALLBACK(change_buttons), save);
1078 #ifdef HAVE_ID3LIB
1079 g_signal_connect_swapped(G_OBJECT(gtk_text_view_get_buffer(GTK_TEXT_VIEW(comment_entry))), "changed",
1080 G_CALLBACK(change_buttons), save);
1081 g_signal_connect_swapped(G_OBJECT(totaltracks_entry), "changed",
1082 G_CALLBACK(change_buttons), save);
1083 #else
1084 g_signal_connect_swapped(G_OBJECT(comment_entry), "changed", 606 g_signal_connect_swapped(G_OBJECT(comment_entry), "changed",
1085 G_CALLBACK(change_buttons), save); 607 G_CALLBACK(change_buttons), save);
1086 #endif
1087 g_signal_connect_swapped(G_OBJECT(tracknum_entry), "changed", 608 g_signal_connect_swapped(G_OBJECT(tracknum_entry), "changed",
1088 G_CALLBACK(change_buttons), save); 609 G_CALLBACK(change_buttons), save);
1089 g_signal_connect_swapped(G_OBJECT(GTK_COMBO(genre_combo)->entry), "changed", 610 g_signal_connect_swapped(G_OBJECT(GTK_COMBO(genre_combo)->entry), "changed",
1090 G_CALLBACK(change_buttons), save); 611 G_CALLBACK(change_buttons), save);
1091 612
1125 646
1126 gtk_entry_set_text(GTK_ENTRY(artist_entry), ""); 647 gtk_entry_set_text(GTK_ENTRY(artist_entry), "");
1127 gtk_entry_set_text(GTK_ENTRY(album_entry), ""); 648 gtk_entry_set_text(GTK_ENTRY(album_entry), "");
1128 gtk_entry_set_text(GTK_ENTRY(year_entry), ""); 649 gtk_entry_set_text(GTK_ENTRY(year_entry), "");
1129 gtk_entry_set_text(GTK_ENTRY(tracknum_entry), ""); 650 gtk_entry_set_text(GTK_ENTRY(tracknum_entry), "");
1130 #ifdef HAVE_ID3LIB
1131 gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(comment_entry)),"",-1);
1132 #else
1133 gtk_entry_set_text(GTK_ENTRY(comment_entry), ""); 651 gtk_entry_set_text(GTK_ENTRY(comment_entry), "");
1134 #endif
1135 gtk_list_select_item(GTK_LIST(GTK_COMBO(genre_combo)->list), 652 gtk_list_select_item(GTK_LIST(GTK_COMBO(genre_combo)->list),
1136 g_list_index(genre_list, "")); 653 g_list_index(genre_list, ""));
1137 654
1138 gtk_label_set_text(GTK_LABEL(mpeg_level), _("MPEG Level:")); 655 gtk_label_set_text(GTK_LABEL(mpeg_level), _("MPEG Level:"));
1139 gtk_label_set_text(GTK_LABEL(mpeg_level_val), _("N/A")); 656 gtk_label_set_text(GTK_LABEL(mpeg_level_val), _("N/A"));
1174 vfs_is_writeable(filename)); 691 vfs_is_writeable(filename));
1175 692
1176 fill_entries(NULL, NULL); 693 fill_entries(NULL, NULL);
1177 694
1178 gtk_widget_set_sensitive(GTK_WIDGET(save), FALSE); 695 gtk_widget_set_sensitive(GTK_WIDGET(save), FALSE);
1179 #if 0
1180 gtk_widget_set_sensitive(GTK_WIDGET(revert), FALSE);
1181 #endif
1182 gtk_widget_show_all(window); 696 gtk_widget_show_all(window);
1183 } 697 }
1184
1185 #ifdef HAVE_ID3LIB
1186 698
1187 void 699 void
1188 fill_entries(GtkWidget * w, gpointer data) 700 fill_entries(GtkWidget * w, gpointer data)
1189 { 701 {
1190 VFSFile *fh; 702 VFSFile *fh;
1191 ID3Tag * id3tag;
1192 703
1193 if (str_has_prefix_nocase(current_filename, "http://")) 704 if (str_has_prefix_nocase(current_filename, "http://"))
1194 return; 705 return;
1195 706
1196 id3tag = ID3Tag_New(); 707 taglib_file = taglib_file_new(current_filename);
1197 ID3Tag_LinkPreferV2(id3tag, current_filename); 708 if(taglib_file) {
1198 709 taglib_tag = taglib_file_tag(taglib_file);
1199 id3v2_frame_to_entry(title_entry, id3tag, ID3FID_TITLE); 710 taglib_ap = taglib_file_audioproperties(taglib_file);
1200 id3v2_frame_to_entry(artist_entry, id3tag, ID3FID_LEADARTIST); 711 } else return;
1201 id3v2_frame_to_entry(album_entry, id3tag, ID3FID_ALBUM); 712
1202 id3v2_frame_to_text_view(comment_entry, id3tag, ID3FID_COMMENT); 713 gtk_entry_set_text(GTK_ENTRY(title_entry), taglib_tag_title(taglib_tag));
1203 id3v2_frame_to_entry(year_entry, id3tag, ID3FID_YEAR); 714 gtk_entry_set_text(GTK_ENTRY(artist_entry), taglib_tag_artist(taglib_tag));
1204 id3v2_tracknum_to_entries(tracknum_entry, totaltracks_entry, id3tag); 715 gtk_entry_set_text(GTK_ENTRY(album_entry), taglib_tag_album(taglib_tag));
1205 { 716 gtk_entry_set_text(GTK_ENTRY(comment_entry), taglib_tag_comment(taglib_tag));
1206 ID3Frame * frame = ID3Tag_FindFrameWithID(id3tag, ID3FID_CONTENTTYPE); 717 gtk_entry_set_text(GTK_ENTRY(year_entry), (gchar*)taglib_tag_year(taglib_tag));
1207 718 gtk_entry_set_text(GTK_ENTRY(tracknum_entry), (gchar*)taglib_tag_track(taglib_tag));
1208 if (frame) { 719 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(genre_combo)->entry), taglib_tag_genre(taglib_tag));
1209 int genre_idx = -1; 720
1210 char genre[64]; 721 gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE);
1211 const char * genre2; 722 gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE);
1212 ID3Field * text_field = ID3Frame_GetField(frame,ID3FN_TEXT); 723
1213 ID3Field_GetASCII(text_field,genre,64); 724 taglib_file_free(taglib_file);
1214 725 taglib_tag_free_strings();
1215 /* attempt to find corresponding genre */
1216 g_strstrip(genre);
1217 sscanf(genre,"(%d)",&genre_idx);
1218 if ((genre2 = ID3_V1GENRE2DESCRIPTION(genre_idx)))
1219 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(genre_combo)->entry),
1220 genre2);
1221 }
1222 }
1223
1224 gtk_widget_set_sensitive(GTK_WIDGET(remove_id3), TRUE); 726 gtk_widget_set_sensitive(GTK_WIDGET(remove_id3), TRUE);
1225 gtk_widget_set_sensitive(GTK_WIDGET(save), FALSE); 727 gtk_widget_set_sensitive(GTK_WIDGET(save), FALSE);
1226
1227 update_paste_sensitive();
1228
1229 ID3Tag_Delete(id3tag);
1230 728
1231 if ((fh = vfs_fopen(current_filename, "rb")) != NULL) { 729 if ((fh = vfs_fopen(current_filename, "rb")) != NULL) {
1232 guint32 head; 730 guint32 head;
1233 guchar tmp[4]; 731 guchar tmp[4];
1234 struct frame frm; 732 struct frame frm;
1293 vfs_fclose(fh); 791 vfs_fclose(fh);
1294 } 792 }
1295 793
1296 } 794 }
1297 795
1298 #else /* ! HAVE_ID3LIB */
1299
1300 void
1301 fill_entries(GtkWidget * w, gpointer data)
1302 {
1303 if ((fh = vfs_fopen(current_filename, "rb")) != NULL) {
1304 guint32 head;
1305 guchar tmp[4];
1306 struct frame frm;
1307 gboolean id3_found = FALSE;
1308
1309 vfs_fseek(fh, -sizeof(tag), SEEK_END);
1310 if (vfs_fread(&tag, 1, sizeof(tag), fh) == sizeof(tag)) {
1311 if (!strncmp(tag.tag, "TAG", 3)) {
1312 id3_found = TRUE;
1313 set_entry_tag(GTK_ENTRY(title_entry), tag.title, 30);
1314 set_entry_tag(GTK_ENTRY(artist_entry), tag.artist, 30);
1315 set_entry_tag(GTK_ENTRY(album_entry), tag.album, 30);
1316 set_entry_tag(GTK_ENTRY(year_entry), tag.year, 4);
1317 /* Check for v1.1 tags */
1318 if (tag.u.v1_1.__zero == 0) {
1319 gchar *temp =
1320 g_strdup_printf("%d", tag.u.v1_1.track_number);
1321 set_entry_tag(GTK_ENTRY(comment_entry),
1322 tag.u.v1_1.comment, 28);
1323 gtk_entry_set_text(GTK_ENTRY(tracknum_entry), temp);
1324 g_free(temp);
1325 }
1326 else {
1327 set_entry_tag(GTK_ENTRY(comment_entry),
1328 tag.u.v1_0.comment, 30);
1329 gtk_entry_set_text(GTK_ENTRY(tracknum_entry), "");
1330 }
1331
1332 gtk_list_select_item(GTK_LIST
1333 (GTK_COMBO(genre_combo)->list),
1334 g_list_index(genre_list, (gchar *)
1335 mpg123_id3_genres[tag.
1336 genre]));
1337 gtk_widget_set_sensitive(GTK_WIDGET(remove_id3), TRUE);
1338 gtk_widget_set_sensitive(GTK_WIDGET(save), FALSE);
1339 #if 0
1340 gtk_widget_set_sensitive(GTK_WIDGET(revert), FALSE);
1341 #endif
1342 }
1343 else {
1344 gtk_entry_set_text(GTK_ENTRY(title_entry), "");
1345 gtk_entry_set_text(GTK_ENTRY(artist_entry), "");
1346 gtk_entry_set_text(GTK_ENTRY(album_entry), "");
1347 gtk_entry_set_text(GTK_ENTRY(comment_entry), "");
1348 gtk_entry_set_text(GTK_ENTRY(year_entry), "");
1349 gtk_entry_set_text(GTK_ENTRY(album_entry), "");
1350 gtk_entry_set_text(GTK_ENTRY(tracknum_entry), "");
1351 gtk_widget_set_sensitive(GTK_WIDGET(remove_id3), FALSE);
1352 gtk_widget_set_sensitive(GTK_WIDGET(save), FALSE);
1353 #if 0
1354 gtk_widget_set_sensitive(GTK_WIDGET(revert), FALSE);
1355 #endif
1356 }
1357 }
1358 vfs_rewind(fh);
1359 if (vfs_fread(tmp, 1, 4, fh) != 4) {
1360 vfs_fclose(fh);
1361 return;
1362 }
1363 head =
1364 ((guint32) tmp[0] << 24) | ((guint32) tmp[1] << 16) |
1365 ((guint32) tmp[2] << 8) | (guint32) tmp[3];
1366 while (!mpg123_head_check(head)) {
1367 head <<= 8;
1368 if (vfs_fread(tmp, 1, 1, fh) != 1) {
1369 vfs_fclose(fh);
1370 return;
1371 }
1372 head |= tmp[0];
1373 }
1374 if (mpg123_decode_header(&frm, head)) {
1375 guchar *buf;
1376 gdouble tpf;
1377 gint pos;
1378 xing_header_t xing_header;
1379 guint32 num_frames;
1380
1381 buf = g_malloc(frm.framesize + 4);
1382 vfs_fseek(fh, -4, SEEK_CUR);
1383 vfs_fread(buf, 1, frm.framesize + 4, fh);
1384 tpf = mpg123_compute_tpf(&frm);
1385 set_mpeg_level_label(frm.mpeg25, frm.lsf, frm.lay);
1386 pos = vfs_ftell(fh);
1387 vfs_fseek(fh, 0, SEEK_END);
1388 if (mpg123_get_xing_header(&xing_header, buf)) {
1389 num_frames = xing_header.frames;
1390 label_set_text(mpeg_bitrate_val,
1391 _("Variable,\navg. bitrate: %d KBit/s"),
1392 (gint) ((xing_header.bytes * 8) /
1393 (tpf * xing_header.frames * 1000)));
1394 }
1395 else {
1396 num_frames =
1397 ((vfs_ftell(fh) - pos -
1398 (id3_found ? 128 : 0)) / mpg123_compute_bpf(&frm)) + 1;
1399 label_set_text(mpeg_bitrate_val, _("%d KBit/s"),
1400 tabsel_123[frm.lsf][frm.lay -
1401 1][frm.bitrate_index]);
1402 }
1403 label_set_text(mpeg_samplerate_val, _("%ld Hz"),
1404 mpg123_freqs[frm.sampling_frequency]);
1405 label_set_text(mpeg_error_val, _("%s"),
1406 bool_label[frm.error_protection]);
1407 label_set_text(mpeg_copy_val, _("%s"), bool_label[frm.copyright]);
1408 label_set_text(mpeg_orig_val, _("%s"), bool_label[frm.original]);
1409 label_set_text(mpeg_emph_val, _("%s"), emphasis[frm.emphasis]);
1410 label_set_text(mpeg_frames_val, _("%d"), num_frames);
1411 label_set_text(mpeg_filesize_val, _("%lu Bytes"), vfs_ftell(fh));
1412 label_set_text(mpeg_flags_val, _("%s"), channel_mode_name(frm.mode));
1413 g_free(buf);
1414 }
1415 vfs_fclose(fh);
1416 }
1417 }
1418
1419 #endif