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

📄 playlist.c

📁 Aqualung is an advanced music player primarily targeted for the GNU/Linux operating system, but als
💻 C
📖 第 1 页 / 共 5 页
字号:
}#ifdef HAVE_IFPvoidplist__send_songs_to_iriver_cb(gpointer data) {        aifp_transfer_files();}#endif /* HAVE_IFP */voidplist__fileinfo_cb(gpointer data) {	GtkTreeIter dummy;	show_file_info(fileinfo_name, fileinfo_file, 0, NULL, dummy);}voidplist__search_cb(gpointer data) {		search_playlist_dialog();}static gbooleanadd_cb(GtkWidget * widget, GdkEvent * event) {        if (event->type == GDK_BUTTON_PRESS) {                GdkEventButton * bevent = (GdkEventButton *) event;                if (bevent->button == 3) {			gtk_menu_popup(GTK_MENU(add_menu), NULL, NULL, NULL, NULL,				       bevent->button, bevent->time);			return TRUE;		}		return FALSE;	}	return FALSE;}static gbooleansel_cb(GtkWidget * widget, GdkEvent * event) {        if (event->type == GDK_BUTTON_PRESS) {                GdkEventButton * bevent = (GdkEventButton *) event;                if (bevent->button == 3) {			gtk_menu_popup(GTK_MENU(sel_menu), NULL, NULL, NULL, NULL,				       bevent->button, bevent->time);			return TRUE;		}		return FALSE;	}	return FALSE;}static gbooleanrem_cb(GtkWidget * widget, GdkEvent * event) {        if (event->type == GDK_BUTTON_PRESS) {                GdkEventButton * bevent = (GdkEventButton *) event;                if (bevent->button == 3) {			gtk_menu_popup(GTK_MENU(rem_menu), NULL, NULL, NULL, NULL,				       bevent->button, bevent->time);			return TRUE;		}		return FALSE;	}	return FALSE;}/* physical_name should be UTF8 encoded *//* if alt_name != NULL, it will be used as title if no meta is found */playlist_filemeta *playlist_filemeta_get(char * physical_name, char * alt_name, int composit) {	char display_name[MAXLEN];	char artist_name[MAXLEN];	char record_name[MAXLEN];	char track_name[MAXLEN];	metadata * meta = NULL;	int use_meta = 0;	gchar * substr;#if defined(HAVE_MOD) && (defined(HAVE_LIBZ) || defined(HAV_LIBBZ2))        gchar * pos;#endif /* (HAVE_MOD && (HAVE_LIBZ || HAVE_LIBBZ2)) */#ifdef HAVE_MOD        if (is_valid_mod_extension(physical_name)) {                composit = 0;        }#ifdef HAVE_LIBZ	        if ((pos = strrchr(physical_name, '.')) != NULL) {                pos++;                if (!strcasecmp(pos, "gz")) {                    composit = 0;                }#ifdef HAVE_LIBBZ2                if (!strcasecmp(pos, "bz2")) {                    composit = 0;                }#endif /* HAVE LIBBZ2 */        }#endif /* HAVE LIBZ */#endif /* HAVE_MOD */	playlist_filemeta * plfm = calloc(1, sizeof(playlist_filemeta));	if (!plfm) {		fprintf(stderr, "calloc error in playlist_filemeta_get()\n");		return NULL;	}	if ((plfm->duration = get_file_duration(physical_name)) <= 0.0f) {		return NULL;	}	if (options.rva_is_enabled) {		meta = meta_new();		if (meta_read(meta, physical_name)) {			if (!meta_get_rva(meta, &(plfm->voladj))) {				plfm->voladj = 0.0f;			}		} else {			plfm->voladj = 0.0f;		}		meta_free(meta);		meta = NULL;	} else {		plfm->voladj = 0.0f;	}		artist_name[0] = '\0';	record_name[0] = '\0';	track_name[0] = '\0';	if (options.auto_use_ext_meta_artist ||	    options.auto_use_ext_meta_record ||	    options.auto_use_ext_meta_track) {				meta = meta_new();		if (!meta_read(meta, physical_name)) {			meta_free(meta);			meta = NULL;		}	}		use_meta = 0;	if ((meta != NULL) && options.auto_use_ext_meta_artist) {		meta_get_artist(meta, artist_name);		if (artist_name[0] != '\0') {			use_meta = 1;		}	}		if ((meta != NULL) && options.auto_use_ext_meta_record) {		meta_get_record(meta, record_name);		if (record_name[0] != '\0') {			use_meta = 1;		}	}		if ((meta != NULL) && options.auto_use_ext_meta_track) {		meta_get_title(meta, track_name);		if (track_name[0] != '\0') {			use_meta = 1;		}	}		if ((artist_name[0] != '\0') ||	    (record_name[0] != '\0') ||	    (track_name[0] != '\0')) {				if (artist_name[0] == '\0') {			strcpy(artist_name, _("Unknown"));		}		if (record_name[0] == '\0') {			strcpy(record_name, _("Unknown"));		}		if (track_name[0] == '\0') {			strcpy(track_name, _("Unknown"));		}	} else {		use_meta = 0;	}		if (use_meta && (meta != NULL)) {		if (composit) {			make_title_string(display_name, options.title_format,					  artist_name, record_name, track_name);		} else {			strncpy(display_name, track_name, MAXLEN-1);		}	} else {		if (alt_name != NULL) {			strcpy(display_name, alt_name);		} else {    			if ((substr = strrchr(physical_name, '/')) == NULL)            			substr = physical_name;    			else            			++substr;			substr = g_filename_display_name(substr);			strcpy(display_name, substr);			g_free(substr);		} 	}	if (meta != NULL) {		meta_free(meta);		meta = NULL;	}	plfm->title = strdup(display_name);	return plfm;}voidplaylist_filemeta_free(playlist_filemeta * plfm) {	free(plfm->title);	free(plfm);}voidadd_file_to_playlist(gchar *filename) {	char voladj_str[32];	char duration_str[MAXLEN];	GtkTreeIter play_iter;	playlist_filemeta * plfm = NULL;	if ((plfm = playlist_filemeta_get(filename, NULL, 1)) == NULL) {		return;	}        voladj2str(plfm->voladj, voladj_str);        time2time(plfm->duration, duration_str);        gtk_tree_store_append(play_store, &play_iter, NULL);        gtk_tree_store_set(play_store, &play_iter, 0, plfm->title, 1, filename,                           2, pl_color_inactive,                           3, plfm->voladj, 4, voladj_str,                           5, plfm->duration, 6, duration_str, 7, PANGO_WEIGHT_NORMAL, -1);	playlist_filemeta_free(plfm);}static intfilter(const struct dirent * de) {	return de->d_name[0] != '.';}voidadd_dir_to_playlist(char * dirname) {	int i;	struct dirent ** ent;	struct stat st_file;	char path[MAXLEN];	for (i = 0; i < scandir(dirname, &ent, filter, alphasort); i++) {		snprintf(path, MAXLEN-1, "%s/%s", dirname, ent[i]->d_name);		if (stat(path, &st_file) == -1) {			continue;		}		if (S_ISDIR(st_file.st_mode)) {			add_dir_to_playlist(path);		} else {			add_file_to_playlist(path);		}	}}voidadd_files(GtkWidget * widget, gpointer data) {        GtkWidget *dialog;        dialog = gtk_file_chooser_dialog_new(_("Select files"),                                              options.playlist_is_embedded ? GTK_WINDOW(main_window) : GTK_WINDOW(playlist_window),                                              GTK_FILE_CHOOSER_ACTION_OPEN,                                             GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,                                              GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,                                              NULL);        deflicker();        gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);        gtk_window_set_default_size(GTK_WINDOW(dialog), 580, 390);        gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);        gtk_file_chooser_select_filename(GTK_FILE_CHOOSER(dialog), options.currdir);        assign_audio_fc_filters(GTK_FILE_CHOOSER(dialog));        gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);	if (options.show_hidden) {		gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(dialog), TRUE);	}        if (aqualung_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {		GSList *lfiles, *node;                strncpy(options.currdir, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)),			MAXLEN-1);                lfiles = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog));                node = lfiles;                while (node) {                        add_file_to_playlist((char *)node->data);                        g_free(node->data);                        node = node->next;                }                g_slist_free(lfiles);        }        gtk_widget_destroy(dialog);	playlist_content_changed();        delayed_playlist_rearrange(100);}voidadd_directory(GtkWidget * widget, gpointer data) {        GtkWidget *dialog;        dialog = gtk_file_chooser_dialog_new(_("Select directory"),                                              options.playlist_is_embedded ? GTK_WINDOW(main_window) : GTK_WINDOW(playlist_window), 					     GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,                                             GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,                                              GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,                                              NULL);        deflicker();        gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);        gtk_window_set_default_size(GTK_WINDOW(dialog), 580, 390);        gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);        gtk_file_chooser_select_filename(GTK_FILE_CHOOSER(dialog), options.currdir);        gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);	if (options.show_hidden) {		gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(dialog), TRUE);	}        if (aqualung_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {		char dirname[MAXLEN];                strncpy(options.currdir, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)),			MAXLEN-1);                strncpy(dirname, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)),			MAXLEN-1);		add_dir_to_playlist(dirname);        }        gtk_widget_destroy(dialog);	playlist_content_changed();        delayed_playlist_rearrange(100);}voidadd__files_cb(gpointer data) {	add_files(NULL, NULL);}voidadd__dir_cb(gpointer data) {	add_directory(NULL, NULL);}voidselect_all(GtkWidget * widget, gpointer data) {	gtk_tree_selection_select_all(play_select);}voidsel__all_cb(gpointer data) {	select_all(NULL, NULL);}voidsel__none_cb(gpointer data) {	gtk_tree_selection_unselect_all(play_select);}voidinvert_item_selection(GtkTreeIter * piter) {	if (gtk_tree_selection_iter_is_selected(play_select, piter)) {		gtk_tree_selection_unselect_iter(play_select, piter);	} else {		gtk_tree_selection_select_iter(play_select, piter);	}}voidsel__inv_cb(gpointer data) {	GtkTreeIter iter;	int i = 0;	while (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(play_store), &iter, NULL, i++)) {		GtkTreeIter iter_child;		int j = 0;		invert_item_selection(&iter);		while (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(play_store), &iter_child, &iter, j++)) {			invert_item_selection(&iter_child);		}	}}voidrem__all_cb(gpointer data) {	gtk_tree_store_clear(play_store);        playlist_content_changed();}voidrem__sel_cb(gpointer data) {	GtkTreeIter iter;	int i = 0, old_pos = 0, old_pos_child = -1;        GtkTreePath * visible_path;	while (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(play_store), &iter, NULL, i++)) {		GtkTreeIter iter_child;		int j = 0;		int modified = 0;		char * str;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -