Mercurial > audlegacy
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 |