[gst-devel] gst-player

Christian Fredrik Kalager Schaller Uraeus at linuxrising.org
Wed Sep 25 10:35:02 CEST 2002


Thomas,
That looks great! We should absolutly include it in the next release.

Christian

On Wed, 2002-09-25 at 12:08, Thomas Vander Stichele wrote:
> Hi,
> 
> As I said, I've been working on somewhat better error handling for the 
> player.
> 
> I attached an (uncleaned) patch that shows how I'm doing it based on the 
> feedback I got.  You're welcome to try it out and let me know if you think 
> it's the right way to do this.
> 
> A simple screenshot of an error is up at
> 
> http://thomas.apestaart.org/download/screenshots/gst-player-error.png
> 
> Nothing special, but this is how it would look.
> 
> Later on I could try implementing some of Bastien's suggestions, like not 
> showing the volume slider if you don't have volume, but still be able to 
> play.
> 
> Let me also know if you think this should go in before we release (from 
> this point on, if you guys agree with the patch, it's fairly easy to do 
> this everywhere) or not.  it involves some API changes, obviously, to the 
> play library.
> 
> Thomas
> 
>  -- 
> 
> The Dave/Dina Project : future TV today ! - http://davedina.apestaart.org/
> <-*-                      -*->
> There's a world outside
> And I know cause I've heard talk
> In my sweetest dreams
> I would go out for a walk
> <-*- thomas at apestaart.org -*->
> URGent, the best radio on the Internet - 24/7 ! - http://urgent.rug.ac.be/
> ----
> 

