- added a property to force a failure for a given state transition.
authorWim Taymans <wim.taymans@gmail.com>
Tue, 3 Jun 2003 20:22:52 +0000 (20:22 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Tue, 3 Jun 2003 20:22:52 +0000 (20:22 +0000)
Original commit message from CVS:
- added a property to force a failure for a given state transition.

gst/elements/gstfakesink.c
gst/elements/gstfakesink.h
plugins/elements/gstfakesink.c
plugins/elements/gstfakesink.h

index 1344751..444d00a 100644 (file)
@@ -44,6 +44,7 @@ enum {
 
 enum {
   ARG_0,
+  ARG_STATE_ERROR,
   ARG_NUM_SINKS,
   ARG_SILENT,
   ARG_DUMP,
@@ -58,6 +59,26 @@ GST_PAD_TEMPLATE_FACTORY (fakesink_sink_factory,
   NULL                  /* no caps */
 );
 
+#define GST_TYPE_FAKESINK_STATE_ERROR (gst_fakesink_state_error_get_type())
+static GType
+gst_fakesink_state_error_get_type (void)
+{
+  static GType fakesink_state_error_type = 0;
+  static GEnumValue fakesink_state_error[] = {
+    { FAKESINK_STATE_ERROR_NONE,           "0", "No state change errors"},
+    { FAKESINK_STATE_ERROR_NULL_READY,     "1", "Fail state change from NULL to READY"},
+    { FAKESINK_STATE_ERROR_READY_PAUSED,   "2", "Fail state change from READY to PAUSED"},
+    { FAKESINK_STATE_ERROR_PAUSED_PLAYING, "3", "Fail state change from PAUSED to PLAYING"},
+    { FAKESINK_STATE_ERROR_PLAYING_PAUSED, "4", "Fail state change from PLAYING to PAUSED"},
+    { FAKESINK_STATE_ERROR_PAUSED_READY  , "5", "Fail state change from PAUSED to READY"},
+    { FAKESINK_STATE_ERROR_READY_NULL    , "6", "Fail state change from READY to NULL"},
+    {0, NULL, NULL},
+  };
+  if (!fakesink_state_error_type) {
+    fakesink_state_error_type = g_enum_register_static ("GstFakeSinkStateError", fakesink_state_error);
+  }
+  return fakesink_state_error_type;
+}
 
 static void    gst_fakesink_class_init         (GstFakeSinkClass *klass);
 static void    gst_fakesink_init               (GstFakeSink *fakesink);
@@ -71,6 +92,9 @@ static void   gst_fakesink_set_property       (GObject *object, guint prop_id,
 static void    gst_fakesink_get_property       (GObject *object, guint prop_id, 
                                                 GValue *value, GParamSpec *pspec);
 
+static GstElementStateReturn
+               gst_fakesink_change_state       (GstElement *element);
+
 static void    gst_fakesink_chain              (GstPad *pad, GstBuffer *buf);
 
 static GstElementClass *parent_class = NULL;
@@ -111,6 +135,9 @@ gst_fakesink_class_init (GstFakeSinkClass *klass)
   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NUM_SINKS,
     g_param_spec_int ("num_sinks", "Number of sinks", "The number of sinkpads",
                       1, G_MAXINT, 1, G_PARAM_READABLE)); 
+  g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_STATE_ERROR,
+    g_param_spec_enum ("state_error", "State Error", "Generate a state change error",
+                       GST_TYPE_FAKESINK_STATE_ERROR, FAKESINK_STATE_ERROR_NONE, G_PARAM_READWRITE));
   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LAST_MESSAGE,
     g_param_spec_string ("last_message", "Last Message", "The message describing current status",
                          NULL, G_PARAM_READABLE));
@@ -135,6 +162,7 @@ gst_fakesink_class_init (GstFakeSinkClass *klass)
 
   gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_fakesink_request_new_pad);
   gstelement_class->set_clock       = GST_DEBUG_FUNCPTR (gst_fakesink_set_clock);
+  gstelement_class->change_state    = GST_DEBUG_FUNCPTR (gst_fakesink_change_state);
 }
 
 static void 
