changeset 2433:60936e29c803

reworked cdaudio-ng to avoid gui blockings as much as possible; the plugin now handles cdda:// URL by adding the whole cd to the playlist - to be used with -e argument from command line; the 'no cd' dialog may be broken
author Calin Crisan ccrisan@gmail.com
date Fri, 07 Mar 2008 18:45:36 +0200
parents db80c2fc0b57
children 3bbc5053e9b4
files src/cdaudio-ng/cdaudio-ng.c src/cdaudio-ng/cdaudio-ng.h
diffstat 2 files changed, 101 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
--- a/src/cdaudio-ng/cdaudio-ng.c	Thu Mar 06 22:58:28 2008 +0300
+++ b/src/cdaudio-ng/cdaudio-ng.c	Fri Mar 07 18:45:36 2008 +0200
@@ -51,14 +51,16 @@
 cdng_cfg_t				cdng_cfg;
 static gint				firsttrackno = -1;
 static gint				lasttrackno = -1;
-static CdIo_t				*pcdio = NULL;
-static trackinfo_t			*trackinfo = NULL;
-static gboolean				is_paused = FALSE;
+static CdIo_t			*pcdio = NULL;
+static trackinfo_t		*trackinfo = NULL;
+static gboolean			is_paused = FALSE;
 static gint				playing_track = -1;
-static dae_params_t			*pdae_params = NULL;
-static InputPlayback			*pglobalinputplayback = NULL;
-static GtkWidget			*main_menu_item, *playlist_menu_item;
-static GThread				*scan_cd_thread = NULL;
+static dae_params_t		*pdae_params = NULL;
+static InputPlayback	*pglobalinputplayback = NULL;
+static GtkWidget		*main_menu_item, *playlist_menu_item;
+static GThread			*scan_cd_thread = NULL;
+static int				first_trackno_to_add_after_scan = -1;
+static int				last_trackno_to_add_after_scan = -1;
 
 static void			cdaudio_init(void);
 static void			cdaudio_about(void);
@@ -73,13 +75,16 @@
 static gint			cdaudio_set_volume(gint l, gint r);
 static void			cdaudio_cleanup(void);
 static void			cdaudio_get_song_info(gchar *filename, gchar **title, gint *length);
-static Tuple			*cdaudio_get_song_tuple(gchar *filename);
+static Tuple		*cdaudio_get_song_tuple(gchar *filename);
 
 static void			menu_click(void);
-static Tuple			*create_tuple_from_trackinfo_and_filename(gchar *filename);
+static Tuple		*create_tuple_from_trackinfo_and_filename(gchar *filename);
 static void			dae_play_loop(dae_params_t *pdae_params);
 static void			*scan_cd(void *nothing);
-static void			scan_cd_threaded();
+static void			scan_cd_threaded(int firsttrackno, int lasttrackno);
+static void			append_track_to_playlist(int trackno);
+static gboolean		show_noaudiocd_info(gpointer data);
+static void			show_noaudiocd_info_safe();
 static gint			calculate_track_length(gint startlsn, gint endlsn);
 static gint			find_trackno_from_filename(gchar *filename);
 static void			cleanup_on_error(void);
@@ -91,7 +96,6 @@
 	.about = cdaudio_about,
 	.configure = cdaudio_configure,
 	.is_our_file = cdaudio_is_our_file,
-//	.scan_cd = cdaudio_scan_cd,
 	.play_file = cdaudio_play_file,
 	.stop = cdaudio_stop,
 	.pause = cdaudio_pause,
@@ -196,13 +200,13 @@
 	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(main_menu_item), gtk_image_new_from_stock(GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU));
 	gtk_widget_show(main_menu_item);
 	audacious_menu_plugin_item_add(AUDACIOUS_MENU_MAIN, main_menu_item);
-	g_signal_connect(G_OBJECT(main_menu_item), "button_press_event", G_CALLBACK(menu_click), NULL);
+	g_signal_connect(G_OBJECT(main_menu_item), "activate", G_CALLBACK(menu_click), NULL);
 
 	playlist_menu_item = gtk_image_menu_item_new_with_label(menu_item_text);
 	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(playlist_menu_item), gtk_image_new_from_stock(GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU));
 	gtk_widget_show(playlist_menu_item);
 	audacious_menu_plugin_item_add(AUDACIOUS_MENU_PLAYLIST_RCLICK, playlist_menu_item);
-	g_signal_connect(G_OBJECT(playlist_menu_item), "button_press_event", G_CALLBACK(menu_click), NULL);
+	g_signal_connect(G_OBJECT(playlist_menu_item), "activate", G_CALLBACK(menu_click), NULL);
 
 	aud_uri_set_plugin("cdda://", &inputplugin);
 }
