diff Plugins/Input/mpg123/decode_2to1.c @ 61:fa848bd484d8 trunk

[svn] Move plugins to Plugins/
author nenolod
date Fri, 28 Oct 2005 22:58:11 -0700
parents
children 05d824e30afd
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/Input/mpg123/decode_2to1.c	Fri Oct 28 22:58:11 2005 -0700
@@ -0,0 +1,251 @@
+
+/*
+ * Mpeg Layer-1,2,3 audio decoder
+ * ------------------------------
+ * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
+ * version for slower machines .. decodes only every second sample
+ * sounds like 24000,22050 or 16000 kHz .. (depending on original sample freq.)
+ *
+ */
+
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#include "mpg123.h"
+
+#define WRITE_SAMPLE(samples,sum,clip) \
+  if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
+  else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
+  else { *(samples) = sum; }
+
+int
+mpg123_synth_2to1_8bit(real * bandPtr, int channel,
+                       unsigned char *samples, int *pnt)
+{
+    short samples_tmp[32];
+    short *tmp1 = samples_tmp + channel;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret =
+        mpg123_synth_2to1(bandPtr, channel, (unsigned char *) samples_tmp,
+                          &pnt1);
+    samples += channel + *pnt;
+
+    for (i = 0; i < 16; i++) {
+        *samples = (*tmp1 >> 8) ^ 128;
+        samples += 2;
+        tmp1 += 2;
+    }
+    *pnt += 32;
+
+    return ret;
+}
+
+int
+mpg123_synth_2to1_8bit_mono(real * bandPtr, unsigned char *samples, int *pnt)
+{
+    short samples_tmp[32];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_2to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 16; i++) {
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        tmp1 += 2;
+    }
+    *pnt += 16;
+
+    return ret;
+}
+
+#if 0
+int
+mpg123_synth_2to1_8bit_mono2stereo(real * bandPtr,
+                                   unsigned char *samples, int *pnt)
+{
+    short samples_tmp[32];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_2to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 16; i++) {
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        tmp1 += 2;
+    }
+    *pnt += 32;
+
+    return ret;
+}
+#endif
+
+int
+mpg123_synth_2to1_mono(real * bandPtr, unsigned char *samples, int *pnt)
+{
+    short samples_tmp[32];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_2to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 16; i++) {
+        *((short *) samples) = *tmp1;
+        samples += 2;
+        tmp1 += 2;
+    }
+    *pnt += 32;
+
+    return ret;
+}
+
+#if 0
+int
+mpg123_synth_2to1_mono2stereo(real * bandPtr, unsigned char *samples,
+                              int *pnt)
+{
+    int i, ret;
+
+    ret = mpg123_synth_2to1(bandPtr, 0, samples, pnt);
+    samples = samples + *pnt - 64;
+
+    for (i = 0; i < 16; i++) {
+        ((short *) samples)[1] = ((short *) samples)[0];
+        samples += 4;
+    }
+
+    return ret;
+}
+#endif
+
+int
+mpg123_synth_2to1(real * bandPtr, int channel, unsigned char *out, int *pnt)
+{
+    static real buffs[2][2][0x110];
+    static const int step = 2;
+    static int bo = 1;
+    short *samples = (short *) (out + *pnt);
+
+    real *b0, (*buf)[0x110];
+    int clip = 0;
+    int bo1;
+
+/*  if(param.equalizer)
+   do_equalizer(bandPtr,channel); */
+
+    if (!channel) {
+        bo--;
+        bo &= 0xf;
+        buf = buffs[0];
+    }
+    else {
+        samples++;
+        buf = buffs[1];
+    }
+
+    if (bo & 0x1) {
+        b0 = buf[0];
+        bo1 = bo;
+        mpg123_dct64(buf[1] + ((bo + 1) & 0xf), buf[0] + bo, bandPtr);
+    }
+    else {
+        b0 = buf[1];
+        bo1 = bo + 1;
+        mpg123_dct64(buf[0] + bo, buf[1] + bo + 1, bandPtr);
+    }
+
+    {
+        register int j;
+        real *window = mpg123_decwin + 16 - bo1;
+
+        for (j = 8; j; j--, b0 += 0x10, window += 0x30) {
+            real sum;
+
+            sum = *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#if 0
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#endif
+        }
+
+        {
+            real sum;
+
+            sum = window[0x0] * b0[0x0];
+            sum += window[0x2] * b0[0x2];
+            sum += window[0x4] * b0[0x4];
+            sum += window[0x6] * b0[0x6];
+            sum += window[0x8] * b0[0x8];
+            sum += window[0xA] * b0[0xA];
+            sum += window[0xC] * b0[0xC];
+            sum += window[0xE] * b0[0xE];
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#if 0
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#endif
+            b0 -= 0x20, window -= 0x40;
+        }
+        window += bo1 << 1;
+
+        for (j = 7; j; j--, b0 -= 0x30, window -= 0x30) {
+            real sum;
+
+            sum = -*(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#if 0
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#endif
+        }
+    }
+
+    *pnt += 64;
+
+    return clip;
+}