sinek/src gtkxine.c,1.4,1.5

[email protected] Sun, 05 Jan 2003 22:54:16 -0800
Newsgroups gmane.comp.video.sinek.cvs
Message-ID <[email protected]>
Update of /cvsroot/sinek/sinek/src
In directory sc8-pr-cvs1:/tmp/cvs-serv3886/src

Modified Files:
	gtkxine.c 
Log Message:
The test plays audio/video; time to start using this within sinek.


Index: gtkxine.c
===================================================================
RCS file: /cvsroot/sinek/sinek/src/gtkxine.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- gtkxine.c	5 Jan 2003 13:04:44 -0000	1.4
+++ gtkxine.c	6 Jan 2003 06:54:14 -0000	1.5
@@ -34,13 +34,11 @@
 	void (*warning_cb) (const char *msg);
 	void (*error_cb) (const char *msg);
 
-	char *video_win_title;
-	GtkWidget *video_win;
-	x11_visual_t visual;
-	int video_width, video_height;
+	char *current_mrl;
+	int x, y, w, h;
 
 	/* x11 specific stuff */
-	char *display_name;
+	// char *display_name;
 };
 
 static void default_warning_cb (const char *msg)
@@ -59,12 +57,18 @@
 	xine->conf_loaded = 0;
 	xine->ao_driver = NULL;
 	xine->vo_driver = NULL;
+	xine->stream = NULL;
 
 	xine->warning_cb = default_warning_cb;
 	xine->error_cb = default_error_cb;
 
+	xine->current_mrl = NULL;
+	xine->x = xine->y = xine->w = xine->h = 0;
+
+	/*
 	xine->video_win_title = g_strdup ("Xine Video Output");
 	xine->display_name = NULL;
+	*/
 
 	/* XXX: is this correct? */
 	gtk_set_locale ();
@@ -323,6 +327,8 @@
 	g_print ("%s()\n", __FUNCTION__);
 
 	xine_exit (xine->xine);
+	if (xine->current_mrl)
+		g_free (xine->current_mrl);
 
 	if (G_OBJECT_CLASS (parent)->dispose)
 		G_OBJECT_CLASS (parent)->dispose (obj);
@@ -384,17 +390,17 @@
 	xine->conf_loaded = 1;
 	xine_init (xine->xine);
 
-	return 0;
+	return 1;
 }
 
 int gtk_xine_config_save (GtkXine *xine, const char *conffile)
 {
 	if (xine->conf_loaded) {
 		xine_config_save (xine->xine, conffile);
-		return 1;
+		return 0;
 	}
 
-	return 0;
+	return 1;
 }
 
 const char *gtk_xine_config_register_string (GtkXine *xine, const char *key, const char *default_value)
@@ -439,10 +445,10 @@
 				break;
 		}
 		xine_config_update_entry (xine->xine, &entry);
-		return 0;
+		return 1;
 	}
 	
-	return 1;
+	return 0;
 }
 
 int gtk_xine_config_get (GtkXine *xine, const char *key, void **value)
@@ -462,12 +468,14 @@
 				break;
 		}
 
-		return 0;
+		return 1;
 	}
 
-	return 1;
+	return 0;
 }
 
+/* xine setup */
+
 const char *gtk_xine_set_audio_driver (GtkXine *xine, const char *name)
 {
 	const char *const *driver_ids;
@@ -501,106 +509,78 @@
 	return name;
 }
 