> ? autoregen.sh
> ? compile
> ? config.guess
> ? config.sub
> ? depcomp
> ? gst-player-0.4.0.3.tar.gz
> ? gst-player.patch
> ? gstreamer-player-uninstalled.pc
> ? gstreamer-player.pc
> ? install-sh
> ? intltool-extract
> ? intltool-extract.in
> ? intltool-merge
> ? intltool-merge.in
> ? intltool-update
> ? intltool-update.in
> ? missing
> ? mkinstalldirs
> ? po/.intltool-merge-cache
> ? po/Makefile.in.in
> ? po/POTFILES
> ? po/gst-player.pot
> ? po/messages.mo
> ? po/nl.gmo
> ? tests/gstcmdplay
> Index: configure.ac
> ===================================================================
> RCS file: /cvsroot/gstreamer/gst-player/configure.ac,v
> retrieving revision 1.39.2.1
> diff -u -p -r1.39.2.1 configure.ac
> --- configure.ac	22 Sep 2002 17:54:41 -0000	1.39.2.1
> +++ configure.ac	25 Sep 2002 10:05:44 -0000
> @@ -2,7 +2,7 @@ dnl autoconf configuration file for gst-
>  AC_INIT
>  
>  dnl when going to/from release please set the nano (fourth number) right !
> -AS_VERSION(gst-player, GST_PLAYER_VERSION, 0, 4, 0, 2)
> +AS_VERSION(gst-player, GST_PLAYER_VERSION, 0, 4, 0, 3)
>  PACKAGE=gst-player
>  AM_INIT_AUTOMAKE($PACKAGE,$VERSION)
>  AM_DISABLE_STATIC
> Index: libs/gst/play/play.c
> ===================================================================
> RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v
> retrieving revision 1.27
> diff -u -p -r1.27 play.c
> --- libs/gst/play/play.c	12 Sep 2002 21:10:29 -0000	1.27
> +++ libs/gst/play/play.c	25 Sep 2002 10:05:45 -0000
> @@ -1,3 +1,26 @@
> +/* GStreamer
> + * Copyright (C) 1999,2000,2001,2002 Erik Walthinsen <omega at cse.ogi.edu>
> + *                    2000,2001,2002 Wim Taymans <wtay at chello.be>
> + *                              2002 Steve Baker <steve at stevebaker.org>
> + *
> + * play.c: GstPlay object code
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Library General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Library General Public License for more details.
> + *
> + * You should have received a copy of the GNU Library General Public
> + * License along with this library; if not, write to the
> + * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
> + * Boston, MA 02111-1307, USA.
> + */
> +
>  #include "play.h"
>  
>  enum {
> @@ -74,6 +97,17 @@ static gboolean     gst_play_idle_callba
>  static gboolean     gst_play_get_length_callback    (GstPlay *play);
>  static gboolean     gst_play_tick_callback          (GstPlay *play);
>  
> +GQuark
> +gst_play_error_quark (void)
> +{
> +	static GQuark quark = 0;
> +	if (quark == 0) {
> +		quark = g_quark_from_static_string ("gst-play-error-quark");
> +	}
> +
> +	return quark;
> +}
> +
>  /* split static pipeline functions to a seperate file */
>  #include "playpipelines.c"
>  
> @@ -118,10 +152,12 @@ gst_play_class_init (GstPlayClass *klass
>  	gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_play_get_property);
>  
>  	g_object_class_install_property (gobject_class, ARG_LOCATION,
> -					 g_param_spec_string ("location", "location of file", "location of the file to play",
> -							      NULL, G_PARAM_READWRITE));
> +		g_param_spec_string ("location", "location of file", 
> +			             "location of the file to play",
> +				     NULL, G_PARAM_READWRITE));
>  	g_object_class_install_property (gobject_class, ARG_VOLUME,
> -					 g_param_spec_float ("volume", "Playing volume", "Playing volume", 
> +		g_param_spec_float ("volume", "Playing volume", 
> +			            "Playing volume", 
>  							     0, 1.0, 0, G_PARAM_READWRITE));
>  	g_object_class_install_property (gobject_class, ARG_MUTE,
>  					 g_param_spec_boolean ("mute", "Volume muted", "Playing volume muted",
> @@ -220,12 +256,13 @@ gst_play_init (GstPlay *play) 
>  }
>  
>  GstPlay *
> -gst_play_new (GstPlayPipeType pipe_type)
> +gst_play_new (GstPlayPipeType pipe_type, GError **error)
>  {
>  	GstPlay *play;
>  
>  	play = g_object_new (GST_TYPE_PLAY, NULL);
>  
> +	/* FIXME: looks like only VIDEO ever gets used ! */
>  	switch (pipe_type){
>  		case GST_PLAY_PIPE_VIDEO:
>  			play->setup_pipeline = gst_play_video_setup;
> @@ -260,9 +297,12 @@ gst_play_new (GstPlayPipeType pipe_type)
>  	}
>  
>  	/* init pipeline */
> -	if (play->setup_pipeline){
> -		if (! play->setup_pipeline(play)){
> -			g_warning ("couldn't init pipelie\n");
> +	if ((play->setup_pipeline) &&
> +	    (! play->setup_pipeline (play, error)))
> +	{
> +		if (*error)
> +		{
> +			g_print ("GError: %s\n", (*error)->message);
>  			return NULL;
>  		}
>  	}
> @@ -803,3 +843,7 @@ gst_play_get_mute (GstPlay *play)
>  
>  	return mute;
>  }
> +
> +/* modelines */
> +/* vim:set ts=8:sw=8:noet */
> +
> Index: libs/gst/play/play.h
> ===================================================================
> RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.h,v
> retrieving revision 1.16
> diff -u -p -r1.16 play.h
> --- libs/gst/play/play.h	9 Aug 2002 19:32:42 -0000	1.16
> +++ libs/gst/play/play.h	25 Sep 2002 10:05:45 -0000
> @@ -1,3 +1,27 @@
> +/* GStreamer
> + * Copyright (C) 1999,2000,2001,2002 Erik Walthinsen <omega at cse.ogi.edu>
> + *                    2000,2001,2002 Wim Taymans <wtay at chello.be>
> + *                              2002 Steve Baker <steve at stevebaker.org>
> + *
> + * play.h: GstPlay object code
> + *
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Library General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Library General Public License for more details.
> + *
> + * You should have received a copy of the GNU Library General Public
> + * License along with this library; if not, write to the
> + * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
> + * Boston, MA 02111-1307, USA.
> + */
> +
>  #ifndef __GSTPLAY_H__
>  #define __GSTPLAY_H__
>  
> @@ -30,6 +54,14 @@ typedef enum {
>  	GST_PLAY_PIPE_VIDEO,
>  } GstPlayPipeType;
>  
> +typedef enum {
> +	GST_PLAY_ERROR_GNOMEVFSSRC,
> +	GST_PLAY_ERROR_VOLUME,
> +	GST_PLAY_ERROR_LAST,
> +} GstPlayError;
> +
> +#define GST_PLAY_ERROR 		gst_play_error_quark ()
> +
>  #define GST_TYPE_PLAY            (gst_play_get_type())
>  #define GST_PLAY(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAY, GstPlay))
>  #define GST_PLAY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAY, GstPlayClass))
> @@ -48,7 +80,7 @@ struct _GstPlay
>  {
>  	GObject parent;
>  	
> -	gboolean (*setup_pipeline)     (GstPlay *play);
> +	gboolean (*setup_pipeline)     (GstPlay *play, GError **error);
>  	void (*teardown_pipeline)  (GstPlay *play);
>  	gboolean (*set_autoplugger)  (GstPlay *play, GstElement *autoplugger);
>  	gboolean (*set_video_sink)     (GstPlay *play, GstElement *videosink);
> @@ -109,7 +141,7 @@ struct _GstPlayIdleData
>  
>  GType	  gst_play_get_type	   (void);
>  
> -GstPlay*  gst_play_new		   (GstPlayPipeType pipe_type);
> +GstPlay*  gst_play_new		   (GstPlayPipeType pipe_type, GError **error);
>  
>  void      gst_play_seek_to_time (GstPlay *play, gint64 time_nanos);
>  
> @@ -134,3 +166,7 @@ gboolean  gst_play_get_mute        (GstP
>  void      gst_play_set_idle_timeout_funcs (GstPlay *play, GstPlayTimeoutAdd timeout_add_func, GstPlayIdleAdd idle_add_func);
>  
>  #endif /* __GSTPLAY_H__ */
> +
> +/* modelines */
> +/* vim:set ts=8:sw=8:noet */
> +
> Index: libs/gst/play/playpipelines.c
> ===================================================================
> RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/playpipelines.c,v
> retrieving revision 1.11
> diff -u -p -r1.11 playpipelines.c
> --- libs/gst/play/playpipelines.c	10 Sep 2002 17:02:45 -0000	1.11
> +++ libs/gst/play/playpipelines.c	25 Sep 2002 10:05:47 -0000
> @@ -1,24 +1,86 @@
> +/* GStreamer
> + * Copyright (C) 1999,2000,2001,2002 Erik Walthinsen <omega at cse.ogi.edu>
> + *                    2000,2001,2002 Wim Taymans <wtay at chello.be>
> + *                              2002 Steve Baker <steve at stevebaker.org>
> + *
> + * playpipelines.c: Set up pipelines for playback
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Library General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Library General Public License for more details.
> + *
> + * You should have received a copy of the GNU Library General Public
> + * License along with this library; if not, write to the
> + * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
> + * Boston, MA 02111-1307, USA.
> + */
> +
> +/* GError creation when plugin is missing */
> +static void
> +gst_play_error_plugin (GstPlayError type, GError **error)
> +{
> +	gchar *name;
> +	
> +	g_print ("error_plugin: start\n");
> +	if (error == NULL) return;
> +
> +	switch (type)
> +	{
> +		case GST_PLAY_ERROR_GNOMEVFSSRC:
> +			name = g_strdup ("gnomevfssrc");
> +			break;
> +		default:
> +			name = g_strdup ("unknown");
> +			break;
> +	}
> +	g_print ("error_plugin: name %s\n", name);
> +        *error = g_error_new (GST_PLAY_ERROR, type,
> +		  	      "The %s plug-in could not be found. "
> +			      "This plug-in is essential for gst-player. "
> +			      "Please install it and verify that it works "
> +			      "by running 'gst-inspect %s'", 
> +			      name, name);
> +	g_free (name);
> +	return;
> +}
>  
>  /*  
>   *  GST_PLAY_PIPE_AUDIO_THREADED
>   *  { gnomevfssrc ! spider ! volume ! osssink }
>   */
>  static gboolean 
> -gst_play_audiot_setup (GstPlay *play)
> +gst_play_audiot_setup (GstPlay *play, GError **error)
>  {
>  	play->pipeline = gst_thread_new ("main_pipeline");
>  	g_return_val_if_fail (GST_IS_THREAD (play->pipeline), FALSE);
> +
>  /*
>  	play->pipeline = gst_pipeline_new ("main_pipeline");
>  	g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE);
>  */
>  	/* create source element */
> -	play->source = gst_element_factory_make ("gnomevfssrc", "source");
> -	g_return_val_if_fail (play->source != NULL, FALSE);
> +	play->source = gst_element_factory_make ("nomevfssrc", "source");
> +	if (play->source == NULL)
> +	{
> +		gst_play_error_plugin (GST_PLAY_ERROR_GNOMEVFSSRC, error);
> +		return FALSE;
> +	}
>  	gst_bin_add (GST_BIN (play->pipeline), play->source);
>  	
>  	/* create audio elements */
>  	play->volume = gst_element_factory_make ("volume", "volume");
> +	if (play->source == NULL)
> +	{
> +		*error = g_error_new (GST_PLAY_ERROR, GST_PLAY_ERROR_VOLUME,
> +		  "The volume plug-in could not be found.");
> +		return FALSE;
> +	}
>  	if (play->volume == NULL)
>  	  g_warning ("You need the volume element to use this program.\n");
>  
> @@ -80,7 +142,7 @@ gst_play_audiot_set_auto (GstPlay *play,
>   *  { gnomevfssrc ! spider ! { queue ! volume ! osssink } }
>   */
>  static gboolean 
> -gst_play_audioht_setup (GstPlay *play)
> +gst_play_audioht_setup (GstPlay *play, GError **error)
>  {
>  	GstElement *audio_thread, *audio_queue;
>  /*
> @@ -182,7 +244,7 @@ gst_play_audioht_set_auto (GstPlay *play
>   */
>  
>  static gboolean 
> -gst_play_video_setup (GstPlay *play)
> +gst_play_video_setup (GstPlay *play, GError **error)
>  {
>  	GstElement *audio_bin, *audio_queue, *video_queue, *video_bin, *work_thread, *colorspace;
>  
> @@ -196,8 +258,12 @@ gst_play_video_setup (GstPlay *play)
>  	gst_bin_add (GST_BIN (play->pipeline), work_thread);
>  
>  	/* create source element */
> -	play->source = gst_element_factory_make ("gnomevfssrc", "source");
> -	g_return_val_if_fail (play->source != NULL, FALSE);
> +	play->source = gst_element_factory_make ("nomevfssrc", "source");
> +	if (play->source == NULL)
> +	{
> +		gst_play_error_plugin (GST_PLAY_ERROR_GNOMEVFSSRC, error);
> +		return FALSE;
> +	}
>  	gst_bin_add (GST_BIN (work_thread), play->source);
>  	
>  	play->volume = gst_element_factory_make ("volume", "volume");
> @@ -357,7 +423,7 @@ gst_play_video_set_audio (GstPlay *play,
>   * (note that the xvideosink is not contained by a thread)
>   */
>  static gboolean 
> -gst_play_videots_setup (GstPlay *play)
> +gst_play_videots_setup (GstPlay *play, GError **error)
>  {
>  	GstElement *audio_bin, *audio_queue, *video_queue, *auto_identity, *work_thread;
>  
> @@ -507,6 +573,9 @@ gst_play_videots_set_audio (GstPlay *pla
>  	gst_bin_add (GST_BIN (audio_bin), play->audio_sink);
>  	gst_element_connect (play->volume, play->audio_sink);
>  
> +
>  	return TRUE;
>  }
>  
> +/* modelines */
> +/* vim:set ts=8:sw=8:noet */
> Index: libs/gst/player/gstmediaplay.c
> ===================================================================
> RCS file: /cvsroot/gstreamer/gst-player/libs/gst/player/gstmediaplay.c,v
> retrieving revision 1.62.2.1
> diff -u -p -r1.62.2.1 gstmediaplay.c
> --- libs/gst/player/gstmediaplay.c	23 Sep 2002 00:08:00 -0000	1.62.2.1
> +++ libs/gst/player/gstmediaplay.c	25 Sep 2002 10:05:47 -0000
> @@ -122,9 +122,26 @@ static void
>  gst_media_play_init (GstMediaPlay *mplay)
>  {
>  	GstElement *audio_sink, *video_sink;
> +	GError *error = NULL;
>  	
>  	/* play object */
> -	mplay->play = gst_play_new (GST_PLAY_PIPE_VIDEO);
> +	mplay->play = gst_play_new (GST_PLAY_PIPE_VIDEO, &error);
> +	if (error != NULL)
> +	{
> +		GtkWidget *dialog;
> +		/* throw up a dialog box; FIXME: we don't have a parent */
> +		/* FIXME: maybe even fallback the GError and do error
> +		 * handling higher up ? */
> +		dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR,
> +					         GTK_BUTTONS_CLOSE,
> +						 error->message);
> +		g_error_free (error);
> +		gtk_widget_show (dialog);
> +		g_signal_connect_swapped (GTK_OBJECT (dialog), "response",
> +					  G_CALLBACK (gtk_widget_destroy),
> +					  GTK_OBJECT (dialog));
> +
> +	}
>  	g_return_if_fail(mplay->play != NULL);
>  
>  	/*audio_sink = gst_gconf_render_bin_from_key("osssink fragment=1572872");*/
> Index: tests/gstcmdplay.c
> ===================================================================
> RCS file: /cvsroot/gstreamer/gst-player/tests/gstcmdplay.c,v
> retrieving revision 1.5
> diff -u -p -r1.5 gstcmdplay.c
> --- tests/gstcmdplay.c	11 Jul 2002 16:54:21 -0000	1.5
> +++ tests/gstcmdplay.c	25 Sep 2002 10:05:47 -0000
> @@ -142,7 +142,7 @@ int main(int argc,char *argv[]) 
>  
>  	cmdplay = g_new0(GstCmdPlay, 1);
>  
> -	cmdplay->play = gst_play_new(PLAY_PIPELINE);
> +	cmdplay->play = gst_play_new(PLAY_PIPELINE, NULL);
>  	g_assert (cmdplay->play != NULL);
>  
>  	






More information about the gstreamer-devel mailing list