From 01eb2caf72ca4cfd7ffd219030f34945a64d882e Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Sun, 12 Nov 2000 20:34:29 +0000 Subject: [PATCH] The bonobo component now works on audio only (mp3/vorbis). Video is broken because bonobo does not handle multithread... Original commit message from CVS: The bonobo component now works on audio only (mp3/vorbis). Video is broken because bonobo does not handle multithreading yet. Added Bonobo toolbar and menu. --- components/bonobo-gstmediaplay/Makefile.am | 4 +- .../bonobo-gstmediaplay/bonobo-gstmediaplay.c | 548 +++++++++--------- .../bonobo-gstmediaplay/gstmediaplay.oafinfo | 30 +- 3 files changed, 277 insertions(+), 305 deletions(-) diff --git a/components/bonobo-gstmediaplay/Makefile.am b/components/bonobo-gstmediaplay/Makefile.am index 1e1f2a4260..b1b717dece 100644 --- a/components/bonobo-gstmediaplay/Makefile.am +++ b/components/bonobo-gstmediaplay/Makefile.am @@ -5,14 +5,14 @@ INCLUDES = -I$(top_srcdir)/gst \ -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \ -DDATADIR=\""$(datadir)"\" \ -I$(includedir) \ - $(BONOBOX_TEST_CFLAGS) + $(BONOBOX_TEST_CFLAGS) -Wall -O2 bin_PROGRAMS = bonobo-gstmediaplay bonobo_gstmediaplay_SOURCES = \ bonobo-gstmediaplay.c -bonobo_gstmediaplay_CFLAGS = \ +bonobo_gstmediaplay_CFLAGS = -Wall -O2 \ $(shell gnome-config --cflags gnomeui bonobo bonobox) $(shell libglade-config --cflags gnome) \ $(shell gstreamer-config --clfags ) diff --git a/components/bonobo-gstmediaplay/bonobo-gstmediaplay.c b/components/bonobo-gstmediaplay/bonobo-gstmediaplay.c index f7ec289ba3..039b107dec 100644 --- a/components/bonobo-gstmediaplay/bonobo-gstmediaplay.c +++ b/components/bonobo-gstmediaplay/bonobo-gstmediaplay.c @@ -25,6 +25,10 @@ #include "gstplay.h" +#include "pause.xpm" +#include "play.xpm" +#include "stop.xpm" + /* * Number of running objects */ @@ -35,10 +39,10 @@ static BonoboGenericFactory *factory = NULL; * BonoboControl data */ typedef struct { - BonoboControl *bonobo_object; - BonoboUIComponent *uic; + BonoboControl *bonobo_object; + BonoboUIComponent *uic; - GstPlay *play; + GstPlay *play; } control_data_t; /* @@ -49,107 +53,88 @@ static void control_system_exception_cb (BonoboControl *control, CORBA_Object corba_object, CORBA_Environment *ev, gpointer data) { - bonobo_object_unref (BONOBO_OBJECT (control)); + bonobo_object_unref (BONOBO_OBJECT (control)); } static void control_update (control_data_t *control_data) { - g_print("control_update\n", running_objects); - gtk_widget_queue_draw (GTK_WIDGET (control_data->play)); - g_print("control_update done\n", running_objects); + gtk_widget_queue_draw (GTK_WIDGET (control_data->play)); } static void -load_media (BonoboPersistStream *ps, - const Bonobo_Stream stream, - Bonobo_Persist_ContentType type, - void *closure, - CORBA_Environment *ev) +verb_Play_cb (BonoboUIComponent *uic, gpointer user_data, const char *cname) { - control_data_t *control_data = closure; - GstPlay *pl; - Bonobo_Stream_iobuf *buffer; - char *str; - int bx, by, j; + control_data_t *control_data = (control_data_t *) user_data; - g_return_if_fail (control_data != NULL); - g_return_if_fail (control_data->play != NULL); - - if (*type && g_strcasecmp (type, "application/x-gstmediaplay") != 0) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Bonobo_Persist_WrongDataType, NULL); - return; - } - - pl = control_data->play; - - bonobo_stream_client_read_string (stream, &str, ev); - if (ev->_major != CORBA_NO_EXCEPTION || str == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Bonobo_Persist_WrongDataType, NULL); - return; - } - sscanf (str, "%2u%2u\n", &bx, &by); - g_free (str); - - if (bx > 128 || by > 128) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Bonobo_Persist_WrongDataType, NULL); - return; - } - - for (j = 0; j < by; j++) { - int i; - - Bonobo_Stream_read (stream, bx * 2 + 1, &buffer, ev); - if (ev->_major != CORBA_NO_EXCEPTION) - return; - else if (buffer->_length != bx * 2 + 1) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Bonobo_Persist_WrongDataType, - NULL); - return; - } - - - CORBA_free (buffer); - } - - control_update (control_data); + gst_play_play (control_data->play); + control_update (control_data); } static void -save_media (BonoboPersistStream *ps, - const Bonobo_Stream stream, - Bonobo_Persist_ContentType type, - void *closure, - CORBA_Environment *ev) +verb_Pause_cb (BonoboUIComponent *uic, gpointer user_data, const char *cname) { - control_data_t *control_data = closure; - GstPlay *pl; - char *data; - int j; + control_data_t *control_data = (control_data_t *) user_data; - g_return_if_fail (control_data != NULL); - g_return_if_fail (control_data->play != NULL); - - if (*type && g_strcasecmp (type, "application/x-gstmediaplay") != 0) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Bonobo_Persist_WrongDataType, NULL); - return; - } - - pl = control_data->play; - - if (ev->_major != CORBA_NO_EXCEPTION) - return; + gst_play_pause (control_data->play); + control_update (control_data); } -static Bonobo_Persist_ContentTypeList * -content_types (BonoboPersistStream *ps, void *closure, CORBA_Environment *ev) +static void +verb_Stop_cb (BonoboUIComponent *uic, gpointer user_data, const char *cname) { - return bonobo_persist_generate_content_types (1, "application/x-gstmediaplay"); + control_data_t *control_data = (control_data_t *) user_data; + + gst_play_stop (control_data->play); + control_update (control_data); +} + +typedef struct { + control_data_t *control_data; + GtkFileSelection *selector; +} file_select_struct; + +static void +filename_selected (GtkButton *ok, gpointer user_data) +{ + file_select_struct *select = (file_select_struct *) user_data; + + gchar *selected_filename; + + selected_filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION(select->selector)); + + gst_play_set_uri (select->control_data->play, selected_filename); + + gst_play_play (select->control_data->play); + control_update (select->control_data); + + g_free(select); +} + +static void +verb_Open_cb (BonoboUIComponent *uic, gpointer user_data, const char *cname) +{ + control_data_t *control_data = (control_data_t *) user_data; + file_select_struct *data = g_new0(file_select_struct, 1); + GtkWidget *file_selector; + + file_selector = gtk_file_selection_new("Select a media file"); + + data->selector = GTK_FILE_SELECTION (file_selector); + data->control_data = control_data; + + gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(file_selector)->ok_button), + "clicked", GTK_SIGNAL_FUNC (filename_selected), data); + + gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION(file_selector)->ok_button), + "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), + (gpointer) file_selector); + + gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION(file_selector)->cancel_button), + "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), + (gpointer) file_selector); + + gtk_widget_show (file_selector); } /* @@ -159,71 +144,93 @@ content_types (BonoboPersistStream *ps, void *closure, CORBA_Environment *ev) static void control_create_menus (control_data_t *control_data) { - BonoboControl *control = control_data->bonobo_object; - Bonobo_UIContainer remote_uic; - GdkPixbuf *pixbuf; + BonoboControl *control = control_data->bonobo_object; + Bonobo_UIContainer remote_uic; + GdkPixbuf *pixbuf; - static char ui [] = - "" - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - ""; + static char ui [] = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; - /* - * Get our container's UIContainer server. - */ - remote_uic = bonobo_control_get_remote_ui_container (control); + g_print("create menu\n"); + /* + * Get our container's UIContainer server. + */ + remote_uic = bonobo_control_get_remote_ui_container (control); - /* - * We have to deal gracefully with containers - * which don't have a UIContainer running. - */ - if (remote_uic == CORBA_OBJECT_NIL) { - g_warning ("No UI container!"); - return; - } + /* + * We have to deal gracefully with containers + * which don't have a UIContainer running. + */ + if (remote_uic == CORBA_OBJECT_NIL) { + g_warning ("No UI container!"); + return; + } - /* - * Give our BonoboUIComponent object a reference to the - * container's UIContainer server. - */ - bonobo_ui_component_set_container (control_data->uic, remote_uic); - /* - * Unref the UI container we have been passed. - */ - bonobo_object_release_unref (remote_uic, NULL); + /* + * Give our BonoboUIComponent object a reference to the + * container's UIContainer server. + */ + bonobo_ui_component_set_container (control_data->uic, remote_uic); - /* Set up the UI from the XML string. */ - { - BonoboUINode *node; + /* + * Unref the UI container we have been passed. + */ + bonobo_object_release_unref (remote_uic, NULL); - node = bonobo_ui_node_from_string (ui); - bonobo_ui_util_translate_ui (node); - bonobo_ui_util_fixup_help (control_data->uic, node, - DATADIR, "gstmediaplay"); + /* Set up the UI from the XML string. */ + { + BonoboUINode *node; + + node = bonobo_ui_node_from_string (ui); + bonobo_ui_util_translate_ui (node); + bonobo_ui_util_fixup_help (control_data->uic, node, + DATADIR, "gstmediaplay"); - bonobo_ui_component_set_tree (control_data->uic, "/", node, NULL); + bonobo_ui_component_set_tree (control_data->uic, "/", node, NULL); + + bonobo_ui_node_free (node); + } + + pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) play_back_xpm); + bonobo_ui_util_set_pixbuf (control_data->uic, "/commands/Play", pixbuf); + gdk_pixbuf_unref (pixbuf); + + pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) pause_xpm); + bonobo_ui_util_set_pixbuf (control_data->uic, "/commands/Pause", pixbuf); + gdk_pixbuf_unref (pixbuf); + + pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) stop_back_xpm); + bonobo_ui_util_set_pixbuf (control_data->uic, "/commands/Stop", pixbuf); + gdk_pixbuf_unref (pixbuf); - bonobo_ui_node_free (node); - } } static void control_remove_menus (control_data_t *control_data) { - bonobo_ui_component_unset_container (control_data->uic); + bonobo_ui_component_unset_container (control_data->uic); } /* @@ -232,214 +239,179 @@ control_remove_menus (control_data_t *control_data) static void control_destroy_cb (BonoboControl *control, gpointer data) { - control_data_t *control_data = (control_data_t *) data; + control_data_t *control_data = (control_data_t *) data; - g_message ("control_destroy_cb"); - - control_data->play = NULL; + control_data->play = NULL; - g_free (control_data); + g_free (control_data); - running_objects--; - if (running_objects > 0) - return; + running_objects--; + if (running_objects > 0) + return; - /* - * When the last object has gone, unref the factory & quit. - */ - bonobo_object_unref (BONOBO_OBJECT (factory)); - gtk_main_quit (); + /* + * When the last object has gone, unref the factory & quit. + */ + bonobo_object_unref (BONOBO_OBJECT (factory)); + gtk_main_quit (); } static void control_activate_cb (BonoboControl *control, gboolean activate, gpointer data) { - control_data_t *control_data = (control_data_t *) data; + control_data_t *control_data = (control_data_t *) data; - g_message ("control_activate"); - /* - * The ControlFrame has just asked the Control (that's us) to be - * activated or deactivated. We must reply to the ControlFrame - * and say whether or not we want our activation state to - * change. We are an acquiescent BonoboControl, so we just agree - * with whatever the ControlFrame told us. Most components - * should behave this way. - */ - bonobo_control_activate_notify (control, activate); + g_message ("control_activate"); + /* + * The ControlFrame has just asked the Control (that's us) to be + * activated or deactivated. We must reply to the ControlFrame + * and say whether or not we want our activation state to + * change. We are an acquiescent BonoboControl, so we just agree + * with whatever the ControlFrame told us. Most components + * should behave this way. + */ + bonobo_control_activate_notify (control, activate); - /* - * If we were just activated, we merge in our menu entries. - * If we were just deactivated, we remove them. - */ - if (activate) - control_create_menus (control_data); - else - control_remove_menus (control_data); + /* + * If we were just activated, we merge in our menu entries. + * If we were just deactivated, we remove them. + */ + if (activate) + control_create_menus (control_data); + else + control_remove_menus (control_data); } static void control_set_frame_cb (BonoboControl *control, gpointer data) { - g_message ("control_set frame cb"); - control_create_menus ((control_data_t *) data); - g_message ("control_set frame cb done"); -} - -static void -update_control (GtkWidget *widget, control_data_t *control_data) -{ - g_message ("update_control"); - control_update (control_data); + control_create_menus ((control_data_t *) data); } static BonoboObject * bonobo_gstmediaplay_factory (BonoboGenericFactory *this, void *data) { - BonoboControl *bonobo_object; - control_data_t *control_data; - BonoboPersistStream *stream; - GtkWidget *vbox; + BonoboControl *bonobo_object; + control_data_t *control_data; + GtkWidget *vbox; - /* - * Create a data structure in which we can store - * Control-object-specific data about this document. - */ - control_data = g_new0 (control_data_t, 1); - if (control_data == NULL) - return NULL; + gst_init (NULL, NULL); + /* + * Create a data structure in which we can store + * Control-object-specific data about this document. + */ + control_data = g_new0 (control_data_t, 1); + if (control_data == NULL) + return NULL; - g_print("creating\n"); - control_data->play = gst_play_new (); - g_print("created\n"); + control_data->play = gst_play_new (); - vbox = gtk_vbox_new (TRUE, 0); + vbox = gtk_vbox_new (TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (control_data->play), + gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (control_data->play), TRUE, TRUE, 0); - gtk_widget_show_all (vbox); + gtk_widget_show_all (vbox); - /* - * Create the BonoboControl object. - */ - bonobo_object = bonobo_control_new (vbox); + /* + * Create the BonoboControl object. + */ + bonobo_object = bonobo_control_new (vbox); - if (bonobo_object == NULL) { - gtk_widget_destroy (vbox); - g_free (control_data); - return NULL; - } + if (bonobo_object == NULL) { + gtk_widget_destroy (vbox); + g_free (control_data); + return NULL; + } - control_data->bonobo_object = bonobo_object; + control_data->bonobo_object = bonobo_object; - control_data->uic = bonobo_control_get_ui_component (bonobo_object); + control_data->uic = bonobo_control_get_ui_component (bonobo_object); - /* - * When our container wants to activate this component, we will get - * the "activate" signal. - */ - gtk_signal_connect (GTK_OBJECT (bonobo_object), "activate", - GTK_SIGNAL_FUNC (control_activate_cb), control_data); - gtk_signal_connect (GTK_OBJECT (bonobo_object), "set_frame", - GTK_SIGNAL_FUNC (control_set_frame_cb), control_data); + /* + * When our container wants to activate this component, we will get + * the "activate" signal. + */ + gtk_signal_connect (GTK_OBJECT (bonobo_object), "activate", + GTK_SIGNAL_FUNC (control_activate_cb), control_data); + gtk_signal_connect (GTK_OBJECT (bonobo_object), "set_frame", + GTK_SIGNAL_FUNC (control_set_frame_cb), control_data); - /* - * The "system_exception" signal is raised when the BonoboControl - * encounters a fatal CORBA exception. - */ - gtk_signal_connect (GTK_OBJECT (bonobo_object), "system_exception", - GTK_SIGNAL_FUNC (control_system_exception_cb), control_data); + /* + * The "system_exception" signal is raised when the BonoboControl + * encounters a fatal CORBA exception. + */ + gtk_signal_connect (GTK_OBJECT (bonobo_object), "system_exception", + GTK_SIGNAL_FUNC (control_system_exception_cb), control_data); - /* - * We'll need to be able to cleanup when this control gets - * destroyed. - */ - gtk_signal_connect (GTK_OBJECT (bonobo_object), "destroy", - GTK_SIGNAL_FUNC (control_destroy_cb), control_data); + /* + * We'll need to be able to cleanup when this control gets + * destroyed. + */ + gtk_signal_connect (GTK_OBJECT (bonobo_object), "destroy", + GTK_SIGNAL_FUNC (control_destroy_cb), control_data); - /* - * Create the PersistStream object. - */ - stream = bonobo_persist_stream_new (load_media, save_media, - NULL, content_types, - control_data); + bonobo_ui_component_add_verb (control_data->uic, "Play", + verb_Play_cb, control_data); + bonobo_ui_component_add_verb (control_data->uic, "Pause", + verb_Pause_cb, control_data); + bonobo_ui_component_add_verb (control_data->uic, "Stop", + verb_Stop_cb, control_data); - if (stream == NULL) { - bonobo_object_unref (BONOBO_OBJECT (bonobo_object)); - gtk_widget_destroy (vbox); - g_free (control_data); - return NULL; - } - bonobo_object_add_interface (BONOBO_OBJECT (bonobo_object), - BONOBO_OBJECT (stream)); + bonobo_ui_component_add_verb (control_data->uic, "Open", + verb_Open_cb, control_data); - /* - * Add some verbs to the control. - * - * The container application will then have the programmatic - * ability to execute the verbs on the component. It will - * also provide a simple mechanism whereby the user can - * right-click on the component to create a popup menu - * listing the available verbs. - * - * We provide one simple verb whose job it is to clear the - * window. - */ - control_data->uic = bonobo_control_get_ui_component (bonobo_object); + /* + * Count the new running object + */ + running_objects++; + g_print("running objects: %d\n", running_objects); - /* - * Count the new running object - */ - running_objects++; - g_print("running objects: %d\n", running_objects); - - return BONOBO_OBJECT (bonobo_object); + return BONOBO_OBJECT (bonobo_object); } static void init_gstmediaplay_factory (void) { - printf("init factory\n"); - factory = bonobo_generic_factory_new ( - "OAFIID:bonobo_gstmediaplay_factory:420f20ca-55d7-4a33-b327-0b246136db18", - bonobo_gstmediaplay_factory, NULL); + factory = bonobo_generic_factory_new ( + "OAFIID:bonobo_gstmediaplay_factory:420f20ca-55d7-4a33-b327-0b246136db18", + bonobo_gstmediaplay_factory, NULL); } static void init_server_factory (int argc, char **argv) { - CORBA_Environment ev; - CORBA_ORB orb; + CORBA_Environment ev; + CORBA_ORB orb; - bindtextdomain (PACKAGE, GNOMELOCALEDIR); - textdomain (PACKAGE); + bindtextdomain (PACKAGE, GNOMELOCALEDIR); + textdomain (PACKAGE); - CORBA_exception_init (&ev); + CORBA_exception_init (&ev); - gnome_init_with_popt_table("gstmediaplay", VERSION, - argc, argv, - oaf_popt_options, 0, NULL); - orb = oaf_init (argc, argv); + gnome_init_with_popt_table("bonobo-gstmediaplay", VERSION, + argc, argv, + oaf_popt_options, 0, NULL); + orb = oaf_init (argc, argv); - CORBA_exception_free (&ev); + if (bonobo_init (orb, NULL, NULL) == FALSE) + g_error (_("Could not initialize Bonobo!")); - if (bonobo_init (orb, NULL, NULL) == FALSE) - g_error (_("Could not initialize Bonobo!")); + CORBA_exception_free (&ev); } int main (int argc, char **argv) { - gst_init (&argc, &argv); - /* - * Setup the factory. - */ - init_server_factory (argc, argv); - init_gstmediaplay_factory (); + /* + * Setup the factory. + */ + init_server_factory (argc, argv); + init_gstmediaplay_factory (); - /* - * Start processing. - */ - bonobo_main (); + /* + * Start processing. + */ + bonobo_main (); - return 0; + return 0; } diff --git a/components/bonobo-gstmediaplay/gstmediaplay.oafinfo b/components/bonobo-gstmediaplay/gstmediaplay.oafinfo index 9f21d89061..76efb05279 100644 --- a/components/bonobo-gstmediaplay/gstmediaplay.oafinfo +++ b/components/bonobo-gstmediaplay/gstmediaplay.oafinfo @@ -1,20 +1,20 @@ - - - - - - - + + + + + + + - - - - - - - - + + + + + + + +