aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/Visual/analyzer/analyzer.cpp41
-rw-r--r--src/plugins/Visual/analyzer/inlines.h85
2 files changed, 35 insertions, 91 deletions
diff --git a/src/plugins/Visual/analyzer/analyzer.cpp b/src/plugins/Visual/analyzer/analyzer.cpp
index de17d214d..20aa6fb78 100644
--- a/src/plugins/Visual/analyzer/analyzer.cpp
+++ b/src/plugins/Visual/analyzer/analyzer.cpp
@@ -86,31 +86,28 @@ void Analyzer::add (unsigned char *data, qint64 size, int chan)
{
if (!m_timer->isActive ())
return;
- long len = size, cnt;
- short *l = 0, *r = 0;
-
- len /= chan;
- len /= 2;
- if (len > 512)
- len = 512;
- cnt = len;
- if (chan == 2)
- {
- l = new short[len];
- r = new short[len];
- stereo16_from_stereopcm16 (l, r, (short *) data, cnt);
- }
- else if (chan == 1)
+ short *l = 0, *r = 0;
+ qint64 samples = size/chan >> 1;
+ int frames = samples/512;
+ for (int i = 0; i < frames; ++i)
{
- l = new short[len];
- mono16_from_monopcm16 (l, (short *) data, cnt);
+ l = new short[512];
+ r = 0;
+ if (chan == 2)
+ {
+ r = new short[512];
+ stereo16_from_stereopcm16 (l, r, (short *) (data + i*4*512), 512);
+ }
+ else if (chan == 1)
+ mono16_from_monopcm16 (l, (short *) (data + i*2*512), 512);
+ else
+ {
+ r = new short[512];
+ stereo16_from_multichannel(l, r, (short *) (data + i*2*chan*512), 512, chan);
+ }
+ m_nodes.append (new VisualNode (l, r, 512));
}
- else
- len = 0;
-
- if (len)
- m_nodes.append (new VisualNode (l, r, len));
}
void Analyzer::timeout()
diff --git a/src/plugins/Visual/analyzer/inlines.h b/src/plugins/Visual/analyzer/inlines.h
index d8dbc966d..e2c48d019 100644
--- a/src/plugins/Visual/analyzer/inlines.h
+++ b/src/plugins/Visual/analyzer/inlines.h
@@ -47,49 +47,27 @@ calc_mono_freq(short dest[2][256], short src[2][512], int nch)
}
}
-static inline void stereo16_from_stereopcm8(register short *l,
- register short *r,
- register uchar *c,
- long cnt)
+static inline void stereo16_from_multichannel(register short *l,
+ register short *r,
+ register short *s,
+ long cnt, int chan)
{
- while (cnt >= 4l)
+ while (cnt > 0)
{
- l[0] = c[0];
- r[0] = c[1];
- l[1] = c[2];
- r[1] = c[3];
- l[2] = c[4];
- r[2] = c[5];
- l[3] = c[6];
- r[3] = c[7];
- l += 4;
- r += 4;
- c += 8;
- cnt -= 4l;
- }
-
- if (cnt > 0l)
- {
- l[0] = c[0];
- r[0] = c[1];
- if (cnt > 1l)
- {
- l[1] = c[2];
- r[1] = c[3];
- if (cnt > 2l)
- {
- l[2] = c[4];
- r[2] = c[5];
- }
- }
+ l[0] = s[0];
+ r[0] = s[1];
+ s += chan;
+ l++;
+ r++;
+ cnt--;
}
}
static inline void stereo16_from_stereopcm16(register short *l,
- register short *r,
- register short *s,
- long cnt)
+ register short *r,
+ register short *s,
+ long cnt)
{
while (cnt >= 4l)
{
@@ -124,40 +102,9 @@ static inline void stereo16_from_stereopcm16(register short *l,
}
}
-
-static inline void mono16_from_monopcm8(register short *l,
- register uchar *c,
- long cnt)
-{
- while (cnt >= 4l)
- {
- l[0] = c[0];
- l[1] = c[1];
- l[2] = c[2];
- l[3] = c[3];
- l += 4;
- c += 4;
- cnt -= 4l;
- }
-
- if (cnt > 0l)
- {
- l[0] = c[0];
- if (cnt > 1l)
- {
- l[1] = c[1];
- if (cnt > 2l)
- {
- l[2] = c[2];
- }
- }
- }
-}
-
-
static inline void mono16_from_monopcm16(register short *l,
- register short *s,
- long cnt)
+ register short *s,
+ long cnt)
{
while (cnt >= 4l)
{