spectrum: put number of channels to instance variable
authorStefan Kost <ensonic@users.sf.net>
Thu, 10 Mar 2011 12:10:25 +0000 (14:10 +0200)
committerStefan Kost <ensonic@users.sf.net>
Thu, 10 Mar 2011 12:10:25 +0000 (14:10 +0200)
When freeing data the format might have changed. Thus we need to remember for
which format we allocated memory.

gst/spectrum/gstspectrum.c
gst/spectrum/gstspectrum.h

index 2790d63..ecc8a29 100644 (file)
@@ -297,13 +297,17 @@ gst_spectrum_alloc_channel_data (GstSpectrum * spectrum)
   GstSpectrumChannel *cd;
   guint bands = spectrum->bands;
   guint nfft = 2 * bands - 2;
-  guint channels = (spectrum->multi_channel) ?
+
+  g_assert (spectrum->channel_data == NULL);
+
+  spectrum->num_channels = (spectrum->multi_channel) ?
       GST_AUDIO_FILTER (spectrum)->format.channels : 1;
 
-  GST_DEBUG_OBJECT (spectrum, "allocating data for %d channels", channels);
+  GST_DEBUG_OBJECT (spectrum, "allocating data for %d channels",
+      spectrum->num_channels);
 
-  spectrum->channel_data = g_new (GstSpectrumChannel, channels);
-  for (i = 0; i < channels; i++) {
+  spectrum->channel_data = g_new (GstSpectrumChannel, spectrum->num_channels);
+  for (i = 0; i < spectrum->num_channels; i++) {
     cd = &spectrum->channel_data[i];
     cd->fft_ctx = gst_fft_f32_new (nfft, FALSE);
     cd->input = g_new0 (gfloat, nfft);
@@ -317,15 +321,14 @@ gst_spectrum_alloc_channel_data (GstSpectrum * spectrum)
 static void
 gst_spectrum_free_channel_data (GstSpectrum * spectrum)
 {
-  gint i;
-  GstSpectrumChannel *cd;
-  guint channels = (spectrum->multi_channel) ?
-      GST_AUDIO_FILTER (spectrum)->format.channels : 1;
+  if (spectrum->channel_data) {
+    gint i;
+    GstSpectrumChannel *cd;
 
-  GST_DEBUG_OBJECT (spectrum, "freeing data for %d channels", channels);
+    GST_DEBUG_OBJECT (spectrum, "freeing data for %d channels",
+        spectrum->num_channels);
 
-  if (spectrum->channel_data) {
-    for (i = 0; i < channels; i++) {
+    for (i = 0; i < spectrum->num_channels; i++) {
       cd = &spectrum->channel_data[i];
       if (cd->fft_ctx)
         gst_fft_f32_free (cd->fft_ctx);
index e850885..60ebd50 100644 (file)
@@ -72,6 +72,7 @@ struct _GstSpectrum
 
   /* <private> */
   GstSpectrumChannel *channel_data;
+  guint num_channels;
 
   guint input_pos;
   guint64 error_per_interval;