soundtouch: Allow compilation against float and integer version of the library
authorSebastian Dröge <slomo@circular-chaos.org>
Mon, 2 Sep 2013 08:29:08 +0000 (10:29 +0200)
committerSebastian Dröge <slomo@circular-chaos.org>
Mon, 2 Sep 2013 08:29:49 +0000 (10:29 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=707270

ext/soundtouch/gstbpmdetect.cc
ext/soundtouch/gstpitch.cc
ext/soundtouch/gstpitch.hh

index cb21e4ce73bf202d3209ef334addd7732327eb4c..79f765828d335646bc453f50379bf123c82a56ab 100644 (file)
@@ -31,7 +31,6 @@
 #undef PACKAGE_BUGREPORT
 #undef PACKAGE
 
-#define FLOAT_SAMPLES 1
 #include <soundtouch/BPMDetect.h>
 
 #include <gst/audio/audio.h>
@@ -55,11 +54,21 @@ struct _GstBPMDetectPrivate
 #endif
 };
 
-#define ALLOWED_CAPS \
-    "audio/x-raw, "                                           \
-    " format = (string) " GST_AUDIO_NE (F32) ", "             \
-    " rate = (int) [ 8000, MAX ], "                           \
-    " channels = (int) [ 1, 2 ]"
+#if defined(SOUNDTOUCH_FLOAT_SAMPLES)
+  #define ALLOWED_CAPS \
+    "audio/x-raw, " \
+      "format = (string) " GST_AUDIO_NE (F32) ", " \
+      "rate = (int) [ 8000, MAX ], " \
+      "channels = (int) [ 1, 2 ]"
+#elif defined(SOUNDTOUCH_INTEGER_SAMPLES)
+  #define ALLOWED_CAPS \
+    "audio/x-raw, " \
+      "format = (string) " GST_AUDIO_NE (S16) ", " \
+      "rate = (int) [ 8000, MAX ], " \
+      "channels = (int) [ 1, 2 ]"
+#else
+#error "Only integer or float samples are supported"
+#endif
 
 #define gst_bpm_detect_parent_class parent_class
 G_DEFINE_TYPE (GstBPMDetect, gst_bpm_detect, GST_TYPE_AUDIO_FILTER);
@@ -209,13 +218,13 @@ gst_bpm_detect_transform_ip (GstBaseTransform * trans, GstBuffer * in)
 
   gst_buffer_map (in, &info, GST_MAP_READ);
 