@@ -247,23 +251,30 @@
 {
 	debug("cdaudio_is_our_file(\"%s\")\n", filename);
 
+	if (filename != NULL && !strcmp(filename, CDDA_DUMMYPATH)) {
+		debug("\"%s\" will add the whole audio cd\n", filename);
+		menu_click();
+		return FALSE;
+	}
+
 	if ((filename != NULL) && strlen(filename) > 4 && (!strcasecmp(filename + strlen(filename) - 4, ".cda"))) {
+		gint trackno = find_trackno_from_filename(filename);
+
 		/* no CD information yet */
 		if (pcdio == NULL) {
 			debug("no CD information, scanning\n");
-			scan_cd_threaded(NULL);
+			scan_cd_threaded(0, 0);
 		}
 
 		/* reload the cd information if the media has changed */
 		if (pcdio != NULL && cdio_get_media_changed(pcdio)) {
 			debug("CD changed, rescanning\n");
-			scan_cd_threaded(NULL);
+			scan_cd_threaded(0, 0);
 		}
-
+		
 		/* check if the requested track actually exists on the current audio cd */
-		gint trackno = find_trackno_from_filename(filename);
 		if (trackno < firsttrackno || trackno > lasttrackno) {
-			debug("\"%s\" is not our file\n", filename);
+			debug("\"%s\" is not our file (track number is out of the valid range)\n", filename);
 			return FALSE;
 		}
 
@@ -271,7 +282,7 @@
 		return TRUE;
 	}
 	else {
-		debug("\"%s\" is not our file\n", filename);
+		debug("\"%s\" is not our file (unrecognized file name)\n", filename);
 		return FALSE;
 	}
 }
@@ -300,7 +311,7 @@
 {
 	Tuple *tuple;
 	gchar *title;
-
+        
 	debug("cdaudio_play_file(\"%s\")\n", pinputplayback->filename);
 
 	pglobalinputplayback = pinputplayback;
@@ -500,7 +511,7 @@
 
 static gint cdaudio_get_volume(gint *l, gint *r)
 {
-	//printf("cdaudio-ng: cdaudio_get_volume()\n"); // annoying!
+	// debug("cdaudio-ng: cdaudio_get_volume()\n"); // annoying!
 
 	if (cdng_cfg.use_dae) {
 		*l = *r = 0;
@@ -604,43 +615,21 @@
  */
 static void menu_click()
 {
-    gchar filename[DEF_STRING_LEN];
-    gboolean available = TRUE;
+	debug("plugin services menu option selected\n");
 
 	/* reload the cd information if the media has changed, or no track information is available */
 	if (pcdio == NULL || cdio_get_media_changed(pcdio)) {
-		debug("CD changed, rescanning\n");
-
-		available = FALSE;
 		if (scan_cd_thread != NULL)
 			return;
-		else
-			available = (scan_cd(NULL) != NULL);
+		else {
+			scan_cd_threaded(-1, -1);
+			debug("CD changed, rescanning\n");
+		}
 	}
-
-	if (!available) {
-	    const gchar *markup =
-	        N_("<b><big>No playable CD found.</big></b>\n\n"
-	           "No CD inserted, or inserted CD is not an audio CD.\n");
-
-	    GtkWidget *dialog =
-	        gtk_message_dialog_new_with_markup(NULL,
-	                                           GTK_DIALOG_DESTROY_WITH_PARENT,
-	                                           GTK_MESSAGE_ERROR,
-	                                           GTK_BUTTONS_OK,
-	                                           _(markup));
-	    gtk_dialog_run(GTK_DIALOG(dialog));
-	    gtk_widget_destroy(dialog);
-		return;
-	}
-
-	aud_playlist_clear(aud_playlist_get_active());
-
-	int trackno;
-	for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) {
-		g_snprintf(filename, DEF_STRING_LEN, "track%02u.cda", trackno);
-		gchar *pathname = g_build_filename(CDDA_DEFAULT, filename, NULL);
-		aud_playlist_add(aud_playlist_get_active(), pathname);
+	else {
+		int trackno;
+		for (trackno = firsttrackno; trackno <= lasttrackno; trackno++)
+			append_track_to_playlist(trackno);
 	}
 }
 
@@ -771,12 +760,15 @@
 	g_free(buffer);
 }
 
-static void scan_cd_threaded()
+static void scan_cd_threaded(int firsttrackno, int lasttrackno)
 {
 	if (scan_cd_thread != NULL) {
 		debug("A scan_cd thread is already running.\n");
 		return;
 	}
+	
+	first_trackno_to_add_after_scan = firsttrackno;
+	last_trackno_to_add_after_scan = lasttrackno;
 
 	scan_cd_thread = g_thread_create((GThreadFunc)scan_cd, NULL, TRUE, NULL);
 	if (scan_cd_thread == NULL) {
@@ -785,6 +777,39 @@
 	}
 }
 
+static void append_track_to_playlist(int trackno) 
+{
+	gchar pathname[DEF_STRING_LEN];
+
+	g_snprintf(pathname, DEF_STRING_LEN, "%strack%02u.cda", CDDA_DUMMYPATH, trackno);
+	aud_playlist_add(aud_playlist_get_active(), pathname);
+
+	debug("added track \"%s\" to the playlist\n", pathname);		
+}
+
+static gboolean show_noaudiocd_info(gpointer data)
+{
+	const gchar *markup =
+		N_("<b><big>No playable CD found.</big></b>\n\n"
+		   "No CD inserted, or inserted CD is not an audio CD.\n");
+
+	GtkWidget *dialog =
+		gtk_message_dialog_new_with_markup(NULL,
+										   GTK_DIALOG_DESTROY_WITH_PARENT,
+										   GTK_MESSAGE_ERROR,
+										   GTK_BUTTONS_OK,
+										   _(markup));
+	gtk_dialog_run(GTK_DIALOG(dialog));
+	gtk_widget_destroy(dialog);
+	
+	return TRUE;
+}
+
+static void show_noaudiocd_info_safe()
+{
+	g_idle_add_full(G_PRIORITY_HIGH_IDLE, show_noaudiocd_info, NULL, NULL);
+}
+
 
 static void *scan_cd(void *nothing)
 {
@@ -798,6 +823,7 @@
 		if (pcdio == NULL) {
 			cdaudio_error("Failed to open CD device \"%s\".\n", cdng_cfg.device);
 			scan_cd_thread = NULL;
+			show_noaudiocd_info_safe();
 			return NULL;
 		}
 	}
@@ -810,6 +836,7 @@
 				cdaudio_error("Failed to open CD.\n");
 				cleanup_on_error();
 				scan_cd_thread = NULL;
+				show_noaudiocd_info_safe();
 				return NULL;
 			}
 			debug("found cd drive \"%s\" with audio capable media\n", *ppcd_drives);
@@ -818,6 +845,7 @@
 			cdaudio_error("Unable to find or access a CDDA capable drive.\n");
 			cleanup_on_error();
 			scan_cd_thread = NULL;
+			show_noaudiocd_info_safe();
 			return NULL;
 		}
 		if (ppcd_drives != NULL && *ppcd_drives != NULL)