@@ -150,6 +178,7 @@ gst_fakesink_init (GstFakeSink *fakesink)
   fakesink->dump = FALSE;
   fakesink->sync = FALSE;
   fakesink->last_message = NULL;
+  fakesink->state_error = FAKESINK_STATE_ERROR_NONE;
 
   GST_FLAG_SET (fakesink, GST_ELEMENT_EVENT_AWARE);
 }
@@ -202,6 +231,9 @@ gst_fakesink_set_property (GObject *object, guint prop_id, const GValue *value,
     case ARG_SILENT:
       sink->silent = g_value_get_boolean (value);
       break;
+    case ARG_STATE_ERROR:
+      sink->state_error = g_value_get_enum (value);
+      break;
     case ARG_DUMP:
       sink->dump = g_value_get_boolean (value);
       break;
@@ -227,6 +259,9 @@ gst_fakesink_get_property (GObject *object, guint prop_id, GValue *value, GParam
     case ARG_NUM_SINKS:
       g_value_set_int (value, GST_ELEMENT (sink)->numsinkpads);
       break;
+    case ARG_STATE_ERROR:
+      g_value_set_enum (value, sink->state_error);
+      break;
     case ARG_SILENT:
       g_value_set_boolean (value, sink->silent);
       break;
@@ -313,6 +348,48 @@ gst_fakesink_chain (GstPad *pad, GstBuffer *buf)
   gst_buffer_unref (buf);
 }
 
+static GstElementStateReturn
+gst_fakesink_change_state (GstElement *element)
+{
+  GstFakeSink *fakesink = GST_FAKESINK (element);
+
+  switch (GST_STATE_TRANSITION (element)) {
+    case GST_STATE_NULL_TO_READY:
+      if (fakesink->state_error == FAKESINK_STATE_ERROR_NULL_READY)
+       goto error;
+      break;
+    case GST_STATE_READY_TO_PAUSED:
+      if (fakesink->state_error == FAKESINK_STATE_ERROR_READY_PAUSED)
+       goto error;
+      break;
+    case GST_STATE_PAUSED_TO_PLAYING:
+      if (fakesink->state_error == FAKESINK_STATE_ERROR_PAUSED_PLAYING)
+       goto error;
+      break;
+    case GST_STATE_PLAYING_TO_PAUSED:
+      if (fakesink->state_error == FAKESINK_STATE_ERROR_PLAYING_PAUSED)
+       goto error;
+      break;
+    case GST_STATE_PAUSED_TO_READY:
+      if (fakesink->state_error == FAKESINK_STATE_ERROR_PAUSED_READY)
+       goto error;
+      break;
+    case GST_STATE_READY_TO_NULL:
+      if (fakesink->state_error == FAKESINK_STATE_ERROR_READY_NULL)
+       goto error;
+      break;
+  }
+
+  if (GST_ELEMENT_CLASS (parent_class)->change_state)
+    return GST_ELEMENT_CLASS (parent_class)->change_state (element);
+
+  return GST_STATE_SUCCESS;
+
+error:
+  gst_element_error (element, "failed state change as requested");
+  return GST_STATE_FAILURE;
+}
+
 gboolean
 gst_fakesink_factory_init (GstElementFactory *factory)
 {
index 94a9b2a..6d2efe1 100644 (file)
@@ -44,6 +44,16 @@ GstElementDetails gst_fakesink_details;
 #define GST_IS_FAKESINK_CLASS(obj) \
   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FAKESINK))
 
+typedef enum {
+  FAKESINK_STATE_ERROR_NONE = 0,
+  FAKESINK_STATE_ERROR_NULL_READY,
+  FAKESINK_STATE_ERROR_READY_PAUSED,
+  FAKESINK_STATE_ERROR_PAUSED_PLAYING,
+  FAKESINK_STATE_ERROR_PLAYING_PAUSED,
+  FAKESINK_STATE_ERROR_PAUSED_READY,
+  FAKESINK_STATE_ERROR_READY_NULL,
+} GstFakeSinkStateError;
+
 typedef struct _GstFakeSink GstFakeSink;
 typedef struct _GstFakeSinkClass GstFakeSinkClass;
 
