diff options
author | Tim-Philipp Müller <tim@centricular.net> | 2006-06-16 15:17:44 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.net> | 2006-06-16 15:17:44 +0000 |
commit | ab841287a7e1a3783f2e37b18730b028dbdfcfd7 (patch) | |
tree | f2dec6f539f33b21637632c5db8a7b1cb0192b6b /gst | |
parent | 384fe0bda8cd99c6d64168c73cd6ca433cfa0a24 (diff) | |
download | gst-plugins-bad-ab841287a7e1a3783f2e37b18730b028dbdfcfd7.tar.gz gst-plugins-bad-ab841287a7e1a3783f2e37b18730b028dbdfcfd7.tar.bz2 gst-plugins-bad-ab841287a7e1a3783f2e37b18730b028dbdfcfd7.zip |
gst/audioresample/gstaudioresample.c: Implement GstBaseTransform::start and ::stop so that audioresample can clear it...
Original commit message from CVS:
* gst/audioresample/gstaudioresample.c:
(gst_audioresample_class_init), (gst_audioresample_init),
(audioresample_start), (audioresample_stop),
(gst_audioresample_set_property), (gst_audioresample_get_property):
Implement GstBaseTransform::start and ::stop so that audioresample
can clear its internal state properly and be reused insted of
causing non-negotiated errors with playbin under some circumstances
(#342789).
* tests/check/elements/audioresample.c: (setup_audioresample),
(cleanup_audioresample):
Need to set element state here so that ::start and ::stop are
called.
Diffstat (limited to 'gst')
-rw-r--r-- | gst/audioresample/gstaudioresample.c | 53 |
1 files changed, 28 insertions, 25 deletions
diff --git a/gst/audioresample/gstaudioresample.c b/gst/audioresample/gstaudioresample.c index 3304f274..732ada70 100644 --- a/gst/audioresample/gstaudioresample.c +++ b/gst/audioresample/gstaudioresample.c @@ -60,13 +60,6 @@ GST_ELEMENT_DETAILS ("Audio scaler", "Resample audio", "David Schleef <ds@schleef.org>"); -/* GstAudioresample signals and args */ -enum -{ - /* FILL ME */ - LAST_SIGNAL -}; - #define DEFAULT_FILTERLEN 16 enum @@ -111,8 +104,6 @@ static GstStaticPadTemplate gst_audioresample_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, SUPPORTED_CAPS); -static void gst_audioresample_dispose (GObject * object); - static void gst_audioresample_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audioresample_get_property (GObject * object, @@ -133,8 +124,8 @@ static GstFlowReturn audioresample_pushthrough (GstAudioresample * static GstFlowReturn audioresample_transform (GstBaseTransform * base, GstBuffer * inbuf, GstBuffer * outbuf); static gboolean audioresample_event (GstBaseTransform * base, GstEvent * event); - -/*static guint gst_audioresample_signals[LAST_SIGNAL] = { 0 }; */ +static gboolean audioresample_start (GstBaseTransform * base); +static gboolean audioresample_stop (GstBaseTransform * base); #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (audioresample_debug, "audioresample", 0, "audio resampling element"); @@ -164,13 +155,16 @@ gst_audioresample_class_init (GstAudioresampleClass * klass) gobject_class->set_property = gst_audioresample_set_property; gobject_class->get_property = gst_audioresample_get_property; - gobject_class->dispose = gst_audioresample_dispose; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FILTERLEN, g_param_spec_int ("filter_length", "filter_length", "filter_length", 0, G_MAXINT, DEFAULT_FILTERLEN, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + GST_BASE_TRANSFORM_CLASS (klass)->start = + GST_DEBUG_FUNCPTR (audioresample_start); + GST_BASE_TRANSFORM_CLASS (klass)->stop = + GST_DEBUG_FUNCPTR (audioresample_stop); GST_BASE_TRANSFORM_CLASS (klass)->transform_size = GST_DEBUG_FUNCPTR (audioresample_transform_size); GST_BASE_TRANSFORM_CLASS (klass)->get_unit_size = @@ -191,7 +185,6 @@ static void gst_audioresample_init (GstAudioresample * audioresample, GstAudioresampleClass * klass) { - ResampleState *r; GstBaseTransform *trans; trans = GST_BASE_TRANSFORM (audioresample); @@ -200,29 +193,39 @@ gst_audioresample_init (GstAudioresample * audioresample, * is trivial in the passtrough case. */ gst_pad_set_bufferalloc_function (trans->sinkpad, NULL); - r = resample_new (); - audioresample->resample = r; + audioresample->filter_length = DEFAULT_FILTERLEN; +} + +/* vmethods */ +static gboolean +audioresample_start (GstBaseTransform * base) +{ + GstAudioresample *audioresample = GST_AUDIORESAMPLE (base); + + audioresample->resample = resample_new (); audioresample->ts_offset = -1; audioresample->offset = -1; audioresample->next_ts = -1; - resample_set_filter_length (r, DEFAULT_FILTERLEN); + resample_set_filter_length (audioresample->resample, + audioresample->filter_length); + + return TRUE; } -static void -gst_audioresample_dispose (GObject * object) +static gboolean +audioresample_stop (GstBaseTransform * base) { - GstAudioresample *audioresample = GST_AUDIORESAMPLE (object); + GstAudioresample *audioresample = GST_AUDIORESAMPLE (base); if (audioresample->resample) { resample_free (audioresample->resample); audioresample->resample = NULL; } - G_OBJECT_CLASS (parent_class)->dispose (object); + return TRUE; } -/* vmethods */ gboolean audioresample_get_unit_size (GstBaseTransform * base, GstCaps * caps, guint * size) @@ -639,7 +642,6 @@ gst_audioresample_set_property (GObject * object, guint prop_id, { GstAudioresample *audioresample; - g_return_if_fail (GST_IS_AUDIORESAMPLE (object)); audioresample = GST_AUDIORESAMPLE (object); switch (prop_id) { @@ -647,8 +649,10 @@ gst_audioresample_set_property (GObject * object, guint prop_id, audioresample->filter_length = g_value_get_int (value); GST_DEBUG_OBJECT (GST_ELEMENT (audioresample), "new filter length %d", audioresample->filter_length); - resample_set_filter_length (audioresample->resample, - audioresample->filter_length); + if (audioresample->resample) { + resample_set_filter_length (audioresample->resample, + audioresample->filter_length); + } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -662,7 +666,6 @@ gst_audioresample_get_property (GObject * object, guint prop_id, { GstAudioresample *audioresample; - g_return_if_fail (GST_IS_AUDIORESAMPLE (object)); audioresample = GST_AUDIORESAMPLE (object); switch (prop_id) { |