media: add signal to notify of state changes

This commit is contained in:
Wim Taymans 2010-12-28 18:34:10 +01:00
parent 43f4696f78
commit 915cd708ea
2 changed files with 22 additions and 8 deletions

View file

@ -48,6 +48,7 @@ enum
{ {
SIGNAL_PREPARED, SIGNAL_PREPARED,
SIGNAL_UNPREPARED, SIGNAL_UNPREPARED,
SIGNAL_NEW_STATE,
SIGNAL_LAST SIGNAL_LAST
}; };
@ -114,6 +115,11 @@ gst_rtsp_media_class_init (GstRTSPMediaClass * klass)
G_STRUCT_OFFSET (GstRTSPMediaClass, unprepared), NULL, NULL, G_STRUCT_OFFSET (GstRTSPMediaClass, unprepared), NULL, NULL,
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE);
gst_rtsp_media_signals[SIGNAL_NEW_STATE] =
g_signal_new ("new-state", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GstRTSPMediaClass, new_state), NULL, NULL,
g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 0, G_TYPE_INT);
klass->context = g_main_context_new (); klass->context = g_main_context_new ();
klass->loop = g_main_loop_new (klass->context, TRUE); klass->loop = g_main_loop_new (klass->context, TRUE);
@ -1888,16 +1894,22 @@ gst_rtsp_media_set_state (GstRTSPMedia * media, GstState state,
else else
do_state = FALSE; do_state = FALSE;
GST_INFO ("active %d media %p", media->active, media); GST_INFO ("state %d active %d media %p do_state %d", state, media->active,
media, do_state);
if (do_state && media->target_state != state) { if (media->target_state != state) {
if (state == GST_STATE_NULL) { if (do_state) {
gst_rtsp_media_unprepare (media); if (state == GST_STATE_NULL) {
} else { gst_rtsp_media_unprepare (media);
GST_INFO ("state %s media %p", gst_element_state_get_name (state), media); } else {
media->target_state = state; GST_INFO ("state %s media %p", gst_element_state_get_name (state),
ret = gst_element_set_state (media->pipeline, state); media);
media->target_state = state;
ret = gst_element_set_state (media->pipeline, state);
}
} }
g_signal_emit (media, gst_rtsp_media_signals[SIGNAL_NEW_STATE], 0, state,
NULL);
} }
/* remember where we are */ /* remember where we are */

View file

@ -252,6 +252,8 @@ struct _GstRTSPMediaClass {
/* signals */ /* signals */
gboolean (*prepared) (GstRTSPMedia *media); gboolean (*prepared) (GstRTSPMedia *media);
gboolean (*unprepared) (GstRTSPMedia *media); gboolean (*unprepared) (GstRTSPMedia *media);
gboolean (*new_state) (GstRTSPMedia *media, GstState state);
}; };
GType gst_rtsp_media_get_type (void); GType gst_rtsp_media_get_type (void);