-  nsamples = info.size / (4 * GST_AUDIO_INFO_CHANNELS (&filter->info));
+  nsamples = info.size / (GST_AUDIO_INFO_BPF (&filter->info) * GST_AUDIO_INFO_CHANNELS (&filter->info));
 
   /* For stereo BPMDetect->inputSamples() does downmixing into the input
    * data but our buffer data shouldn't be modified.
    */
   if (GST_AUDIO_INFO_CHANNELS (&filter->info) == 1) {
-    gfloat *inbuf = (gfloat *) info.data;
+    soundtouch::SAMPLETYPE *inbuf = (soundtouch::SAMPLETYPE *) info.data;
 
     while (nsamples > 0) {
       bpm_detect->priv->detect->inputSamples (inbuf, MIN (nsamples, 2048));
@@ -223,13 +232,13 @@ gst_bpm_detect_transform_ip (GstBaseTransform * trans, GstBuffer * in)
       inbuf += 2048;
     }
   } else {
-    gfloat *inbuf, *intmp, data[2 * 2048];
+    soundtouch::SAMPLETYPE *inbuf, *intmp, data[2 * 2048];
 
-    inbuf = (gfloat *) info.data;
+    inbuf = (soundtouch::SAMPLETYPE *) info.data;
     intmp = data;
 
     while (nsamples > 0) {
-      memcpy (intmp, inbuf, sizeof (gfloat) * 2 * MIN (nsamples, 2048));
+      memcpy (intmp, inbuf, sizeof (soundtouch::SAMPLETYPE) * 2 * MIN (nsamples, 2048));
       bpm_detect->priv->detect->inputSamples (intmp, MIN (nsamples, 2048));
       nsamples -= 2048;
       inbuf += 2048 * 2;
index fd36d2102c383b2e2cb7dad9b2e2c9b822aa51f6..1235b310a1cf8c8cbb17e9cc5d44e78e2f15ca77 100644 (file)
@@ -31,7 +31,6 @@
 #undef PACKAGE_BUGREPORT
 #undef PACKAGE
 
-#define FLOAT_SAMPLES 1
 #include <soundtouch/SoundTouch.h>
 
 #include <gst/gst.h>
@@ -62,11 +61,21 @@ enum
   ARG_PITCH
 };
 
-#define SUPPORTED_CAPS \
-  "audio/x-raw, " \
-    "format = (string) " GST_AUDIO_NE (F32) ", " \
-    "rate = (int) [ 8000, MAX ], " \
-    "channels = (int) [ 1, 2 ]"
+#if defined(SOUNDTOUCH_FLOAT_SAMPLES)
+  #define SUPPORTED_CAPS \
+    "audio/x-raw, " \
+      "format = (string) " GST_AUDIO_NE (F32) ", " \
+      "rate = (int) [ 8000, MAX ], " \
+      "channels = (int) [ 1, 2 ]"
+#elif defined(SOUNDTOUCH_INTEGER_SAMPLES)
+  #define SUPPORTED_CAPS \
+    "audio/x-raw, " \
+      "format = (string) " GST_AUDIO_NE (S16) ", " \
+      "rate = (int) [ 8000, MAX ], " \
+      "channels = (int) [ 1, 2 ]"
+#else
+#error "Only integer or float samples are supported"
+#endif
 
 static GstStaticPadTemplate gst_pitch_sink_template =
 GST_STATIC_PAD_TEMPLATE ("sink",
@@ -294,29 +303,17 @@ static gboolean
 gst_pitch_setcaps (GstPitch * pitch, GstCaps * caps)
 {
   GstPitchPrivate *priv;
-  GstStructure *structure;
-  gint rate, channels;
 
   priv = GST_PITCH_GET_PRIVATE (pitch);
 
-  structure = gst_caps_get_structure (caps, 0);
-
-  if (!gst_structure_get_int (structure, "rate", &rate) ||
-      !gst_structure_get_int (structure, "channels", &channels)) {
+  if (gst_audio_info_from_caps (&pitch->info, caps))
     return FALSE;
-  }
 
   GST_OBJECT_LOCK (pitch);
 
-  pitch->samplerate = rate;
-  pitch->channels = channels;
-
   /* notify the soundtouch instance of this change */
-  priv->st->setSampleRate (rate);
-  priv->st->setChannels (channels);
-
-  /* calculate sample size */
-  pitch->sample_size = (sizeof (gfloat) * channels);
+  priv->st->setSampleRate (pitch->info.rate);
+  priv->st->setChannels (pitch->info.channels);
 
   GST_OBJECT_UNLOCK (pitch);
 
@@ -361,10 +358,10 @@ gst_pitch_prepare_buffer (GstPitch * pitch)
   if (samples == 0)
     return NULL;
 
-  buffer = gst_buffer_new_and_alloc (samples * pitch->sample_size);
+  buffer = gst_buffer_new_and_alloc (samples * pitch->info.bpf);
 
   gst_buffer_map (buffer, &info, (GstMapFlags) GST_MAP_READWRITE);
-  samples = priv->st->receiveSamples ((gfloat *) info.data, samples);
+  samples = priv->st->receiveSamples ((soundtouch::SAMPLETYPE *) info.data, samples);
   gst_buffer_unmap (buffer, &info);
 
   if (samples <= 0) {
@@ -373,7 +370,7 @@ gst_pitch_prepare_buffer (GstPitch * pitch)
   }
 
   GST_BUFFER_DURATION (buffer) =
-      gst_util_uint64_scale (samples, GST_SECOND, pitch->samplerate);
+      gst_util_uint64_scale (samples, GST_SECOND, pitch->info.rate);
   /* temporary store samples here, to avoid having to recalculate this */
   GST_BUFFER_OFFSET (buffer) = (gint64) samples;
 
@@ -471,8 +468,8 @@ gst_pitch_convert (GstPitch * pitch,
   g_return_val_if_fail (dst_format && dst_value, FALSE);
 
   GST_OBJECT_LOCK (pitch);
-  sample_size = pitch->sample_size;
-  samplerate = pitch->samplerate;
+  sample_size = pitch->info.bpf;
+  samplerate = pitch->info.rate;
   GST_OBJECT_UNLOCK (pitch);
 
   if (sample_size == 0 || samplerate == 0) {
@@ -847,7 +844,7 @@ gst_pitch_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
 
   /* push the received samples on the soundtouch buffer */
   GST_LOG_OBJECT (pitch, "incoming buffer (%d samples) %" GST_TIME_FORMAT,
-      (gint) (gst_buffer_get_size (buffer) / pitch->sample_size),
+      (gint) (gst_buffer_get_size (buffer) / pitch->info.bpf),
       GST_TIME_ARGS (timestamp));
 
   if (GST_PITCH_GET_PRIVATE (pitch)->pending_segment) {
@@ -872,7 +869,7 @@ gst_pitch_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
   }
 
   gst_buffer_map (buffer, &info, GST_MAP_READ);
-  priv->st->putSamples ((gfloat *) info.data, info.size / pitch->sample_size);
+  priv->st->putSamples ((soundtouch::SAMPLETYPE *) info.data, info.size / pitch->info.bpf);
   gst_buffer_unmap (buffer, &info);
   gst_buffer_unref (buffer);
 
index ad1f7f6d1fd3e42914715655490b03757bd3e4a1..1efb59b0409cfa2e2cfada9270f84295a41b178d 100644 (file)
@@ -21,6 +21,7 @@
 #define __GST_PITCH_H__
 
 #include <gst/gst.h>
+#include <gst/audio/audio.h>
 
 G_BEGIN_DECLS
 
@@ -71,9 +72,7 @@ struct _GstPitch
   gfloat  seg_arate;            /* Rate to apply from input segment */
 
   /* values extracted from caps */
-  gint          samplerate;      /* samplerate                           */
-  gint          channels;        /* number of audio channels             */
-  gsize         sample_size;     /* number of bytes for a single sample  */
+  GstAudioInfo  info;
 
   /* stream tracking */
   GstClockTime  next_buffer_time;