⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileinfo.c

📁 xmms-1.2.10.tar.gz学习使用的就下吧
💻 C
📖 第 1 页 / 共 2 页
字号:
/*  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 + -