-#if 0
-static int do_x11_best_visual (GtkXine *xine, Display *display)
-{
-	XVisualInfo *vi, tmpl;
-	int nr, depth, prf, best_prf = -1;
-	Visual *visual;
-
-	tmpl.screen = DefaultScreen (display);
-	tmpl.class = TrueColor;
-
-	vi = XGetVisualInfo (display, VisualScreenMask | VisualClassMask, &tmpl, &nr);
-	if (vi) {
-		for (i = 0; i < nr; i++) {
-			if (vi[i].depth > 8 && vi[i].depth <= 16)
-				prf = 3;
-			else if (vi[i].depth > 16)
-				prf = 2;
-			else
-				prf = 1;
-
-			if (prf > best_prf) {
-				depth = vi[i].depth;
-				visual = vi[i].visual;
-			}
-		}
-		XFree (vi);
-	}
-	if (best_prf == -1) {
-
-		...
-
-
-	}
-}
-static int do_x11_voodoo (GtkXine *xine)
-{
-	Display *display;
-	int screen, fd;
-
-	if (!xine->display_name)
-		xine->display_name = gdk_get_display ();
-	display = XOpenDisplay (xine->display_name);
-	if (!display) {
-		char *t = g_strconcat (_("cannot connect to display '%s'."), xine->display_name, NULL);
-		xine->error_cb (t);
-		g_free (t);
-		return 1;
-	}
-	XLockDisplay (display);
-	screen = DefaultScreen (display);
-	fd = ConnectionNumber (display);
-	
-		
-}
-#endif
-
 static void frame_output_cb (void *user_data, int vid_w, int vid_h, double vidp_aspect, int *dest_x, int *dest_y, int *dest_w, int *dest_h, double *dest_vidp_aspect, int *win_x, int *win_y)
 {
-	/*GtkXine *xine = GTK_XINE (user_data);*/
-	g_print ("%s(): unimplemented\n", __FUNCTION__);
-	*dest_x = *dest_y = *dest_h = *dest_w = *win_x = *win_y = 0;
+	GtkXine *xine = GTK_XINE (user_data);
+
+	*dest_w = xine->w;
+	*dest_h = xine->h;
+	*win_x = xine->x;
+	*win_y = xine->y;
+	*dest_x = *dest_y = 0;
 	*dest_vidp_aspect = 1.0;
 }
 
 static void dest_size_cb (void *user_data, int vid_w, int vid_h, double vidp_aspect, int *dest_w, int *dest_h, double *dest_vidp_aspect)
 {
-	g_print ("%s(): unimplemented\n", __FUNCTION__);
-	*dest_w = *dest_h = 0;
+	GtkXine *xine = GTK_XINE (user_data);
+
+	*dest_w = xine->w;
+	*dest_h = xine->h;
 	*dest_vidp_aspect = 1.0;
 }
 
