audiopanorama: cleanup and expand the tests
authorStefan Sauer <ensonic@users.sf.net>
Tue, 11 Jun 2013 18:27:51 +0000 (20:27 +0200)
committerStefan Sauer <ensonic@users.sf.net>
Tue, 11 Jun 2013 19:48:18 +0000 (21:48 +0200)
Split out two more tests. Extract more common code into helpers. Add coverage for float.

tests/check/elements/audiopanorama.c

index 282e4a6bd9b946c9c2d423988d33d0723b0e3a66..3857119b058504a4a12da3adcdf8c4820f96f4d6 100644 (file)
@@ -34,14 +34,14 @@ gboolean have_eos = FALSE;
 GstPad *mysrcpad, *mysinkpad;
 
 
-#define PANORAMA_MONO_CAPS_STRING    \
+#define PANORAMA_S16_MONO_CAPS_STRING   \
     "audio/x-raw, "                     \
     "channels = (int) 1, "              \
     "rate = (int) 44100, "              \
     "layout = (string) interleaved, "   \
     "format = (string) " GST_AUDIO_NE(S16)
 
-#define PANORAMA_STEREO_CAPS_STRING  \
+#define PANORAMA_S16_STEREO_CAPS_STRING \
     "audio/x-raw, "                     \
     "channels = (int) 2, "              \
     "channel-mask = (bitmask) 3, "      \
@@ -49,6 +49,21 @@ GstPad *mysrcpad, *mysinkpad;
     "layout = (string) interleaved, "   \
     "format = (string) " GST_AUDIO_NE(S16)
 
+#define PANORAMA_F32_MONO_CAPS_STRING   \
+    "audio/x-raw, "                     \
+    "channels = (int) 1, "              \
+    "rate = (int) 44100, "              \
+    "layout = (string) interleaved, "   \
+    "format = (string) " GST_AUDIO_NE(F32)
+
+#define PANORAMA_F32_STEREO_CAPS_STRING \
+    "audio/x-raw, "                     \
+    "channels = (int) 2, "              \
+    "channel-mask = (bitmask) 3, "      \
+    "rate = (int) 44100, "              \
+    "layout = (string) interleaved, "   \
+    "format = (string) " GST_AUDIO_NE(F32)
+
 #define PANORAMA_WRONG_CAPS_STRING  \
     "audio/x-raw, "                     \
     "channels = (int) 5, "              \
@@ -57,60 +72,134 @@ GstPad *mysrcpad, *mysinkpad;
     "format = (string) " GST_AUDIO_NE(U16)
 
 
-static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
-    GST_PAD_SINK,
-    GST_PAD_ALWAYS,
-    GST_STATIC_CAPS ("audio/x-raw, "
-        "channels = (int) 2, "
-        "rate = (int) [ 1,  MAX ], "
-        "layout = (string) interleaved, "
-        "format = (string) " GST_AUDIO_NE (S16))
-    );
-static GstStaticPadTemplate msrctemplate = GST_STATIC_PAD_TEMPLATE ("src",
-    GST_PAD_SRC,
-    GST_PAD_ALWAYS,
-    GST_STATIC_CAPS ("audio/x-raw, "
-        "channels = (int) 1, "
-        "rate = (int) [ 1,  MAX ], "
-        "layout = (string) interleaved, "
-        "format = (string) " GST_AUDIO_NE (S16))
-    );
-static GstStaticPadTemplate ssrctemplate = GST_STATIC_PAD_TEMPLATE ("src",
-    GST_PAD_SRC,
-    GST_PAD_ALWAYS,
-    GST_STATIC_CAPS ("audio/x-raw, "
-        "channels = (int) 2, "
-        "rate = (int) [ 1,  MAX ], "
-        "layout = (string) interleaved, "
-        "format = (string) " GST_AUDIO_NE (S16))
-    );
+static GstStaticPadTemplate sinktemplate[2] = {
+  GST_STATIC_PAD_TEMPLATE ("sink",
+      GST_PAD_SINK,
+      GST_PAD_ALWAYS,
+      GST_STATIC_CAPS ("audio/x-raw, "
+          "channels = (int) 2, "
+          "rate = (int) [ 1,  MAX ], "
+          "layout = (string) interleaved, "
+          "format = (string) " GST_AUDIO_NE (S16))
+      ),
+  GST_STATIC_PAD_TEMPLATE ("sink",
+      GST_PAD_SINK,
+      GST_PAD_ALWAYS,
+      GST_STATIC_CAPS ("audio/x-raw, "
+          "channels = (int) 2, "
+          "rate = (int) [ 1,  MAX ], "
+          "layout = (string) interleaved, "
+          "format = (string) " GST_AUDIO_NE (F32))
+      ),
+};
+
+static GstStaticPadTemplate msrctemplate[2] = {
+  GST_STATIC_PAD_TEMPLATE ("src",
+      GST_PAD_SRC,
+      GST_PAD_ALWAYS,
+      GST_STATIC_CAPS ("audio/x-raw, "
+          "channels = (int) 1, "
+          "rate = (int) [ 1,  MAX ], "
+          "layout = (string) interleaved, "
+          "format = (string) " GST_AUDIO_NE (S16))
+      ),
+  GST_STATIC_PAD_TEMPLATE ("src",
+      GST_PAD_SRC,
+      GST_PAD_ALWAYS,
+      GST_STATIC_CAPS ("audio/x-raw, "
+          "channels = (int) 1, "
+          "rate = (int) [ 1,  MAX ], "
+          "layout = (string) interleaved, "
+          "format = (string) " GST_AUDIO_NE (F32))
+      ),
+};
+
+static GstStaticPadTemplate ssrctemplate[2] = {
+  GST_STATIC_PAD_TEMPLATE ("src",
+      GST_PAD_SRC,
+      GST_PAD_ALWAYS,
+      GST_STATIC_CAPS ("audio/x-raw, "
+          "channels = (int) 2, "
+          "rate = (int) [ 1,  MAX ], "
+          "layout = (string) interleaved, "
+          "format = (string) " GST_AUDIO_NE (S16))
+      ),
+  GST_STATIC_PAD_TEMPLATE ("src",
+      GST_PAD_SRC,
+      GST_PAD_ALWAYS,
+      GST_STATIC_CAPS ("audio/x-raw, "
+          "channels = (int) 2, "
+          "rate = (int) [ 1,  MAX ], "
+          "layout = (string) interleaved, "
+          "format = (string) " GST_AUDIO_NE (F32))
+      ),
+};
 
 static GstElement *
