--- 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 @@ * Example launch line * * - * 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 * * * */ -/* 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 {