-static void do_x11_voodoo (GtkXine *xine, x11_visual_t *vis)
+static int get_visual_info (GtkXine *xine, GtkWidget *draw, x11_visual_t *vis)
 {
-	GtkWidget *videowin = gtk_drawing_area_new ();
-	gtk_widget_realize (videowin);
-
-	/* TODO:
-	 * GtkRequisition req;
-	 * GdkVisual *visual;
-	 * gtk_widget_size_request (videowin, &req);
-	 * width = req.width;
-	 * height = req.height;
-	 * visual = gdk_drawable_get_visual (videowin->window);
-	 */
-	/*
-	visual.display = GDK_WINDOW_XDISPLAY (video_area->window);
-	visual.screen = gdk_x11_get_default_screen ();
-	visual.d = GDK_WINDOW_XWINDOW (video_area->window);
+	if (!GTK_IS_DRAWING_AREA (draw)) {
+		xine->error_cb (_("xine video driver expects to be supplied with a GtkDrawingArea widget."));
+		return 0;
+	}
+	if (!gtk_widget_get_parent (draw)) {
+		xine->error_cb (_("xine video driver expects the GtkDrawingArea it gets to have a valid parent window."));
+		return 0;
+	}
+	if (!GTK_WIDGET_VISIBLE (draw)) {
+//		xine->warning_cb (_("xine video driver expects the GtkDrawingArea it gets to be visible; displaying widget."));
+		gtk_widget_realize (draw);
+		gtk_widget_show (draw);
+	}
 
-*/
-	vis->display = gdk_x11_drawable_get_xdisplay (videowin->window);
+	vis->display = gdk_x11_drawable_get_xdisplay (draw->window);
 	vis->screen = gdk_x11_get_default_screen ();
-	vis->d = gdk_x11_drawable_get_xid (videowin->window);
+	vis->d = gdk_x11_drawable_get_xid (draw->window);
 	vis->user_data = (void *) xine;
 	vis->dest_size_cb = dest_size_cb;
 	vis->frame_output_cb = frame_output_cb;
+	
+	return 1;
+}
+
+static gboolean expose_event_cb (GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
+{
+	GtkXine *xine = GTK_XINE (user_data);
 
+	xine->x = event->area.x;
+	xine->y = event->area.y;
+	xine->w = event->area.width;
+	xine->h = event->area.height;
+	g_print ("%s(): x=%d, y=%d, w=%d, h=%d\n", __FUNCTION__, xine->x, xine->y, xine->w, xine->h);
+	return FALSE;
 }
-			
-const char *gtk_xine_set_x11_video_driver (GtkXine *xine, const char *name)
+
+static gboolean configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, gpointer user_data)
+{
+	GtkXine *xine = GTK_XINE (user_data);
+
+	xine->x = event->x;
+	xine->y = event->y;
+	xine->w = event->width;
+	xine->h = event->height;
+	g_print ("%s(): x=%d, y=%d, w=%d, h=%d\n", __FUNCTION__, xine->x, xine->y, xine->w, xine->h);
+	return FALSE;
+}
+
+const char *gtk_xine_set_x11_video_driver (GtkXine *xine, const char *name, GtkWidget *videoarea)
 {
 	const char *const *driver_ids;
 	x11_visual_t vis;
@@ -614,38 +594,101 @@
 	if (strcmp (name, "null") == 0)
 		return name;
 
-	do_x11_voodoo (xine, &vis);
+	if (!get_visual_info (xine, videoarea, &vis))
+		return "null";
+	g_signal_connect (G_OBJECT (videoarea), "expose_event", G_CALLBACK (expose_event_cb), (void *) xine);
+	g_signal_connect (G_OBJECT (videoarea), "configure_event", G_CALLBACK (configure_event_cb), (void *) xine);
 
-	if (strcmp (name, "auto") != 0)
+	if (strcmp (name, "auto") != 0) {
 		xine->vo_driver = xine_open_video_driver (xine->xine, name, XINE_VISUAL_TYPE_X11, &vis);
+		if (xine->vo_driver)
+			return name;
+	}
 
-	if (xine->vo_driver == NULL) {
-		/* autodetect */
-		driver_ids = xine_list_video_output_plugins (xine->xine);
-		for (i = 0; driver_ids[i] != NULL; i++) {
-			xine->vo_driver = xine_open_video_driver (xine->xine, driver_ids[i], XINE_VISUAL_TYPE_X11, &vis);
-			if (xine->vo_driver) {
-				name = (const char *) driver_ids[i];
-				break;
-			}
-		}
+	/* autodetect */
+	driver_ids = xine_list_video_output_plugins (xine->xine);
+	for (i = 0; driver_ids[i] != NULL; i++) {
+		xine->vo_driver = xine_open_video_driver (xine->xine, driver_ids[i], XINE_VISUAL_TYPE_X11, &vis);
+		if (xine->vo_driver)
+			return driver_ids[i];
 	}
 
-	if (xine->vo_driver == NULL)
-		name = "null";
+	return "null";
+}
 
-	return name;
+/* media handling */
+
+int gtk_xine_load (GtkXine *xine, const char *mrl)
+{
+	int i;
+
+	if (!xine->stream) {
+		xine->stream = xine_stream_new (xine->xine, xine->ao_driver, xine->vo_driver);
+		if (!xine->stream)
+			return 0;
+	}
+
+	if (xine->current_mrl) {
+		g_free (xine->current_mrl);
+		xine->current_mrl = NULL;
+		xine_close (xine->stream);
+	}
+
+	if ((i = xine_open (xine->stream, mrl)))
+		xine->current_mrl = g_strdup (mrl);
+
+	return i;
 }
 
-#if 0
-void gtk_xine_load (GtkXine *xine, const char *mrl)
+int gtk_xine_play (GtkXine *xine)
 {
-	if (xine->xine == NULL)
-		gtk_xine_build (xine);
+	if (!xine->stream)
+		return 0;
 
+	return xine_play (xine->stream, 0, 0);
+}
 
+int gtk_xine_play_from_position (GtkXine *xine, int start)
+{
+	if (!xine->stream)
+		return 0;
+
+	return xine_play (xine->stream, start, 0);
+}
+
+int gtk_xine_play_from_time (GtkXine *xine, time_t start)
+{
+	if (!xine->stream)
+		return 0;
+
+	return xine_play (xine->stream, 0, (int) start);
+}
+
+/* XXX: get_stream_info(), get_meta_info() */
+
+int gtk_xine_stop (GtkXine *xine) {
+	if (!xine->stream)
+		return 0;
+
+	xine_stop (xine->stream);
+	return 1;
+}
+
+uint32_t gtk_xine_stream_has_audio (GtkXine *xine)
+{
+	if (!xine->stream)
+		return 0;
+
+	return xine_get_stream_info (xine->stream, XINE_STREAM_INFO_HAS_AUDIO);
+}
+
+uint32_t gtk_xine_stream_has_video (GtkXine *xine)
+{
+	if (!xine->stream)
+		return 0;
+
+	return xine_get_stream_info (xine->stream, XINE_STREAM_INFO_HAS_VIDEO);
 }
-#endif
 
 /* parameters */
 
@@ -771,27 +814,47 @@
 
 #ifdef GTK_XINE_TEST
 
-const char *rcfile (void)
+#define RCFILE "/home/dilinger/.sinek/config"
+#define MEDIAFILE "/usr/share/xine/skins/xine-ui_logo.mpv"
+//#define MEDIAFILE "/home/dilinger/light_years_DEMO.mp3"
+
+static void create_video_window (const char *title, GtkWidget **frame, GtkWidget **video)
 {
-	static char *x = NULL;
-	if (!x)
-		x = g_strconcat (g_get_home_dir (), "/.sinek/config", NULL);
-	return x;
+	*frame = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+	gtk_window_set_title (GTK_WINDOW (*frame), title);
+	*video = gtk_drawing_area_new ();
+	gtk_container_add (GTK_CONTAINER (*frame), *video);
 }
-	
+
 int main (int argc, char **argv) 
 {
-	GtkWidget *w;
+	GtkWidget *videowin, *videodisplay, *x;
 
 	gtk_init (&argc, &argv);
 	
-	w = gtk_xine_new ();
-	gtk_xine_config_load (GTK_XINE (w), rcfile ());
-	g_print ("Loaded audio driver '%s'\n", gtk_xine_set_audio_driver (GTK_XINE (w), "auto"));
-	g_print ("Loaded video driver '%s'\n", gtk_xine_set_x11_video_driver (GTK_XINE (w), "auto"));
+	create_video_window (_("Xine Video Output"), &videowin, &videodisplay);
+
+	x = gtk_xine_new ();
+	gtk_xine_config_load (GTK_XINE (x), RCFILE);
+	g_print ("Loaded audio driver '%s'\n", gtk_xine_set_audio_driver (GTK_XINE (x), "auto"));
+	g_print ("Loaded video driver '%s'\n", gtk_xine_set_x11_video_driver (GTK_XINE (x), "auto", videodisplay));
+
+	if (gtk_xine_load (GTK_XINE (x), MEDIAFILE))
+		gtk_xine_play (GTK_XINE (x));
+
+	if (gtk_xine_stream_has_video (GTK_XINE (x))) {
+		g_print ("'%s' has video, displaying video window\n", MEDIAFILE);
+		gtk_widget_show (videowin);
+	}
 
 	gtk_main();
-	gtk_widget_destroy (w);
+
+//	while (GTK_WIDGET_VISIBLE (videowin))
+//		gtk_main_iteration_do (TRUE);
+
+	gtk_widget_destroy (x);
+	gtk_widget_destroy (videodisplay);
+	gtk_widget_destroy (videowin);
 
 	return 0;
 }




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf