diff --git a/ges/ges-audio-transition.c b/ges/ges-audio-transition.c index f566770d69..935d0e3329 100644 --- a/ges/ges-audio-transition.c +++ b/ges/ges-audio-transition.c @@ -64,6 +64,13 @@ static void ges_audio_transition_get_property (GObject * object, guint static void ges_audio_transition_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec); +static void +duration_changed_cb (GESTrackElement * self, GParamSpec * arg G_GNUC_UNUSED) +{ + ges_audio_transition_duration_changed (self, + ges_timeline_element_get_duration (GES_TIMELINE_ELEMENT (self))); +} + static void ges_audio_transition_class_init (GESAudioTransitionClass * klass) { @@ -80,8 +87,6 @@ ges_audio_transition_class_init (GESAudioTransitionClass * klass) object_class->dispose = ges_audio_transition_dispose; object_class->finalize = ges_audio_transition_finalize; - toclass->duration_changed = ges_audio_transition_duration_changed; - toclass->create_element = ges_audio_transition_create_element; } @@ -113,6 +118,9 @@ ges_audio_transition_dispose (GObject * object) self->priv->b_control_source = NULL; } + g_signal_handlers_disconnect_by_func (GES_TRACK_ELEMENT (self), + duration_changed_cb, NULL); + G_OBJECT_CLASS (ges_audio_transition_parent_class)->dispose (object); } @@ -225,6 +233,9 @@ ges_audio_transition_create_element (GESTrackElement * track_element) ges_timeline_element_get_duration (GES_TIMELINE_ELEMENT (track_element)); ges_audio_transition_duration_changed (track_element, duration); + g_signal_connect (track_element, "notify::duration", + G_CALLBACK (duration_changed_cb), NULL); + gst_object_add_control_binding (GST_OBJECT (atarget), gst_direct_control_binding_new (GST_OBJECT (atarget), propname, acontrol_source)); diff --git a/ges/ges-track-element.h b/ges/ges-track-element.h index 40a9a10f9d..19149d70e5 100644 --- a/ges/ges-track-element.h +++ b/ges/ges-track-element.h @@ -74,7 +74,6 @@ struct _GESTrackElement { * @gnlobject_factorytype: name of the GNonLin GStElementFactory type to use. * @create_gnl_object: method to create the GNonLin container object. * @create_element: method to return the GstElement to put in the gnlobject. - * @duration_changed: duration property glnobject has changed * @active_changed: active property of gnlobject has changed * @get_props_hastable: method to list children properties that user could like * to configure. Since: 0.10.2 @@ -97,7 +96,6 @@ struct _GESTrackElementClass { GstElement* (*create_gnl_object) (GESTrackElement * object); GstElement* (*create_element) (GESTrackElement * object); - void (*duration_changed) (GESTrackElement *object, guint64 duration); void (*active_changed) (GESTrackElement *object, gboolean active); /*< private >*/ diff --git a/ges/ges-video-transition.c b/ges/ges-video-transition.c index 3addd69d92..7132ba2000 100644 --- a/ges/ges-video-transition.c +++ b/ges/ges-video-transition.c @@ -103,6 +103,13 @@ static void ges_video_transition_get_property (GObject * object, guint static void ges_video_transition_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec); +static void +duration_changed_cb (GESTrackElement * self, GParamSpec * arg G_GNUC_UNUSED) +{ + ges_video_transition_duration_changed (self, + ges_timeline_element_get_duration (GES_TIMELINE_ELEMENT (self))); +} + static void ges_video_transition_class_init (GESVideoTransitionClass * klass) { @@ -156,7 +163,6 @@ ges_video_transition_class_init (GESVideoTransitionClass * klass) properties[PROP_INVERT]); toclass = GES_TRACK_ELEMENT_CLASS (klass); - toclass->duration_changed = ges_video_transition_duration_changed; toclass->create_element = ges_video_transition_create_element; } @@ -213,6 +219,9 @@ ges_video_transition_dispose (GObject * object) priv->mixer = NULL; } + g_signal_handlers_disconnect_by_func (GES_TRACK_ELEMENT (self), + duration_changed_cb, NULL); + G_OBJECT_CLASS (ges_video_transition_parent_class)->dispose (object); } @@ -423,6 +432,9 @@ ges_video_transition_create_element (GESTrackElement * object) priv->topbin = topbin; priv->type = priv->pending_type; + g_signal_connect (object, "notify::duration", + G_CALLBACK (duration_changed_cb), NULL); + return topbin; }