@@ -54,6 +64,7 @@ struct _GstFakeSink {
   gboolean      dump;
   gboolean      sync;
   GstClock     *clock;
+  GstFakeSinkStateError state_error;
 
   gchar        *last_message;
 };
index 1344751..444d00a 100644 (file)
@@ -44,6 +44,7 @@ enum {
 
 enum {
   ARG_0,
+  ARG_STATE_ERROR,
   ARG_NUM_SINKS,
   ARG_SILENT,
   ARG_DUMP,
@@ -58,6 +59,26 @@ GST_PAD_TEMPLATE_FACTORY (fakesink_sink_factory,
   NULL                  /* no caps */
 );
 
+#define GST_TYPE_FAKESINK_STATE_ERROR (gst_fakesink_state_error_get_type())
+static GType
+gst_fakesink_state_error_get_type (void)
+{
+  static GType fakesink_state_error_type = 0;
+  static GEnumValue fakesink_state_error[] = {
+    { FAKESINK_STATE_ERROR_NONE,           "0", "No state change errors"},
+    { FAKESINK_STATE_ERROR_NULL_READY,     "1", "Fail state change from NULL to READY"},
+    { FAKESINK_STATE_ERROR_READY_PAUSED,   "2", "Fail state change from READY to PAUSED"},
+    { FAKESINK_STATE_ERROR_PAUSED_PLAYING, "3", "Fail state change from PAUSED to PLAYING"},
+    { FAKESINK_STATE_ERROR_PLAYING_PAUSED, "4", "Fail state change from PLAYING to PAUSED"},
+    { FAKESINK_STATE_ERROR_PAUSED_READY  , "5", "Fail state change from PAUSED to READY"},
+    { FAKESINK_STATE_ERROR_READY_NULL    , "6", "Fail state change from READY to NULL"},
+    {0, NULL, NULL},
+  };
+  if (!fakesink_state_error_type) {
+    fakesink_state_error_type = g_enum_register_static ("GstFakeSinkStateError", fakesink_state_error);
+  }
+  return fakesink_state_error_type;
+}
 
 static void    gst_fakesink_class_init         (GstFakeSinkClass *klass);
 static void    gst_fakesink_init               (GstFakeSink *fakesink);
@@ -71,6 +92,9 @@ static void   gst_fakesink_set_property       (GObject *object, guint prop_id,
 static void    gst_fakesink_get_property       (GObject *object, guint prop_id, 
                                                 GValue *value, GParamSpec *pspec);
 
+static GstElementStateReturn
+               gst_fakesink_change_state       (GstElement *element);
+
 static void    gst_fakesink_chain              (GstPad *pad, GstBuffer *buf);
 
 static GstElementClass *parent_class = NULL;
@@ -111,6 +135,9 @@ gst_fakesink_class_init (GstFakeSinkClass *klass)
   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NUM_SINKS,
     g_param_spec_int ("num_sinks", "Number of sinks", "The number of sinkpads",
                       1, G_MAXINT, 1, G_PARAM_READABLE)); 
+  g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_STATE_ERROR,
+    g_param_spec_enum ("state_error", "State Error", "Generate a state change error",
+                       GST_TYPE_FAKESINK_STATE_ERROR, FAKESINK_STATE_ERROR_NONE, G_PARAM_READWRITE));
   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LAST_MESSAGE,
     g_param_spec_string ("last_message", "Last Message", "The message describing current status",
                          NULL, G_PARAM_READABLE));
@@ -135,6 +162,7 @@ gst_fakesink_class_init (GstFakeSinkClass *klass)
 
   gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_fakesink_request_new_pad);
   gstelement_class->set_clock       = GST_DEBUG_FUNCPTR (gst_fakesink_set_clock);
+  gstelement_class->change_state    = GST_DEBUG_FUNCPTR (gst_fakesink_change_state);
 }
 
 static void 
@@ -150,6 +178,7 @@ gst_fakesink_init (GstFakeSink *fakesink)
   fakesink->dump = FALSE;
   fakesink->sync = FALSE;
   fakesink->last_message = NULL;
