diff src/audacious/input.c @ 4259:92642f860860

- added template for src_flow - vis_flow can work now with FMT_FLOAT, but disabled pending src stuff refactoring
author Eugene Zagidullin <e.asphyx@gmail.com>
date Sat, 09 Feb 2008 01:05:36 +0300
parents 704607c1f858
children 2b7a74fce100
line wrap: on
line diff
--- a/src/audacious/input.c	Fri Feb 08 22:21:56 2008 +0300
+++ b/src/audacious/input.c	Sat Feb 09 01:05:36 2008 +0300
@@ -1,5 +1,5 @@
 /*  Audacious - Cross-platform multimedia player
- *  Copyright (C) 2005-2007  Audacious development team
+ *  Copyright (C) 2005-2008  Audacious development team
  *
  *  Based on BMP:
  *  Copyright (C) 2003-2004  BMP development team
@@ -53,6 +53,8 @@
 #include "vfs_buffer.h"
 #include "vfs_buffered_file.h"
 
+#include "libSAD.h"
+
 G_LOCK_DEFINE_STATIC(vis_mutex);
 
 struct _VisNode {
@@ -77,6 +79,8 @@
 
 static GList *vis_list = NULL;
 static int volume_l = -1, volume_r = -1;
+static SAD_dither_t *sad_state = NULL;
+static gint sad_nch = -1;
 
 InputPlayback *
 get_current_input_playback(void)
@@ -144,141 +148,63 @@
     G_UNLOCK(vis_mutex);
 }
 
-static void
-convert_to_s16_ne(AFormat fmt, gpointer ptr, gint16 * left,
-                  gint16 * right, gint nch, gint max)
-{
-    gint16 *ptr16;
-    guint16 *ptru16;
-    guint8 *ptru8;
-    gint i;
-
-    switch (fmt) {
-    case FMT_U8:
-        ptru8 = ptr;
-        if (nch == 1)
-            for (i = 0; i < max; i++)
-                left[i] = ((*ptru8++) ^ 128) << 8;
-        else
-            for (i = 0; i < max; i++) {
-                left[i] = ((*ptru8++) ^ 128) << 8;
-                right[i] = ((*ptru8++) ^ 128) << 8;
-            }
-        break;
-    case FMT_S8:
-        ptru8 = ptr;
-        if (nch == 1)
-            for (i = 0; i < max; i++)
-                left[i] = (*ptru8++) << 8;
-        else
-            for (i = 0; i < max; i++) {
-                left[i] = (*ptru8++) << 8;
-                right[i] = (*ptru8++) << 8;
-            }
-        break;
-    case FMT_U16_LE:
-        ptru16 = ptr;
-        if (nch == 1)
-            for (i = 0; i < max; i++, ptru16++)
-                left[i] = GUINT16_FROM_LE(*ptru16) ^ 32768;
-        else
-            for (i = 0; i < max; i++) {
-                left[i] = GUINT16_FROM_LE(*ptru16) ^ 32768;
-                ptru16++;
-                right[i] = GUINT16_FROM_LE(*ptru16) ^ 32768;
-                ptru16++;
-            }
-        break;
-    case FMT_U16_BE:
-        ptru16 = ptr;
-        if (nch == 1)
-            for (i = 0; i < max; i++, ptru16++)
-                left[i] = GUINT16_FROM_BE(*ptru16) ^ 32768;
-        else
-            for (i = 0; i < max; i++) {
-                left[i] = GUINT16_FROM_BE(*ptru16) ^ 32768;
-                ptru16++;
-                right[i] = GUINT16_FROM_BE(*ptru16) ^ 32768;
-                ptru16++;
-            }
-        break;
-    case FMT_U16_NE:
-        ptru16 = ptr;
-        if (nch == 1)
-            for (i = 0; i < max; i++)
-                left[i] = (*ptru16++) ^ 32768;
-        else
-            for (i = 0; i < max; i++) {
-                left[i] = (*ptru16++) ^ 32768;
-                right[i] = (*ptru16++) ^ 32768;
-            }
-        break;
-    case FMT_S16_LE:
-        ptr16 = ptr;
-        if (nch == 1)
-            for (i = 0; i < max; i++, ptr16++)
-                left[i] = GINT16_FROM_LE(*ptr16);
-        else
-            for (i = 0; i < max; i++) {
-                left[i] = GINT16_FROM_LE(*ptr16);
-                ptr16++;
-                right[i] = GINT16_FROM_LE(*ptr16);
-                ptr16++;
-            }
-        break;
-    case FMT_S16_BE:
-        ptr16 = ptr;
-        if (nch == 1)
-            for (i = 0; i < max; i++, ptr16++)
-                left[i] = GINT16_FROM_BE(*ptr16);
-        else
-            for (i = 0; i < max; i++) {
-                left[i] = GINT16_FROM_BE(*ptr16);
-                ptr16++;
-                right[i] = GINT16_FROM_BE(*ptr16);
-                ptr16++;
-            }
-        break;
-    case FMT_S16_NE:
-        ptr16 = ptr;
-        if (nch == 1)
-            for (i = 0; i < max; i++)
-                left[i] = (*ptr16++);
-        else
-            for (i = 0; i < max; i++) {
-                left[i] = (*ptr16++);
-                right[i] = (*ptr16++);
-            }
-        break;
-    default:
-        AUDDBG("Incorrect sample format!\n");
-    }
-}
-
 InputVisType
 input_get_vis_type()
 {
     return INPUT_VIS_OFF;
 }
 
+static SAD_dither_t*
+init_sad(gint nch)
+{
+    gint ret;
+
+    SAD_buffer_format in, out;
+    in.sample_format = SAD_SAMPLE_FLOAT;
+    in.fracbits = 0;
+    in.channels = nch;
+    in.channels_order = SAD_CHORDER_INTERLEAVED;
+    in.samplerate = 0;
+    
+    out.sample_format = SAD_SAMPLE_S16;
+    out.fracbits = 0;
+    out.channels = nch;
+    out.channels_order = SAD_CHORDER_SEPARATED; /* sic! --asphyx */
+    out.samplerate = 0;
+        
+    SAD_dither_t *state = SAD_dither_init(&in, &out, &ret);
+    if (state != NULL) SAD_dither_set_dither(state, FALSE);
+    return state;
+}
+
 void
 input_add_vis_pcm(gint time, AFormat fmt, gint nch, gint length, gpointer ptr)
 {
     VisNode *vis_node;
     gint max;
+    
+    if (fmt != FMT_FLOAT || nch > 2) return;
 
-    max = length / nch;
-    if (fmt == FMT_U16_LE || fmt == FMT_U16_BE || fmt == FMT_U16_NE ||
-        fmt == FMT_S16_LE || fmt == FMT_S16_BE || fmt == FMT_S16_NE)
-        max /= 2;
+    if (sad_state == NULL || nch != sad_nch) {
+        if(sad_state != NULL) SAD_dither_free(sad_state);
+        sad_state = init_sad(nch);
+        if(sad_state == NULL) return;
+        sad_nch = nch;
+    }
+
+    max = length / nch / sizeof(float);
     max = CLAMP(max, 0, 512);
 
     vis_node = g_slice_new0(VisNode);
     vis_node->time = time;
     vis_node->nch = nch;
     vis_node->length = max;
-    convert_to_s16_ne(fmt, ptr, vis_node->data[0], vis_node->data[1], nch,
-                      max);
+
+    gint16 *tmp[2];
+
+    tmp[0] = vis_node->data[0];
+    tmp[1] = vis_node->data[1];
+    SAD_dither_process_buffer(sad_state, ptr, tmp, max);
 
     G_LOCK(vis_mutex);
     vis_list = g_list_append(vis_list, vis_node);