fix a potential crash while changing algorithm
[tunertool] / src / gstpitch.c
index 2cce8d3..395cacd 100644 (file)
@@ -30,7 +30,8 @@
 GST_DEBUG_CATEGORY_STATIC (gst_pitch_debug);
 #define GST_CAT_DEFAULT gst_pitch_debug
 
-#define RATE    8000
+#define RATE    32000
+#define RATESTR "32000"
 #define WANTED  RATE * 2
 
 /* Filter signals and args */
@@ -49,7 +50,7 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
     GST_STATIC_CAPS ("audio/x-raw-int, "
-        "rate = (int) 8000, "
+        "rate = (int) " RATESTR ", "
         "channels = (int) 1, "
         "endianness = (int) BYTE_ORDER, "
         "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) true")
@@ -168,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));
   }
@@ -180,6 +182,8 @@ gst_pitch_setup_algorithm (GstPitch * filter)
 
     filter->module = NULL;
   }
+  filter->algorithm = algorithm;
+  g_mutex_unlock (filter->mutex);
 }
 
 static void
@@ -190,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
@@ -210,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);
@@ -232,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);
@@ -307,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:
@@ -379,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);