+  fakesink->state_error = FAKESINK_STATE_ERROR_NONE;
 
   GST_FLAG_SET (fakesink, GST_ELEMENT_EVENT_AWARE);
 }
@@ -202,6 +231,9 @@ gst_fakesink_set_property (GObject *object, guint prop_id, const GValue *value,
     case ARG_SILENT:
       sink->silent = g_value_get_boolean (value);
       break;
+    case ARG_STATE_ERROR:
+      sink->state_error = g_value_get_enum (value);
+      break;
     case ARG_DUMP:
       sink->dump = g_value_get_boolean (value);
       break;
@@ -227,6 +259,9 @@ gst_fakesink_get_property (GObject *object, guint prop_id, GValue *value, GParam
     case ARG_NUM_SINKS:
       g_value_set_int (value, GST_ELEMENT (sink)->numsinkpads);
       break;
+    case ARG_STATE_ERROR:
+      g_value_set_enum (value, sink->state_error);
+      break;
     case ARG_SILENT:
       g_value_set_boolean (value, sink->silent);
       break;
@@ -313,6 +348,48 @@ gst_fakesink_chain (GstPad *pad, GstBuffer *buf)
   gst_buffer_unref (buf);
 }
 
+static GstElementStateReturn
+gst_fakesink_change_state (GstElement *element)
+{
+  GstFakeSink *fakesink = GST_FAKESINK (element);
+
+  switch (GST_STATE_TRANSITION (element)) {
+    case GST_STATE_NULL_TO_READY:
+      if (fakesink->state_error == FAKESINK_STATE_ERROR_NULL_READY)
+       goto error;
+      break;
+    case GST_STATE_READY_TO_PAUSED:
+      if (fakesink->state_error == FAKESINK_STATE_ERROR_READY_PAUSED)
+       goto error;
+      break;
+    case GST_STATE_PAUSED_TO_PLAYING:
+      if (fakesink->state_error == FAKESINK_STATE_ERROR_PAUSED_PLAYING)
+       goto error;
+      break;
+    case GST_STATE_PLAYING_TO_PAUSED:
+      if (fakesink->state_error == FAKESINK_STATE_ERROR_PLAYING_PAUSED)
+       goto error;
+      break;
+    case GST_STATE_PAUSED_TO_READY:
+      if (fakesink->state_error == FAKESINK_STATE_ERROR_PAUSED_READY)
+       goto error;
+      break;
+    case GST_STATE_READY_TO_NULL:
+      if (fakesink->state_error == FAKESINK_STATE_ERROR_READY_NULL)
+       goto error;
+      break;
+  }
+
+  if (GST_ELEMENT_CLASS (parent_class)->change_state)
+    return GST_ELEMENT_CLASS (parent_class)->change_state (element);
+
+  return GST_STATE_SUCCESS;
+
+error:
+  gst_element_error (element, "failed state change as requested");
+  return GST_STATE_FAILURE;
+}
+
 gboolean
 gst_fakesink_factory_init (GstElementFactory *factory)
 {
index 94a9b2a..6d2efe1 100644 (file)
@@ -44,6 +44,16 @@ GstElementDetails gst_fakesink_details;
 #define GST_IS_FAKESINK_CLASS(obj) \
   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FAKESINK))
 
+typedef enum {
+  FAKESINK_STATE_ERROR_NONE = 0,
+  FAKESINK_STATE_ERROR_NULL_READY,
+  FAKESINK_STATE_ERROR_READY_PAUSED,
+  FAKESINK_STATE_ERROR_PAUSED_PLAYING,
+  FAKESINK_STATE_ERROR_PLAYING_PAUSED,
+  FAKESINK_STATE_ERROR_PAUSED_READY,
+  FAKESINK_STATE_ERROR_READY_NULL,
+} GstFakeSinkStateError;
+
 typedef struct _GstFakeSink GstFakeSink;
 typedef struct _GstFakeSinkClass GstFakeSinkClass;
 
@@ -54,6 +64,7 @@ struct _GstFakeSink {
   gboolean      dump;
   gboolean      sync;
   GstClock     *clock;
+  GstFakeSinkStateError state_error;
 
   gchar        *last_message;
 };