spacescope: use the drawhelpers and add a draw-style property
authorStefan Sauer <ensonic@users.sf.net>
Wed, 23 Nov 2011 10:21:15 +0000 (11:21 +0100)
committerStefan Sauer <ensonic@users.sf.net>
Wed, 23 Nov 2011 10:21:15 +0000 (11:21 +0100)
Like in wavescope support drawing dots and lines.

gst/audiovisualizers/gstspacescope.c
gst/audiovisualizers/gstspacescope.h

index fe8169dc4684ef3d573fec9e71e6077a29cd29e2..f7b7f7d303eb8c49dd199269c9fae6da52074371 100644 (file)
@@ -35,6 +35,7 @@
 #include "config.h"
 #endif
 
+#include <stdlib.h>
 #include "gstspacescope.h"
 
 static GstStaticPadTemplate gst_space_scope_src_template =
@@ -55,6 +56,47 @@ GST_STATIC_PAD_TEMPLATE ("sink",
 GST_DEBUG_CATEGORY_STATIC (space_scope_debug);
 #define GST_CAT_DEFAULT space_scope_debug
 
+enum
+{
+  PROP_0,
+  PROP_STYLE
+};
+
+enum
+{
+  STYLE_DOTS = 0,
+  STYLE_LINES,
+  NUM_STYLES
+};
+
+#define GST_TYPE_SPACE_SCOPE_STYLE (gst_space_scope_style_get_type ())
+static GType
+gst_space_scope_style_get_type (void)
+{
+  static GType gtype = 0;
+
+  if (gtype == 0) {
+    static const GEnumValue values[] = {
+      {STYLE_DOTS, "draw dots (default)", "dots"},
+      {STYLE_LINES, "draw lines", "lines"},
+      {0, NULL, NULL}
+    };
+
+    gtype = g_enum_register_static ("GstSpaceScopeStyle", values);
+  }
+  return gtype;
+}
+
+static void gst_space_scope_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec);
+static void gst_space_scope_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec);
+
+static void render_dots (GstBaseAudioVisualizer * scope, guint32 * vdata,
+    gint16 * adata, guint num_samples);
+static void render_lines (GstBaseAudioVisualizer * scope, guint32 * vdata,
+    gint16 * adata, guint num_samples);
+
 static gboolean gst_space_scope_render (GstBaseAudioVisualizer * scope,
     GstBuffer * audio, GstBuffer * video);
 
@@ -80,10 +122,20 @@ gst_space_scope_base_init (gpointer g_class)
 static void
 gst_space_scope_class_init (GstSpaceScopeClass * g_class)
 {
+  GObjectClass *gobject_class = (GObjectClass *) g_class;
   GstBaseAudioVisualizerClass *scope_class =
       (GstBaseAudioVisualizerClass *) g_class;
 
+  gobject_class->set_property = gst_space_scope_set_property;
+  gobject_class->get_property = gst_space_scope_get_property;
+
   scope_class->render = GST_DEBUG_FUNCPTR (gst_space_scope_render);
+
+  g_object_class_install_property (gobject_class, PROP_STYLE,
+      g_param_spec_enum ("style", "drawing style",
+          "Drawing styles for the space scope display.",
+          GST_TYPE_SPACE_SCOPE_STYLE, STYLE_DOTS,
+          G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 }
 
 static void
@@ -92,19 +144,57 @@ gst_space_scope_init (GstSpaceScope * scope, GstSpaceScopeClass * g_class)
   /* do nothing */
 }
 
-static gboolean
-gst_space_scope_render (GstBaseAudioVisualizer * scope, GstBuffer * audio,
-    GstBuffer * video)
+static void
+gst_space_scope_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec)
 {
-  guint32 *vdata = (guint32 *) GST_BUFFER_DATA (video);
-  gint16 *adata = (gint16 *) GST_BUFFER_DATA (audio);
-  guint i, s, x, y, off, ox, oy;
-  guint num_samples;
+  GstSpaceScope *scope = GST_SPACE_SCOPE (object);
+
+  switch (prop_id) {
+    case PROP_STYLE:
+      scope->style = g_value_get_enum (value);
+      switch (scope->style) {
+        case STYLE_DOTS:
+          scope->process = render_dots;
+          break;
+        case STYLE_LINES:
+          scope->process = render_lines;
+          break;
+      }
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_space_scope_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec)
+{
+  GstSpaceScope *scope = GST_SPACE_SCOPE (object);
+
+  switch (prop_id) {
+    case PROP_STYLE:
+      g_value_set_enum (value, scope->style);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+#include "gstdrawhelpers.h"
+
+static void
+render_dots (GstBaseAudioVisualizer * scope, guint32 * vdata, gint16 * adata,
+    guint num_samples)
+{
+  guint i, s, x, y, ox, oy;
   gfloat dx, dy;
   guint w = scope->width;
 
   /* draw dots 1st channel x, 2nd channel y */
-  num_samples = GST_BUFFER_SIZE (audio) / (scope->channels * sizeof (gint16));
   dx = scope->width / 65536.0;
   ox = scope->width / 2;
   dy = scope->height / 65536.0;
@@ -113,9 +203,47 @@ gst_space_scope_render (GstBaseAudioVisualizer * scope, GstBuffer * audio,
   for (i = 0; i < num_samples; i++) {
     x = (guint) (ox + (gfloat) adata[s++] * dx);
     y = (guint) (oy + (gfloat) adata[s++] * dy);
-    off = (y * w) + x;
-    vdata[off] = 0x00FFFFFF;
+    draw_dot (vdata, x, y, w, 0x00FFFFFF);
+  }
+}
+
+static void
+render_lines (GstBaseAudioVisualizer * scope, guint32 * vdata, gint16 * adata,
+    guint num_samples)
+{
+  guint i, s, x, y, ox, oy;
+  gfloat dx, dy;
+  guint w = scope->width;
+  gint x2, y2;
+
+  /* draw lines 1st channel x, 2nd channel y */
+  dx = scope->width / 65536.0;
+  ox = scope->width / 2;
+  dy = scope->height / 65536.0;
+  oy = scope->height / 2;
+  s = 0;
+  x2 = (guint) (ox + (gfloat) adata[s++] * dx);
+  y2 = (guint) (oy + (gfloat) adata[s++] * dy);
+  for (i = 1; i < num_samples; i++) {
+    x = (guint) (ox + (gfloat) adata[s++] * dx);
+    y = (guint) (oy + (gfloat) adata[s++] * dy);
+    draw_line (vdata, x2, x, y2, y, w, 0x00FFFFFF);
+    x2 = x;
+    y2 = y;
   }
+}
+
+static gboolean
+gst_space_scope_render (GstBaseAudioVisualizer * base, GstBuffer * audio,
+    GstBuffer * video)
+{
+  GstSpaceScope *scope = GST_SPACE_SCOPE (base);
+  guint32 *vdata = (guint32 *) GST_BUFFER_DATA (video);
+  gint16 *adata = (gint16 *) GST_BUFFER_DATA (audio);
+  guint num_samples;
+
+  num_samples = GST_BUFFER_SIZE (audio) / (base->channels * sizeof (gint16));
+  scope->process (base, vdata, adata, num_samples);
   return TRUE;
 }
 
index 0beae5a1f71c6a9b069738b1fe531008d7609745..62600f4b4b9a7ac1e06b83cd7dc3ccf34b8cef29 100644 (file)
@@ -33,9 +33,15 @@ G_BEGIN_DECLS
 typedef struct _GstSpaceScope GstSpaceScope;
 typedef struct _GstSpaceScopeClass GstSpaceScopeClass;
 
+typedef void (*GstSpaceScopeProcessFunc) (GstBaseAudioVisualizer *, guint32 *, gint16 *, guint);
+
 struct _GstSpaceScope
 {
   GstBaseAudioVisualizer parent;
+
+  /* < private > */
+  GstSpaceScopeProcessFunc process;
+  gint style;
 };
 
 struct _GstSpaceScopeClass