@@ -839,6 +867,7 @@
 		cdaudio_error("Failed to retrieve first/last track number.\n");
 		cleanup_on_error();
 		scan_cd_thread = NULL;
+		show_noaudiocd_info_safe();
 		return NULL;
 	}
 	debug("first track is %d and last track is %d\n", firsttrackno, lasttrackno);
@@ -861,6 +890,7 @@
 			cdaudio_error("Failed to retrieve stard/end lsn for track %d.\n", trackno);
 			cleanup_on_error();
 			scan_cd_thread = NULL;
+			show_noaudiocd_info_safe();
 			return NULL;
 		}
 	}
@@ -921,7 +951,7 @@
 				debug("getting CDDB info\n");
 
 				cddb_cache_enable(pcddb_conn);
-				//cddb_cache_set_dir(pcddb_conn, "~/.cddbslave");
+				// cddb_cache_set_dir(pcddb_conn, "~/.cddbslave");
 
 				if (cdng_cfg.use_proxy) {
 					cddb_http_proxy_enable(pcddb_conn);
@@ -1022,23 +1052,25 @@
 		}
 	}
 
-	/*
-	if (pinputplayback != NULL) {
-		for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) {
-			Tuple *tuple = create_tuple_from_trackinfo(trackno);
-			gchar *title = aud_tuple_formatter_make_title_string(tuple, aud_get_gentitle_format());
-
-			pinputplayback->set_params(pinputplayback, title, calculate_track_length(trackinfo[trackno].startlsn, trackinfo[trackno].endlsn), 1411200, 44100, 2);
-			g_free(title);
-			aud_tuple_free(tuple);
-		}
-	}
-	*/
-
 	debug("scan_cd ended\n");
 
 	scan_cd_thread = NULL;
-	return (void* ) -1;
+
+	
+	/* add the requested entries to the current playlist */
+	
+	if (first_trackno_to_add_after_scan == 0 || last_trackno_to_add_after_scan == 0)
+		return NULL;
+	
+	if (first_trackno_to_add_after_scan == -1)
+		first_trackno_to_add_after_scan = firsttrackno;
+	if (last_trackno_to_add_after_scan == -1)
+		last_trackno_to_add_after_scan = lasttrackno;
+	
+	for (trackno = first_trackno_to_add_after_scan; trackno <= last_trackno_to_add_after_scan; trackno++)
+		append_track_to_playlist(trackno);
+	
+	return NULL;
 }
 
 static gint calculate_track_length(gint startlsn, gint endlsn)
--- a/src/cdaudio-ng/cdaudio-ng.h	Thu Mar 06 22:58:28 2008 +0300
+++ b/src/cdaudio-ng/cdaudio-ng.h	Fri Mar 07 18:45:36 2008 +0200
@@ -22,7 +22,7 @@
 
 
 #define DEF_STRING_LEN				256
-#define CDDA_DEFAULT				"cdda://default"
+#define CDDA_DUMMYPATH				"cdda://"
 #define CDDA_DAE_FRAMES				8
 #define CDDA_DEFAULT_LIMIT_SPEED		1
 #define CDDA_DEFAULT_CDDB_SERVER	"freedb.org"