rendered paste body--- audiopanorama.c.orig 2006-08-24 17:02:14.000000000 +0200
+++ audiopanorama.c 2006-08-24 18:47:18.000000000 +0200
@@ -27,15 +27,13 @@
* <title>Example launch line</title>
* <para>
* <programlisting>
- * gst-launch audiotestsrc wave=saw ! audiopanorama panorama=-100 ! alsasink
- * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiopanorama panorama=-100 ! alsasink
+ * gst-launch audiotestsrc wave=saw ! audioconvert ! audiopanorama panorama=-100 ! audioconvert ! alsasink
+ * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiopanorama panorama=-100 ! audioconvert ! alsasink
* </programlisting>
* </para>
* </refsect2>
*/
-/* FIXME: also support 32/64 bit float audio, and maybe 8/24 bit integer */
-
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
@@ -71,21 +69,21 @@
static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("audio/x-raw-int, "
+ GST_STATIC_CAPS ("audio/x-raw-float, "
"rate = (int) [ 1, MAX ], "
"channels = (int) [ 1, 2 ], "
"endianness = (int) BYTE_ORDER, "
- "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) true")
+ "width = (int) 32, " "signed = (boolean) true")
);
static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("audio/x-raw-int, "
+ GST_STATIC_CAPS ("audio/x-raw-float, "
"rate = (int) [ 1, MAX ], "
"channels = (int) 2, "
"endianness = (int) BYTE_ORDER, "
- "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) true")
+ "width = (int) 32, " "signed = (boolean) true")
);
#define DEBUG_INIT(bla) \
@@ -107,9 +105,9 @@
GstCaps * incaps, GstCaps * outcaps);
static void gst_audio_panorama_transform_m2s (GstAudioPanorama * filter,
- gint16 * idata, gint16 * odata, guint num_samples);
+ gfloat * idata, gfloat * odata, guint num_samples);
static void gst_audio_panorama_transform_s2s (GstAudioPanorama * filter,
- gint16 * idata, gint16 * odata, guint num_samples);
+ gfloat * idata, gfloat * odata, guint num_samples);
static GstFlowReturn gst_audio_panorama_transform (GstBaseTransform * base,
GstBuffer * inbuf, GstBuffer * outbuf);
@@ -276,12 +274,11 @@
}
static void
-gst_audio_panorama_transform_m2s (GstAudioPanorama * filter, gint16 * idata,
- gint16 * odata, guint num_samples)
+gst_audio_panorama_transform_m2s (GstAudioPanorama * filter, gfloat * idata,
+ gfloat * odata, guint num_samples)
{
guint i;
- gdouble val;
- glong lval, rval;
+ gfloat val;
gdouble rpan, lpan;
/* pan: -100 0 100
@@ -294,23 +291,19 @@
lpan = 1.0 - rpan;
for (i = 0; i < num_samples; i++) {
- val = (gdouble) * idata++;
-
- lval = (glong) (val * lpan);
- rval = (glong) (val * rpan);
+ val = *idata++;
- *odata++ = (gint16) CLAMP (lval, G_MININT16, G_MAXINT16);
- *odata++ = (gint16) CLAMP (rval, G_MININT16, G_MAXINT16);
+ *odata++ = val * lpan;
+ *odata++ = val * rpan;
}
}
static void
-gst_audio_panorama_transform_s2s (GstAudioPanorama * filter, gint16 * idata,
- gint16 * odata, guint num_samples)
+gst_audio_panorama_transform_s2s (GstAudioPanorama * filter, gfloat * idata,
+ gfloat * odata, guint num_samples)
{
guint i;
- glong lval, rval;
- gdouble lival, rival;
+ gfloat lival, rival;
gdouble lrpan, llpan, rrpan, rlpan;
/* pan: -100 0 100
@@ -332,14 +325,11 @@
}
for (i = 0; i < num_samples; i++) {
- lival = (gdouble) * idata++;
- rival = (gdouble) * idata++;
-
- lval = lival * llpan + rival * lrpan;
- rval = lival * rlpan + rival * rrpan;
+ lival = *idata++;
+ rival = *idata++;
- *odata++ = (gint16) CLAMP (lval, G_MININT16, G_MAXINT16);
- *odata++ = (gint16) CLAMP (rval, G_MININT16, G_MAXINT16);
+ *odata++ = lival * llpan + rival * lrpan;
+ *odata++ = lival * rlpan + rival * rrpan;
}
}
@@ -350,7 +340,7 @@
GstBuffer * outbuf)
{
GstAudioPanorama *filter = GST_AUDIO_PANORAMA (base);
- guint num_samples = GST_BUFFER_SIZE (outbuf) / (2 * sizeof (gint16));
+ guint num_samples = GST_BUFFER_SIZE (outbuf) / (2 * sizeof (gfloat));
if (!gst_buffer_is_writable (outbuf))
return GST_FLOW_OK;
@@ -358,8 +348,8 @@
if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (outbuf)))
gst_object_sync_values (G_OBJECT (filter), GST_BUFFER_TIMESTAMP (outbuf));
- filter->process (filter, (gint16 *) GST_BUFFER_DATA (inbuf),
- (gint16 *) GST_BUFFER_DATA (outbuf), num_samples);
+ filter->process (filter, (gfloat *) GST_BUFFER_DATA (inbuf),
+ (gfloat *) GST_BUFFER_DATA (outbuf), num_samples);
return GST_FLOW_OK;
}
--- audiopanorama.h.orig 2006-08-24 18:01:23.000000000 +0200
+++ audiopanorama.h 2006-08-24 18:02:15.000000000 +0200
@@ -42,7 +42,7 @@
gint panorama;
/* < private > */
- void (*process)(GstAudioPanorama*, gint16*, gint16*, guint);
+ void (*process)(GstAudioPanorama*, gfloat*, gfloat*, guint);
};
struct _GstAudioPanoramaClass {