fix a potential crash while changing algorithm
authorjait <jari.tenhunen@iki.fi>
Wed, 16 Sep 2009 15:23:34 +0000 (15:23 +0000)
committerjait <jari.tenhunen@iki.fi>
Wed, 16 Sep 2009 15:23:34 +0000 (15:23 +0000)
git-svn-id: file:///svnroot/tunertool/trunk@29 4bb5ff34-d565-4b58-9699-12000fa1827a

src/gstpitch.c
src/gstpitch.h

index 7a2acc4..395cacd 100644 (file)
@@ -169,9 +169,10 @@ gst_pitch_class_init (GstPitchClass * klass)
 }
 
 static void
-gst_pitch_setup_algorithm (GstPitch * filter)
+gst_pitch_setup_algorithm (GstPitch * filter, GstPitchAlgorithm algorithm)
 {
-  if (filter->algorithm == GST_PITCH_ALGORITHM_HPS) {
+  g_mutex_lock (filter->mutex);
+  if (algorithm == GST_PITCH_ALGORITHM_HPS) {
     if (NULL == filter->module)
       filter->module = (gint *) g_malloc (RATE * sizeof (gint));
   }
@@ -181,6 +182,8 @@ gst_pitch_setup_algorithm (GstPitch * filter)
 
     filter->module = NULL;
   }
+  filter->algorithm = algorithm;
+  g_mutex_unlock (filter->mutex);
 }
 
 static void
@@ -191,8 +194,9 @@ gst_pitch_init (GstPitch * filter, GstPitchClass * klass)
   filter->minfreq = 30;
   filter->maxfreq = 1500;
   filter->message = TRUE;
-  filter->algorithm = DEFAULT_PROP_ALGORITHM;
-  gst_pitch_setup_algorithm (filter);
+  filter->mutex = g_mutex_new ();
+    
+  gst_pitch_setup_algorithm (filter, DEFAULT_PROP_ALGORITHM);
 }
 
 static void
@@ -211,6 +215,8 @@ gst_pitch_dispose (GObject * object)
   if (filter->module)
     g_free (filter->module);
 
+  g_mutex_free (filter->mutex);
+
   kiss_fft_cleanup ();
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
@@ -233,8 +239,7 @@ gst_pitch_set_property (GObject * object, guint prop_id,
       filter->maxfreq = g_value_get_int (value);
       break;
     case PROP_ALGORITHM:
-      filter->algorithm = g_value_get_enum (value);
-      gst_pitch_setup_algorithm (filter);
+      gst_pitch_setup_algorithm (filter, g_value_get_enum (value));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -308,6 +313,7 @@ gst_pitch_message_new (GstPitch * filter)
       filter->maxfreq);
   /*GST_DEBUG_OBJECT (filter, "min_i = %d, max_i = %d", min_i, max_i); */
 
+  g_mutex_lock (filter->mutex);
   switch (filter->algorithm) {
 
     case GST_PITCH_ALGORITHM_FFT:
@@ -380,6 +386,7 @@ gst_pitch_message_new (GstPitch * filter)
     default:
       break;
   }
+  g_mutex_unlock (filter->mutex);
 
   /*
   g_debug("freq %d[%d]\n", frequency, frequency_module);
index d4a2e8a..043a6d4 100644 (file)
@@ -71,7 +71,8 @@ struct _GstPitch
   kiss_fft_cpx *signal;
   kiss_fft_cpx *spectrum;
 
-  gint * module;
+  gint *module;
+  GMutex *mutex;
 };
 
 struct _GstPitchClass
@@ -79,7 +80,7 @@ struct _GstPitchClass
   GstBaseTransformClass parent_class;
 };
 
-GType gst_pithc_get_type (void);
+GType gst_pitch_get_type (void);
 
 G_END_DECLS
 #endif /* __GST_PITCH_H__ */