-setup_panorama_m (void)
+setup_panorama (GstStaticPadTemplate * srctemplate, gint fmt,
+    const gchar * caps_str)
 {
   GstElement *panorama;
 
   GST_DEBUG ("setup_panorama");
   panorama = gst_check_setup_element ("audiopanorama");
-  mysrcpad = gst_check_setup_src_pad (panorama, &msrctemplate);
-  mysinkpad = gst_check_setup_sink_pad (panorama, &sinktemplate);
+  mysrcpad = gst_check_setup_src_pad (panorama, &srctemplate[fmt]);
+  mysinkpad = gst_check_setup_sink_pad (panorama, &sinktemplate[fmt]);
   gst_pad_set_active (mysrcpad, TRUE);
   gst_pad_set_active (mysinkpad, TRUE);
 
+  if (caps_str) {
+    GstCaps *caps = gst_caps_from_string (caps_str);
+    gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
+    gst_caps_unref (caps);
+  }
   return panorama;
 }
 
 static GstElement *
-setup_panorama_s (void)
+setup_panorama_s16_m (gint method, gfloat pan)
 {
   GstElement *panorama;
+  panorama = setup_panorama (msrctemplate, 0, PANORAMA_S16_MONO_CAPS_STRING);
+  g_object_set (G_OBJECT (panorama), "method", method, "panorama", pan, NULL);
+  gst_element_set_state (panorama, GST_STATE_PLAYING);
+  GST_DEBUG ("panorama(mono) ready");
 
-  GST_DEBUG ("setup_panorama");
-  panorama = gst_check_setup_element ("audiopanorama");
-  mysrcpad = gst_check_setup_src_pad (panorama, &ssrctemplate);
-  mysinkpad = gst_check_setup_sink_pad (panorama, &sinktemplate);
-  gst_pad_set_active (mysrcpad, TRUE);
-  gst_pad_set_active (mysinkpad, TRUE);
+  return panorama;
+}
+
+static GstElement *
+setup_panorama_f32_m (gint method, gfloat pan)
+{
+  GstElement *panorama;
+  panorama = setup_panorama (msrctemplate, 1, PANORAMA_F32_MONO_CAPS_STRING);
+  g_object_set (G_OBJECT (panorama), "method", method, "panorama", pan, NULL);
+  gst_element_set_state (panorama, GST_STATE_PLAYING);
+  GST_DEBUG ("panorama(mono) ready");
+
+  return panorama;
+}
+
+static GstElement *
+setup_panorama_s16_s (gint method, gfloat pan)
+{
+  GstElement *panorama;
+  panorama = setup_panorama (ssrctemplate, 0, PANORAMA_S16_STEREO_CAPS_STRING);
+  g_object_set (G_OBJECT (panorama), "method", method, "panorama", pan, NULL);
+  gst_element_set_state (panorama, GST_STATE_PLAYING);
+  GST_DEBUG ("panorama(stereo) ready");
+
+  return panorama;
+}
+
+static GstElement *
+setup_panorama_f32_s (gint method, gfloat pan)
+{
+  GstElement *panorama;
+  panorama = setup_panorama (ssrctemplate, 1, PANORAMA_F32_STEREO_CAPS_STRING);
+  g_object_set (G_OBJECT (panorama), "method", method, "panorama", pan, NULL);
+  gst_element_set_state (panorama, GST_STATE_PLAYING);
+  GST_DEBUG ("panorama(stereo) ready");
 
   return panorama;
 }
@@ -118,7 +207,8 @@ setup_panorama_s (void)
 static void
 cleanup_panorama (GstElement * panorama)
 {
-  GST_DEBUG ("cleanup_panorama");
+  GST_DEBUG ("cleaning up");
+  gst_element_set_state (panorama, GST_STATE_NULL);
 
   g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
   g_list_free (buffers);
@@ -131,27 +221,39 @@ cleanup_panorama (GstElement * panorama)
   gst_check_teardown_element (panorama);
 }
 
-GST_START_TEST (test_mono_middle)
+static GstBuffer *
+setup_buffer (gpointer data, gsize size)
+{
+  return gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, data, size, 0,
+      size, NULL, NULL);
+}
+
+static void
+do_panorama (gpointer in_data, gsize in_size, gpointer out_data, gsize out_size)
+{
+  GstBuffer *in, *out;
+
+  in = setup_buffer (in_data, in_size);
+  fail_unless (gst_pad_push (mysrcpad, in) == GST_FLOW_OK);
+  fail_unless_equals_int (g_list_length (buffers), 1);
+  fail_if ((out = (GstBuffer *) buffers->data) == NULL);
+  fail_unless (gst_buffer_extract (out, 0, out_data, out_size) == out_size);
+}
+
+/* the tests */
+
+GST_START_TEST (test_ref_counts)
 {
   GstElement *panorama;
   GstBuffer *inbuffer, *outbuffer;
-  GstCaps *caps;
   gint16 in[2] = { 16384, -256 };
-  gint16 out[4] = { 8192, 8192, -128, -128 };
-  gint16 res[4];
 
-  panorama = setup_panorama_m ();
+  panorama = setup_panorama (msrctemplate, 0, PANORAMA_S16_MONO_CAPS_STRING);
   fail_unless (gst_element_set_state (panorama,
           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
       "could not set to playing");
 
-  caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING);
-  gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
-
-  inbuffer =
-      gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, sizeof (in), 0,
-      sizeof (in), NULL, NULL);
+  inbuffer = setup_buffer (in, sizeof (in));
   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
 
   /* pushing gives away my reference ... */
@@ -159,517 +261,515 @@ GST_START_TEST (test_mono_middle)
   /* ... but it ends up being collected on the global buffer list */
   fail_unless_equals_int (g_list_length (buffers), 1);
   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
-
-  fail_unless (gst_buffer_extract (outbuffer, 0, res, 8) == 8);
-  GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d",
-      out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]);
-  fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 8) == 0);
+  fail_if (inbuffer == outbuffer);
 
   /* cleanup */
+  fail_unless (gst_element_set_state (panorama,
+          GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+  ASSERT_OBJECT_REFCOUNT (panorama, "panorama", 1);
   cleanup_panorama (panorama);
 }
 
 GST_END_TEST;
 
-GST_START_TEST (test_mono_left)
+GST_START_TEST (test_wrong_caps)
 {
   GstElement *panorama;
-  GstBuffer *inbuffer, *outbuffer;
-  GstCaps *caps;
+  GstBuffer *inbuffer;
   gint16 in[2] = { 16384, -256 };
-  gint16 out[4] = { 16384, 0, -256, 0 };
-  gint16 res[4];
+  GstBus *bus;
+  GstMessage *message;
+  GstCaps *caps;
 
-  panorama = setup_panorama_m ();
-  g_object_set (G_OBJECT (panorama), "panorama", -1.0, NULL);
-  fail_unless (gst_element_set_state (panorama,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
+  panorama = setup_panorama (msrctemplate, 0, NULL);
+  bus = gst_bus_new ();
+  gst_element_set_state (panorama, GST_STATE_PLAYING);
+
+  inbuffer = setup_buffer (in, sizeof (in));
+  gst_buffer_ref (inbuffer);
+
+  /* set a bus here so we avoid getting state change messages */
+  gst_element_set_bus (panorama, bus);
 
-  caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING);
+  caps = gst_caps_from_string (PANORAMA_WRONG_CAPS_STRING);
+  /* this actually succeeds, because the caps event is sticky */
   gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
   gst_caps_unref (caps);
 
-  inbuffer =
-      gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, sizeof (in), 0,
-      sizeof (in), NULL, NULL);
-  fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 4) == 0);
+  /* pushing gives an error because it can't negotiate with wrong caps */
+  fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer),
+      GST_FLOW_NOT_NEGOTIATED);
+  /* ... and the buffer would have been lost if we didn't ref it ourselves */
   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+  gst_buffer_unref (inbuffer);
+  fail_unless_equals_int (g_list_length (buffers), 0);
 
-  /* pushing gives away my reference ... */
-  fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
-  /* ... and puts a new buffer on the global list */
-  fail_unless_equals_int (g_list_length (buffers), 1);
-  fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
-
-  fail_unless (gst_buffer_extract (outbuffer, 0, res, 8) == 8);
-  GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d",
-      out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]);
-  fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 8) == 0);
+  /* panorama_set_caps should not have been called since basetransform caught
+   * the negotiation problem */
+  fail_if ((message = gst_bus_pop (bus)) != NULL);
 
   /* cleanup */
+  gst_element_set_bus (panorama, NULL);
+  gst_object_unref (GST_OBJECT (bus));
+  gst_element_set_state (panorama, GST_STATE_NULL);
   cleanup_panorama (panorama);
 }
 
 GST_END_TEST;
 
-GST_START_TEST (test_mono_right)
+/* processing for method=psy */
+
+GST_START_TEST (test_s16_mono_middle)
 {
-  GstElement *panorama;
-  GstBuffer *inbuffer, *outbuffer;
-  GstCaps *caps;
   gint16 in[2] = { 16384, -256 };
-  gint16 out[4] = { 0, 16384, 0, -256 };
+  gint16 out[4] = { 8192, 8192, -128, -128 };
   gint16 res[4];
+  GstElement *panorama = setup_panorama_s16_m (0, 0.0);
 
-  panorama = setup_panorama_m ();
-  g_object_set (G_OBJECT (panorama), "panorama", 1.0, NULL);
-  fail_unless (gst_element_set_state (panorama,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
+  do_panorama (in, sizeof (in), res, sizeof (res));
 
-  caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING);
-  gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
+  GST_INFO ("exp. %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+5d %+5d %+5d %+5d", res[0], res[1], res[2], res[3]);
+  fail_unless (memcmp (res, out, sizeof (res)) == 0);
 
-  inbuffer =
-      gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, sizeof (in), 0,
-      sizeof (in), NULL, NULL);
-  fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 4) == 0);
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+  cleanup_panorama (panorama);
+}
 
-  /* pushing gives away my reference ... */
-  fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
-  /* ... and puts a new buffer on the global list */
-  fail_unless_equals_int (g_list_length (buffers), 1);
-  fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
+GST_END_TEST;
 
-  fail_unless (gst_buffer_extract (outbuffer, 0, res, 8) == 8);
-  GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d",
-      out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]);
-  fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 8) == 0);
+GST_START_TEST (test_s16_mono_left)
+{
+  gint16 in[2] = { 16384, -256 };
+  gint16 out[4] = { 16384, 0, -256, 0 };
+  gint16 res[4];
+  GstElement *panorama = setup_panorama_s16_m (0, -1.0);
+
+  do_panorama (in, sizeof (in), res, sizeof (res));
+
+  GST_INFO ("exp. %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+5d %+5d %+5d %+5d", res[0], res[1], res[2], res[3]);
+  fail_unless (memcmp (res, out, sizeof (res)) == 0);
 
-  /* cleanup */
   cleanup_panorama (panorama);
 }
 
 GST_END_TEST;
 
-GST_START_TEST (test_stereo_middle)
+GST_START_TEST (test_s16_mono_right)
 {
-  GstElement *panorama;
-  GstBuffer *inbuffer, *outbuffer;
-  GstCaps *caps;
-  gint16 in[4] = { 16384, -256, 8192, 128 };
+  gint16 in[2] = { 16384, -256 };
+  gint16 out[4] = { 0, 16384, 0, -256 };
   gint16 res[4];
+  GstElement *panorama = setup_panorama_s16_m (0, 1.0);
 
-  panorama = setup_panorama_s ();
-  fail_unless (gst_element_set_state (panorama,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
+  do_panorama (in, sizeof (in), res, sizeof (res));
 
-  caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING);
-  gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
+  GST_INFO ("exp. %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+5d %+5d %+5d %+5d", res[0], res[1], res[2], res[3]);
+  fail_unless (memcmp (res, out, sizeof (res)) == 0);
 
-  inbuffer =
-      gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, sizeof (in), 0,
-      sizeof (in), NULL, NULL);
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+  cleanup_panorama (panorama);
+}
 
-  /* pushing gives away my reference ... */
-  fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
-  /* ... but it ends up being collected on the global buffer list */
-  fail_unless_equals_int (g_list_length (buffers), 1);
-  fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
+GST_END_TEST;
 
-  fail_unless (gst_buffer_extract (outbuffer, 0, res, 8) == 8);
-  GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d",
-      in[0], in[1], in[2], in[3], res[0], res[1], res[2], res[3]);
-  fail_unless (gst_buffer_memcmp (outbuffer, 0, in, 8) == 0);
+GST_START_TEST (test_s16_stereo_middle)
+{
+  gint16 in[4] = { 16384, -256, 8192, 128 };
+  gint16 res[4];
+  GstElement *panorama = setup_panorama_s16_s (0, 0.0);
+
+  do_panorama (in, sizeof (in), res, sizeof (res));
+
+  GST_INFO ("exp. %+5d %+5d %+5d %+5d", in[0], in[1], in[2], in[3]);
+  GST_INFO ("real %+5d %+5d %+5d %+5d", res[0], res[1], res[2], res[3]);
+  fail_unless (memcmp (res, in, sizeof (res)) == 0);
 
-  /* cleanup */
   cleanup_panorama (panorama);
 }
 
 GST_END_TEST;
 
-GST_START_TEST (test_stereo_left)
+GST_START_TEST (test_s16_stereo_left)
 {
-  GstElement *panorama;
-  GstBuffer *inbuffer, *outbuffer;
-  GstCaps *caps;
   gint16 in[4] = { 16384, -256, 8192, 128 };
   gint16 out[4] = { 16384 - 256, 0, 8192 + 128, 0 };
   gint16 res[4];
+  GstElement *panorama = setup_panorama_s16_s (0, -1.0);
 
-  panorama = setup_panorama_s ();
-  g_object_set (G_OBJECT (panorama), "panorama", -1.0, NULL);
-  fail_unless (gst_element_set_state (panorama,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
+  do_panorama (in, sizeof (in), res, sizeof (res));
 
-  caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING);
-  gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
+  GST_INFO ("exp. %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+5d %+5d %+5d %+5d", res[0], res[1], res[2], res[3]);
+  fail_unless (memcmp (res, out, sizeof (res)) == 0);
 
-  inbuffer =
-      gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, sizeof (in), 0,
-      sizeof (in), NULL, NULL);
-  fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 8) == 0);
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
-
-  /* pushing gives away my reference ... */
-  fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
-  /* ... and puts a new buffer on the global list */
-  fail_unless_equals_int (g_list_length (buffers), 1);
-  fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
-
-  fail_unless (gst_buffer_extract (outbuffer, 0, res, 8) == 8);
-  GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d",
-      out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]);
-  fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 8) == 0);
-
-  /* cleanup */
   cleanup_panorama (panorama);
 }
 
 GST_END_TEST;
 
-GST_START_TEST (test_stereo_right)
+GST_START_TEST (test_s16_stereo_right)
 {
-  GstElement *panorama;
-  GstBuffer *inbuffer, *outbuffer;
-  GstCaps *caps;
   gint16 in[4] = { 16384, -256, 8192, 128 };
   gint16 out[4] = { 0, -256 + 16384, 0, 128 + 8192 };
   gint16 res[4];
+  GstElement *panorama = setup_panorama_s16_s (0, 1.0);
 
-  panorama = setup_panorama_s ();
-  g_object_set (G_OBJECT (panorama), "panorama", 1.0, NULL);
-  fail_unless (gst_element_set_state (panorama,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
+  do_panorama (in, sizeof (in), res, sizeof (res));
 
-  caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING);
-  gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
+  GST_INFO ("exp. %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+5d %+5d %+5d %+5d", res[0], res[1], res[2], res[3]);
+  fail_unless (memcmp (res, out, sizeof (res)) == 0);
 
-  inbuffer =
-      gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, sizeof (in), 0,
-      sizeof (in), NULL, NULL);
-  fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 8) == 0);
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+  cleanup_panorama (panorama);
+}
 
-  /* pushing gives away my reference ... */
-  fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
-  /* ... and puts a new buffer on the global list */
-  fail_unless_equals_int (g_list_length (buffers), 1);
-  fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
+GST_END_TEST;
 
-  fail_unless (gst_buffer_extract (outbuffer, 0, res, 8));
-  GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d",
-      out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]);
-  fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 8) == 0);
+GST_START_TEST (test_f32_mono_middle)
+{
+  gfloat in[2] = { 0.5, -0.2 };
+  gfloat out[4] = { 0.25, 0.25, -0.1, -0.1 };
+  gfloat res[4];
+  GstElement *panorama = setup_panorama_f32_m (0, 0.0);
+  gint i;
+
+  do_panorama (in, sizeof (in), res, sizeof (res));
+
+  GST_INFO ("exp. %+4.2f %+4.2f %+4.2f %+4.2f", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+4.2f %+4.2f %+4.2f %+4.2f", res[0], res[1], res[2], res[3]);
+  for (i = 0; i < 4; i++)
+    fail_unless (res[i] == out[i], "difference at pos=%d", i);
 
-  /* cleanup */
   cleanup_panorama (panorama);
 }
 
 GST_END_TEST;
 
-GST_START_TEST (test_mono_middle_simple)
+GST_START_TEST (test_f32_mono_left)
 {
-  GstElement *panorama;
-  GstBuffer *inbuffer, *outbuffer;
-  GstCaps *caps;
-  gint16 in[2] = { 16384, -256 };
-  gint16 out[4] = { 16384, 16384, -256, -256 };
-  gint16 res[4];
+  gfloat in[2] = { 0.5, -0.2 };
+  gfloat out[4] = { 0.5, 0.0, -0.2, 0.0 };
+  gfloat res[4];
+  GstElement *panorama = setup_panorama_f32_m (0, -1.0);
+  gint i;
 
-  panorama = setup_panorama_m ();
-  g_object_set (G_OBJECT (panorama), "method", 1, NULL);
-  fail_unless (gst_element_set_state (panorama,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
+  do_panorama (in, sizeof (in), res, sizeof (res));
 
-  inbuffer =
-      gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, sizeof (in), 0,
-      sizeof (in), NULL, NULL);
-  caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING);
-  gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+  GST_INFO ("exp. %+4.2f %+4.2f %+4.2f %+4.2f", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+4.2f %+4.2f %+4.2f %+4.2f", res[0], res[1], res[2], res[3]);
+  for (i = 0; i < 4; i++)
+    fail_unless (res[i] == out[i], "difference at pos=%d", i);
 
-  /* pushing gives away my reference ... */
-  fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
-  /* ... but it ends up being collected on the global buffer list */
-  fail_unless_equals_int (g_list_length (buffers), 1);
-  fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
+  cleanup_panorama (panorama);
+}
 
-  fail_unless (gst_buffer_extract (outbuffer, 0, res, 8) == 8);
-  GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d",
-      out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]);
-  fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 8) == 0);
+GST_END_TEST;
+
+GST_START_TEST (test_f32_mono_right)
+{
+  gfloat in[2] = { 0.5, -0.2 };
+  gfloat out[4] = { 0.0, 0.5, 0.0, -0.2 };
+  gfloat res[4];
+  GstElement *panorama = setup_panorama_f32_m (0, 1.0);
+  gint i;
+
+  do_panorama (in, sizeof (in), res, sizeof (res));
+
+  GST_INFO ("exp. %+4.2f %+4.2f %+4.2f %+4.2f", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+4.2f %+4.2f %+4.2f %+4.2f", res[0], res[1], res[2], res[3]);
+  for (i = 0; i < 4; i++)
+    fail_unless (res[i] == out[i], "difference at pos=%d", i);
 
-  /* cleanup */
   cleanup_panorama (panorama);
 }
 
 GST_END_TEST;
 
-GST_START_TEST (test_mono_left_simple)
+GST_START_TEST (test_f32_stereo_middle)
 {
-  GstElement *panorama;
-  GstBuffer *inbuffer, *outbuffer;
-  GstCaps *caps;
-  gint16 in[2] = { 16384, -256 };
-  gint16 out[4] = { 16384, 0, -256, 0 };
-  gint16 res[4];
+  gfloat in[4] = { 0.5, -0.2, 0.25, 0.1 };
+  gfloat res[4];
+  GstElement *panorama = setup_panorama_f32_s (0, 0.0);
+  gint i;
 
-  panorama = setup_panorama_m ();
-  g_object_set (G_OBJECT (panorama), "method", 1, NULL);
-  g_object_set (G_OBJECT (panorama), "panorama", -1.0, NULL);
-  fail_unless (gst_element_set_state (panorama,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
+  do_panorama (in, sizeof (in), res, sizeof (res));
 
-  inbuffer =
-      gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, sizeof (in), 0,
-      sizeof (in), NULL, NULL);
-  fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 4) == 0);
-  caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING);
-  gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+  GST_INFO ("exp. %+4.2f %+4.2f %+4.2f %+4.2f", in[0], in[1], in[2], in[3]);
+  GST_INFO ("real %+4.2f %+4.2f %+4.2f %+4.2f", res[0], res[1], res[2], res[3]);
+  for (i = 0; i < 4; i++)
+    fail_unless (res[i] == in[i], "difference at pos=%d", i);
 
-  /* pushing gives away my reference ... */
-  fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
-  /* ... and puts a new buffer on the global list */
-  fail_unless_equals_int (g_list_length (buffers), 1);
-  fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
+  cleanup_panorama (panorama);
+}
 
-  fail_unless (gst_buffer_extract (outbuffer, 0, res, 8) == 8);
-  GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d",
-      out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]);
-  fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 8) == 0);
+GST_END_TEST;
+
+GST_START_TEST (test_f32_stereo_left)
+{
+  gfloat in[4] = { 0.5, -0.2, 0.25, 0.1 };
+  gfloat out[4] = { 0.5 - 0.2, 0.0, 0.25 + 0.1, 0.0 };
+  gfloat res[4];
+  GstElement *panorama = setup_panorama_f32_s (0, -1.0);
+  gint i;
+
+  do_panorama (in, sizeof (in), res, sizeof (res));
+
+  GST_INFO ("exp. %+4.2f %+4.2f %+4.2f %+4.2f", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+4.2f %+4.2f %+4.2f %+4.2f", res[0], res[1], res[2], res[3]);
+  for (i = 0; i < 4; i++)
+    fail_unless (res[i] == out[i], "difference at pos=%d", i);
 
-  /* cleanup */
   cleanup_panorama (panorama);
 }
 
 GST_END_TEST;
 
-GST_START_TEST (test_mono_right_simple)
+GST_START_TEST (test_f32_stereo_right)
+{
+  gfloat in[4] = { 0.5, -0.2, 0.25, 0.1 };
+  gfloat out[4] = { 0.0, -0.2 + 0.5, 0.0, 0.1 + 0.25 };
+  gfloat res[4];
+  GstElement *panorama = setup_panorama_f32_s (0, 1.0);
+  gint i;
+
+  do_panorama (in, sizeof (in), res, sizeof (res));
+
+  GST_INFO ("exp. %+4.2f %+4.2f %+4.2f %+4.2f", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+4.2f %+4.2f %+4.2f %+4.2f", res[0], res[1], res[2], res[3]);
+  for (i = 0; i < 4; i++)
+    fail_unless (res[i] == out[i], "difference at pos=%d", i);
+
+  cleanup_panorama (panorama);
+}
+
+GST_END_TEST;
+
+/* processing for method=simple */
+
+GST_START_TEST (test_s16_mono_middle_simple)
 {
-  GstElement *panorama;
-  GstBuffer *inbuffer, *outbuffer;
-  GstCaps *caps;
   gint16 in[2] = { 16384, -256 };
-  gint16 out[4] = { 0, 16384, 0, -256 };
+  gint16 out[4] = { 16384, 16384, -256, -256 };
   gint16 res[4];
+  GstElement *panorama = setup_panorama_s16_m (1, 0.0);
 
-  panorama = setup_panorama_m ();
-  g_object_set (G_OBJECT (panorama), "method", 1, NULL);
-  g_object_set (G_OBJECT (panorama), "panorama", 1.0, NULL);
-  fail_unless (gst_element_set_state (panorama,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
+  do_panorama (in, sizeof (in), res, sizeof (res));
 
-  inbuffer =
-      gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, sizeof (in), 0,
-      sizeof (in), NULL, NULL);
-  fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 4) == 0);
-  caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING);
-  gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+  GST_INFO ("exp. %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+5d %+5d %+5d %+5d", res[0], res[1], res[2], res[3]);
+  fail_unless (memcmp (res, out, sizeof (res)) == 0);
 
-  /* pushing gives away my reference ... */
-  fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
-  /* ... and puts a new buffer on the global list */
-  fail_unless_equals_int (g_list_length (buffers), 1);
-  fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
+  cleanup_panorama (panorama);
+}
 
-  fail_unless (gst_buffer_extract (outbuffer, 0, res, 8) == 8);
-  GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d",
-      out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]);
-  fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 8) == 0);
+GST_END_TEST;
+
+GST_START_TEST (test_s16_mono_left_simple)
+{
+  gint16 in[2] = { 16384, -256 };
+  gint16 out[4] = { 16384, 0, -256, 0 };
+  gint16 res[4];
+  GstElement *panorama = setup_panorama_s16_m (1, -1.0);
+
+  do_panorama (in, sizeof (in), res, sizeof (res));
+
+  GST_INFO ("exp. %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+5d %+5d %+5d %+5d", res[0], res[1], res[2], res[3]);
+  fail_unless (memcmp (res, out, sizeof (res)) == 0);
 
-  /* cleanup */
   cleanup_panorama (panorama);
 }
 
 GST_END_TEST;
 
-GST_START_TEST (test_stereo_middle_simple)
+GST_START_TEST (test_s16_mono_right_simple)
 {
-  GstElement *panorama;
-  GstBuffer *inbuffer, *outbuffer;
-  GstCaps *caps;
-  gint16 in[4] = { 16384, -256, 8192, 128 };
+  gint16 in[2] = { 16384, -256 };
+  gint16 out[4] = { 0, 16384, 0, -256 };
   gint16 res[4];
+  GstElement *panorama = setup_panorama_s16_m (1, 1.0);
 
-  panorama = setup_panorama_s ();
-  g_object_set (G_OBJECT (panorama), "method", 1, NULL);
-  fail_unless (gst_element_set_state (panorama,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
+  do_panorama (in, sizeof (in), res, sizeof (res));
 
-  inbuffer =
-      gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, sizeof (in), 0,
-      sizeof (in), NULL, NULL);
-  caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING);
-  gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+  GST_INFO ("exp. %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+5d %+5d %+5d %+5d", res[0], res[1], res[2], res[3]);
+  fail_unless (memcmp (res, out, sizeof (res)) == 0);
 
-  /* pushing gives away my reference ... */
-  fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
-  /* ... but it ends up being collected on the global buffer list */
-  fail_unless_equals_int (g_list_length (buffers), 1);
-  fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
+  cleanup_panorama (panorama);
+}
 
-  fail_unless (gst_buffer_extract (outbuffer, 0, res, 8) == 8);
-  GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d",
-      in[0], in[1], in[2], in[3], res[0], res[1], res[2], res[3]);
-  fail_unless (gst_buffer_memcmp (outbuffer, 0, in, 8) == 0);
+GST_END_TEST;
+
+GST_START_TEST (test_s16_stereo_middle_simple)
+{
+  gint16 in[4] = { 16384, -256, 8192, 128 };
+  gint16 res[4];
+  GstElement *panorama = setup_panorama_s16_s (1, 0.0);
+
+  do_panorama (in, sizeof (in), res, sizeof (res));
+
+  GST_INFO ("exp. %+5d %+5d %+5d %+5d", in[0], in[1], in[2], in[3]);
+  GST_INFO ("real %+5d %+5d %+5d %+5d", res[0], res[1], res[2], res[3]);
+  fail_unless (memcmp (res, in, sizeof (res)) == 0);
 
-  /* cleanup */
   cleanup_panorama (panorama);
 }
 
 GST_END_TEST;
 
-GST_START_TEST (test_stereo_left_simple)
+GST_START_TEST (test_s16_stereo_left_simple)
 {
-  GstElement *panorama;
-  GstBuffer *inbuffer, *outbuffer;
-  GstCaps *caps;
   gint16 in[4] = { 16384, -256, 8192, 128 };
   gint16 out[4] = { 16384, 0, 8192, 0 };
   gint16 res[4];
+  GstElement *panorama = setup_panorama_s16_s (1, -1.0);
 
-  panorama = setup_panorama_s ();
-  g_object_set (G_OBJECT (panorama), "method", 1, NULL);
-  g_object_set (G_OBJECT (panorama), "panorama", -1.0, NULL);
-  fail_unless (gst_element_set_state (panorama,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
-
-  inbuffer =
-      gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, sizeof (in), 0,
-      sizeof (in), NULL, NULL);
-  fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 8) == 0);
-  caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING);
-  gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
-
-  /* pushing gives away my reference ... */
-  fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
-  /* ... and puts a new buffer on the global list */
-  fail_unless_equals_int (g_list_length (buffers), 1);
-  fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
+  do_panorama (in, sizeof (in), res, sizeof (res));
 
-  fail_unless (gst_buffer_extract (outbuffer, 0, res, 8) == 8);
-  GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d",
-      out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]);
-  fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 8) == 0);
+  GST_INFO ("exp. %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+5d %+5d %+5d %+5d", res[0], res[1], res[2], res[3]);
+  fail_unless (memcmp (res, out, sizeof (res)) == 0);
 
-  /* cleanup */
   cleanup_panorama (panorama);
 }
 
 GST_END_TEST;
 
-GST_START_TEST (test_stereo_right_simple)
+GST_START_TEST (test_s16_stereo_right_simple)
 {
-  GstElement *panorama;
-  GstBuffer *inbuffer, *outbuffer;
-  GstCaps *caps;
   gint16 in[4] = { 16384, -256, 8192, 128 };
   gint16 out[4] = { 0, -256, 0, 128 };
   gint16 res[4];
+  GstElement *panorama = setup_panorama_s16_s (1, 1.0);
 
-  panorama = setup_panorama_s ();
-  g_object_set (G_OBJECT (panorama), "method", 1, NULL);
-  g_object_set (G_OBJECT (panorama), "panorama", 1.0, NULL);
-  fail_unless (gst_element_set_state (panorama,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
+  do_panorama (in, sizeof (in), res, sizeof (res));
 
-  inbuffer =
-      gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, sizeof (in), 0,
-      sizeof (in), NULL, NULL);
-  fail_unless (gst_buffer_memcmp (inbuffer, 0, in, 8) == 0);
-  caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING);
-  gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
+  GST_INFO ("exp. %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+5d %+5d %+5d %+5d", res[0], res[1], res[2], res[3]);
+  fail_unless (memcmp (res, out, sizeof (res)) == 0);
 
-  /* pushing gives away my reference ... */
-  fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
-  /* ... and puts a new buffer on the global list */
-  fail_unless_equals_int (g_list_length (buffers), 1);
-  fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
+  cleanup_panorama (panorama);
+}
 
-  fail_unless (gst_buffer_extract (outbuffer, 0, res, 8) == 8);
-  GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d",
-      out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]);
-  fail_unless (gst_buffer_memcmp (outbuffer, 0, out, 8) == 0);
+GST_END_TEST;
+
+//-----------------------------------------------------------------------------
+
+GST_START_TEST (test_f32_mono_middle_simple)
+{
+  gfloat in[2] = { 0.5, -0.2 };
+  gfloat out[4] = { 0.5, 0.5, -0.2, -0.2 };
+  gfloat res[4];
+  GstElement *panorama = setup_panorama_f32_m (1, 0.0);
+  gint i;
+
+  do_panorama (in, sizeof (in), res, sizeof (res));
+
+  GST_INFO ("exp. %+4.2f %+4.2f %+4.2f %+4.2f", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+4.2f %+4.2f %+4.2f %+4.2f", res[0], res[1], res[2], res[3]);
+  for (i = 0; i < 4; i++)
+    fail_unless (res[i] == out[i], "difference at pos=%d", i);
 
-  /* cleanup */
   cleanup_panorama (panorama);
 }
 
 GST_END_TEST;
 
-GST_START_TEST (test_wrong_caps)
+GST_START_TEST (test_f32_mono_left_simple)
 {
-  GstElement *panorama;
-  GstBuffer *inbuffer;
-  gint16 in[2] = { 16384, -256 };
-  GstBus *bus;
-  GstMessage *message;
-  GstCaps *caps;
+  gfloat in[2] = { 0.5, -0.2 };
+  gfloat out[4] = { 0.5, 0.0, -0.2, 0.0 };
+  gfloat res[4];
+  GstElement *panorama = setup_panorama_f32_m (1, -1.0);
+  gint i;
 
-  panorama = setup_panorama_m ();
-  bus = gst_bus_new ();
+  do_panorama (in, sizeof (in), res, sizeof (res));
 
-  fail_unless (gst_element_set_state (panorama,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
+  GST_INFO ("exp. %+4.2f %+4.2f %+4.2f %+4.2f", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+4.2f %+4.2f %+4.2f %+4.2f", res[0], res[1], res[2], res[3]);
+  for (i = 0; i < 4; i++)
+    fail_unless (res[i] == out[i], "difference at pos=%d", i);
 
-  inbuffer =
-      gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, in, sizeof (in), 0,
-      sizeof (in), NULL, NULL);
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
-  gst_buffer_ref (inbuffer);
+  cleanup_panorama (panorama);
+}
 
-  /* set a bus here so we avoid getting state change messages */
-  gst_element_set_bus (panorama, bus);
+GST_END_TEST;
 
-  caps = gst_caps_from_string (PANORAMA_WRONG_CAPS_STRING);
-  /* this actually succeeds, because the caps event is sticky */
-  gst_check_setup_events (mysrcpad, panorama, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
+GST_START_TEST (test_f32_mono_right_simple)
+{
+  gfloat in[2] = { 0.5, -0.2 };
+  gfloat out[4] = { 0.0, 0.5, 0.0, -0.2 };
+  gfloat res[4];
+  GstElement *panorama = setup_panorama_f32_m (1, 1.0);
+  gint i;
 
-  /* pushing gives an error because it can't negotiate with wrong caps */
-  fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer),
-      GST_FLOW_NOT_NEGOTIATED);
-  /* ... and the buffer would have been lost if we didn't ref it ourselves */
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
-  gst_buffer_unref (inbuffer);
-  fail_unless_equals_int (g_list_length (buffers), 0);
+  do_panorama (in, sizeof (in), res, sizeof (res));
 
-  /* panorama_set_caps should not have been called since basetransform caught
-   * the negotiation problem */
-  fail_if ((message = gst_bus_pop (bus)) != NULL);
+  GST_INFO ("exp. %+4.2f %+4.2f %+4.2f %+4.2f", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+4.2f %+4.2f %+4.2f %+4.2f", res[0], res[1], res[2], res[3]);
+  for (i = 0; i < 4; i++)
+    fail_unless (res[i] == out[i], "difference at pos=%d", i);
+
+  cleanup_panorama (panorama);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_f32_stereo_middle_simple)
+{
+  gfloat in[4] = { 0.5, -0.2, 0.25, 0.1 };
+  gfloat res[4];
+  GstElement *panorama = setup_panorama_f32_s (1, 0.0);
+  gint i;
+
+  do_panorama (in, sizeof (in), res, sizeof (res));
+
+  GST_INFO ("exp. %+4.2f %+4.2f %+4.2f %+4.2f", in[0], in[1], in[2], in[3]);
+  GST_INFO ("real %+4.2f %+4.2f %+4.2f %+4.2f", res[0], res[1], res[2], res[3]);
+  for (i = 0; i < 4; i++)
+    fail_unless (res[i] == in[i], "difference at pos=%d", i);
+
+  cleanup_panorama (panorama);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_f32_stereo_left_simple)
+{
+  gfloat in[4] = { 0.5, -0.2, 0.25, 0.1 };
+  gfloat out[4] = { 0.5, 0.0, 0.25, 0.0 };
+  gfloat res[4];
+  GstElement *panorama = setup_panorama_f32_s (1, -1.0);
+  gint i;
+
+  do_panorama (in, sizeof (in), res, sizeof (res));
+
+  GST_INFO ("exp. %+4.2f %+4.2f %+4.2f %+4.2f", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+4.2f %+4.2f %+4.2f %+4.2f", res[0], res[1], res[2], res[3]);
+  for (i = 0; i < 4; i++)
+    fail_unless (res[i] == out[i], "difference at pos=%d", i);
+
+  cleanup_panorama (panorama);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_f32_stereo_right_simple)
+{
+  gfloat in[4] = { 0.5, -0.2, 0.25, 0.1 };
+  gfloat out[4] = { 0.0, -0.2, 0.0, 0.1 };
+  gfloat res[4];
+  GstElement *panorama = setup_panorama_f32_s (1, 1.0);
+  gint i;
+
+  do_panorama (in, sizeof (in), res, sizeof (res));
+
+  GST_INFO ("exp. %+4.2f %+4.2f %+4.2f %+4.2f", out[0], out[1], out[2], out[3]);
+  GST_INFO ("real %+4.2f %+4.2f %+4.2f %+4.2f", res[0], res[1], res[2], res[3]);
+  for (i = 0; i < 4; i++)
+    fail_unless (res[i] == out[i], "difference at pos=%d", i);
 
-  /* cleanup */
-  gst_element_set_bus (panorama, NULL);
-  gst_object_unref (GST_OBJECT (bus));
   cleanup_panorama (panorama);
 }
 
@@ -683,36 +783,36 @@ panorama_suite (void)
   TCase *tc_chain = tcase_create ("general");
 
   suite_add_tcase (s, tc_chain);
-  tcase_add_test (tc_chain, test_mono_middle);
-  tcase_add_test (tc_chain, test_mono_left);
-  tcase_add_test (tc_chain, test_mono_right);
-  tcase_add_test (tc_chain, test_stereo_middle);
-  tcase_add_test (tc_chain, test_stereo_left);
-  tcase_add_test (tc_chain, test_stereo_right);
-  tcase_add_test (tc_chain, test_mono_middle_simple);
-  tcase_add_test (tc_chain, test_mono_left_simple);
-  tcase_add_test (tc_chain, test_mono_right_simple);
-  tcase_add_test (tc_chain, test_stereo_middle_simple);
-  tcase_add_test (tc_chain, test_stereo_left_simple);
-  tcase_add_test (tc_chain, test_stereo_right_simple);
+  tcase_add_test (tc_chain, test_ref_counts);
   tcase_add_test (tc_chain, test_wrong_caps);
+  /* processing for method=psy */
+  tcase_add_test (tc_chain, test_s16_mono_middle);
+  tcase_add_test (tc_chain, test_s16_mono_left);
+  tcase_add_test (tc_chain, test_s16_mono_right);
+  tcase_add_test (tc_chain, test_s16_stereo_middle);
+  tcase_add_test (tc_chain, test_s16_stereo_left);
+  tcase_add_test (tc_chain, test_s16_stereo_right);
+  tcase_add_test (tc_chain, test_f32_mono_middle);
+  tcase_add_test (tc_chain, test_f32_mono_left);
+  tcase_add_test (tc_chain, test_f32_mono_right);
+  tcase_add_test (tc_chain, test_f32_stereo_middle);
+  tcase_add_test (tc_chain, test_f32_stereo_left);
+  tcase_add_test (tc_chain, test_f32_stereo_right);
+  /* processing for method=simple */
+  tcase_add_test (tc_chain, test_s16_mono_middle_simple);
+  tcase_add_test (tc_chain, test_s16_mono_left_simple);
+  tcase_add_test (tc_chain, test_s16_mono_right_simple);
+  tcase_add_test (tc_chain, test_s16_stereo_middle_simple);
+  tcase_add_test (tc_chain, test_s16_stereo_left_simple);
+  tcase_add_test (tc_chain, test_s16_stereo_right_simple);
+  tcase_add_test (tc_chain, test_f32_mono_middle_simple);
+  tcase_add_test (tc_chain, test_f32_mono_left_simple);
+  tcase_add_test (tc_chain, test_f32_mono_right_simple);
+  tcase_add_test (tc_chain, test_f32_stereo_middle_simple);
+  tcase_add_test (tc_chain, test_f32_stereo_left_simple);
+  tcase_add_test (tc_chain, test_f32_stereo_right_simple);
 
   return s;
 }
 
-int
-main (int argc, char **argv)
-{
-  int nf;
-
-  Suite *s = panorama_suite ();
-  SRunner *sr = srunner_create (s);
-
-  gst_check_init (&argc, &argv);
-
-  srunner_run_all (sr, CK_NORMAL);
-  nf = srunner_ntests_failed (sr);
-  srunner_free (sr);
-
-  return nf;
-}
+GST_CHECK_MAIN (panorama);