summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2013-09-02 10:29:08 +0200
committerSebastian Dröge <slomo@circular-chaos.org>2013-09-02 10:32:46 +0200
commit7b49fe9cd7c24dfd4a11918d2fe64a5eab4fead7 (patch)
tree93da3b94d17409fd640dd4517305a43f208d561c
parentb627cfcbdb68b7c4da1a85782b3ae3c2b1e4a8b3 (diff)
downloadgstreamer-plugins-bad-7b49fe9cd7c24dfd4a11918d2fe64a5eab4fead7.tar.gz
soundtouch: Allow compilation against float and integer version of the library
https://bugzilla.gnome.org/show_bug.cgi?id=707270
-rw-r--r--ext/soundtouch/gstbpmdetect.cc31
-rw-r--r--ext/soundtouch/gstpitch.cc53
-rw-r--r--ext/soundtouch/gstpitch.hh5
3 files changed, 47 insertions, 42 deletions
diff --git a/ext/soundtouch/gstbpmdetect.cc b/ext/soundtouch/gstbpmdetect.cc
index e9d6f11a8..8d6239cee 100644
--- a/ext/soundtouch/gstbpmdetect.cc
+++ b/ext/soundtouch/gstbpmdetect.cc
@@ -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;
diff --git a/ext/soundtouch/gstpitch.cc b/ext/soundtouch/gstpitch.cc
index fd36d2102..1235b310a 100644
--- a/ext/soundtouch/gstpitch.cc
+++ b/ext/soundtouch/gstpitch.cc
@@ -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);
diff --git a/ext/soundtouch/gstpitch.hh b/ext/soundtouch/gstpitch.hh
index ad1f7f6d1..1efb59b04 100644
--- a/ext/soundtouch/gstpitch.hh
+++ b/ext/soundtouch/gstpitch.hh
@@ -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;