audioresample: Add locking to protect the resampling context
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Sun, 15 Feb 2009 06:30:17 +0000 (07:30 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Sun, 15 Feb 2009 06:30:17 +0000 (07:30 +0100)
When setting the quality/filter-length while PLAYING the
resampling context will be destroyed and created again in
some cases, which will cause crashes in the transform function
if it's called at that time.

gst/audioresample/gstaudioresample.c

index ee4c757..308f7ab 100644 (file)
@@ -1174,16 +1174,19 @@ gst_audio_resample_set_property (GObject * object, guint prop_id,
 
   switch (prop_id) {
     case PROP_QUALITY:
+      GST_BASE_TRANSFORM_LOCK (resample);
       resample->quality = g_value_get_int (value);
       GST_DEBUG_OBJECT (resample, "new quality %d", resample->quality);
 
       gst_audio_resample_update_state (resample, resample->width,
           resample->channels, resample->inrate, resample->outrate,
           resample->quality, resample->fp);
+      GST_BASE_TRANSFORM_UNLOCK (resample);
       break;
     case PROP_FILTER_LENGTH:{
       gint filter_length = g_value_get_int (value);
 
+      GST_BASE_TRANSFORM_LOCK (resample);
       if (filter_length <= 8)
         resample->quality = 0;
       else if (filter_length <= 16)
@@ -1212,6 +1215,7 @@ gst_audio_resample_set_property (GObject * object, guint prop_id,
       gst_audio_resample_update_state (resample, resample->width,
           resample->channels, resample->inrate, resample->outrate,
           resample->quality, resample->fp);
+      GST_BASE_TRANSFORM_UNLOCK (resample);
       break;
     }
     default: