All pastes #147778 Raw Edit

gst audiopanorama float patch

public text v1 · immutable
#147778 ·published 2006-08-24 17:06 UTC
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 {