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