📄 fileinfo.c
字号:
/* XMMS - Cross-platform multimedia player * Copyright (C) 1998-2002 Peter Alm, Mikael Alm, Olle Hallnas, * Thomas Nilsson and 4Front Technologies * Copyright (C) 1999-2004 Haavard Kvaalen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdarg.h>#include <string.h>#include <errno.h>#include <libxmms/xentry.h>#include "mpg123.h"static GtkWidget *window = NULL;static GtkWidget *filename_entry, *id3_frame;static GtkWidget *title_entry, *artist_entry, *album_entry, *year_entry;static GtkWidget *tracknum_entry, *comment_entry, *genre_combo;static GtkWidget *mpeg_level, *mpeg_bitrate, *mpeg_samplerate, *mpeg_flags;static GtkWidget *mpeg_fileinfo;static GList *genre_list;struct genre_item { const char *name; int id;};static int current_genre;static char *current_filename;extern char *mpg123_filename;extern int mpg123_bitrate, mpg123_frequency, mpg123_layer, mpg123_lsf, mpg123_mode;extern gboolean mpg123_stereo, mpg123_mpeg25;#define MAX_STR_LEN 100static void label_set_text(GtkWidget * label, char *str, ...)G_GNUC_PRINTF(2, 3);static void set_entry_tag(GtkEntry * entry, char * tag, int length){ int stripped_len; char *text; stripped_len = mpg123_strip_spaces(tag, length); text = g_strdup_printf("%-*.*s", stripped_len, stripped_len, tag); gtk_entry_set_text(entry, text); g_free(text);}static void get_entry_tag(GtkEntry * entry, char * tag, int length){ strncpy(tag, gtk_entry_get_text(entry), length);}static int genre_find_index(GList *genre_list, int id){ int idx = 0; while (genre_list) { struct genre_item *item = genre_list->data; if (item->id == id) break; idx++; genre_list = genre_list->next; } return idx;}static int genre_comp_func(gconstpointer a, gconstpointer b){ const struct genre_item *ga = a, *gb = b; return strcasecmp(ga->name, gb->name);}static void save_cb(GtkWidget * w, gpointer data){ int fd; struct id3v1tag_t tag; char *msg = NULL; if (!strncasecmp(current_filename, "http://", 7)) return; if ((fd = open(current_filename, O_RDWR)) != -1) { int tracknum; lseek(fd, -128, SEEK_END); read(fd, &tag, sizeof (struct id3v1tag_t)); if (!strncmp(tag.tag, "TAG", 3)) lseek(fd, -128, SEEK_END); else lseek(fd, 0, SEEK_END); tag.tag[0] = 'T'; tag.tag[1] = 'A'; tag.tag[2] = 'G'; get_entry_tag(GTK_ENTRY(title_entry), tag.title, 30); get_entry_tag(GTK_ENTRY(artist_entry), tag.artist, 30); get_entry_tag(GTK_ENTRY(album_entry), tag.album, 30); get_entry_tag(GTK_ENTRY(year_entry), tag.year, 4); tracknum = atoi(gtk_entry_get_text(GTK_ENTRY(tracknum_entry))); if (tracknum > 0) { get_entry_tag(GTK_ENTRY(comment_entry), tag.u.v1_1.comment, 28); tag.u.v1_1.__zero = 0; tag.u.v1_1.track_number = MIN(tracknum, 255); } else get_entry_tag(GTK_ENTRY(comment_entry), tag.u.v1_0.comment, 30); tag.genre = current_genre; if (write(fd, &tag, sizeof (tag)) != sizeof (tag)) msg = g_strdup_printf(_("%s\nUnable to write to file: %s"), _("Couldn't write tag!"), strerror(errno)); close(fd); } else msg = g_strdup_printf(_("%s\nUnable to open file: %s"), _("Couldn't write tag!"), strerror(errno)); if (msg) { GtkWidget *mwin = xmms_show_message(_("File Info"), msg, _("Ok"), FALSE, NULL, NULL); gtk_window_set_transient_for(GTK_WINDOW(mwin), GTK_WINDOW(window)); g_free(msg); } else gtk_widget_destroy(window);}static void label_set_text(GtkWidget * label, char *str, ...){ va_list args; char tempstr[MAX_STR_LEN]; va_start(args, str); g_vsnprintf(tempstr, MAX_STR_LEN, str, args); va_end(args); gtk_label_set_text(GTK_LABEL(label), tempstr);}static void remove_id3_cb(GtkWidget * w, gpointer data){ int fd, len; struct id3v1tag_t tag; char *msg = NULL; if (!strncasecmp(current_filename, "http://", 7)) return; if ((fd = open(current_filename, O_RDWR)) != -1) { len = lseek(fd, -128, SEEK_END); read(fd, &tag, sizeof (struct id3v1tag_t)); if (!strncmp(tag.tag, "TAG", 3)) { if (ftruncate(fd, len)) msg = g_strdup_printf( _("%s\n" "Unable to truncate file: %s"), _("Couldn't remove tag!"), strerror(errno)); } else msg = strdup(_("No tag to remove!")); close(fd); } else msg = g_strdup_printf(_("%s\nUnable to open file: %s"), _("Couldn't remove tag!"), strerror(errno)); if (msg) { GtkWidget *mwin = xmms_show_message(_("File Info"), msg, _("Ok"), FALSE, NULL, NULL); gtk_window_set_transient_for(GTK_WINDOW(mwin), GTK_WINDOW(window)); g_free(msg); } else gtk_widget_destroy(window);}static void set_mpeg_level_label(gboolean mpeg25, int lsf, int layer){ if (mpeg25) label_set_text(mpeg_level, "MPEG 2.5, layer %d", layer); else label_set_text(mpeg_level, "MPEG %d, layer %d", lsf + 1, layer);}static char* channel_mode_name(int mode){ static const char *channel_mode[] = {N_("Stereo"), N_("Joint stereo"), N_("Dual channel"), N_("Single channel")}; if (mode < 0 || mode > 3) return ""; return gettext(channel_mode[mode]);}static void file_info_http(char *filename){ gtk_widget_set_sensitive(id3_frame, FALSE); if (mpg123_filename && !strcmp(filename, mpg123_filename) && mpg123_bitrate != 0) { set_mpeg_level_label(mpg123_mpeg25, mpg123_lsf, mpg123_layer); label_set_text(mpeg_bitrate, _("Bitrate: %d kb/s"), mpg123_bitrate); label_set_text(mpeg_samplerate, _("Samplerate: %d Hz"), mpg123_frequency); label_set_text(mpeg_flags, "%s", channel_mode_name(mpg123_mode)); }}static void genre_selected(GtkList *list, GtkWidget *w, gpointer data){ void * p; p = gtk_object_get_data(GTK_OBJECT(w), "genre_id"); if (p != NULL) current_genre = GPOINTER_TO_INT(p); else current_genre = 0;}static void genre_set_popdown(GtkWidget *combo, GList *genres){ struct genre_item *item; GtkWidget *w; while (genres) { item = genres->data; w = gtk_list_item_new_with_label(item->name); gtk_object_set_data(GTK_OBJECT(w), "genre_id", GINT_TO_POINTER(item->id)); gtk_widget_show(w); gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list), w); genres = genres->next; }}void mpg123_file_info_box(char *filename){ int i; struct id3v1tag_t tag; FILE *fh; char *tmp, *title; const char *emphasis[4]; const char *bool_label[2]; emphasis[0] = _("None"); emphasis[1] = _("50/15 ms"); emphasis[2] = ""; emphasis[3] = _("CCIT J.17"); bool_label[0] = _("No"); bool_label[1] = _("Yes"); if (!window) { GtkWidget *vbox, *hbox, *left_vbox, *table; GtkWidget *mpeg_frame, *mpeg_box; GtkWidget *label, *filename_hbox; GtkWidget *bbox, *save, *remove_id3, *cancel; window = gtk_window_new(GTK_WINDOW_DIALOG); gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE); gtk_signal_connect(GTK_OBJECT(window), "destroy", gtk_widget_destroyed, &window); gtk_container_set_border_width(GTK_CONTAINER(window), 10); vbox = gtk_vbox_new(FALSE, 10); gtk_container_add(GTK_CONTAINER(window), vbox); filename_hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), filename_hbox, FALSE, TRUE, 0); label = gtk_label_new(_("Filename:")); gtk_box_pack_start(GTK_BOX(filename_hbox), label, FALSE, TRUE, 0); filename_entry = xmms_entry_new(); gtk_editable_set_editable(GTK_EDITABLE(filename_entry), FALSE); gtk_box_pack_start(GTK_BOX(filename_hbox),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -