monoscope: rework the scaling code

The running average was wrong and the resulting scaling factor was only held in
place using the CLAMP. In addtion we are now convering quickly to volume
changes.

FInally now with this change, we can change the resolution defines and
everythign adjusts.
This commit is contained in:
Stefan Sauer 2016-02-12 20:57:29 +01:00
parent 5e68873d22
commit af29e77858

View file

@ -99,7 +99,7 @@ monoscope_update (struct monoscope_state *stateptr, gint16 data[convolver_big])
int hh1 = hh - 1; int hh1 = hh - 1;
guint32 *loc; guint32 *loc;
int factor; double factor;
int max = 1; int max = 1;
short *thisEq = stateptr->copyEq; short *thisEq = stateptr->copyEq;
@ -108,21 +108,26 @@ monoscope_update (struct monoscope_state *stateptr, gint16 data[convolver_big])
memset (stateptr->display, 0, scope_width * scope_height * sizeof (guint32)); memset (stateptr->display, 0, scope_width * scope_height * sizeof (guint32));
for (i = 0; i < convolver_small; i++) { for (i = 0; i < convolver_small; i++) {
avg = thisEq[i] + (stateptr->avgEq[i] >> 1); avg = (thisEq[i] + stateptr->avgEq[i]) >> 1;
stateptr->avgEq[i] = avg; stateptr->avgEq[i] = avg;
avg = abs (avg); avg = abs (avg);
max = MAX (max, avg); max = MAX (max, avg);
} }
stateptr->avgMax += max - (stateptr->avgMax >> 8); /* running average, 4 values is enough to make it follow volume changes
if (stateptr->avgMax < max) * if this value is too large it will converge slowly
stateptr->avgMax = max; /* Avoid overflow */ */
factor = 0x7fffffff / stateptr->avgMax; stateptr->avgMax += (max / 4) - (stateptr->avgMax / 4);
/* Keep the scaling sensible. */
factor = CLAMP (factor, (1 << 8), (1 << 18)); /* input is +/- avgMax, output is +/- hh */
if (stateptr->avgMax) {
factor = (gdouble) hh / stateptr->avgMax;
} else {
factor = 1.0;
}
for (i = 0; i < scope_width; i++) { for (i = 0; i < scope_width; i++) {
/* scale 16bit signed audio values to scope_height */
foo = stateptr->avgEq[i] * factor; foo = stateptr->avgEq[i] * factor;
foo >>= 18;
foo = CLAMP (foo, -hh1, hh1); foo = CLAMP (foo, -hh1, hh1);
bar = (i + ((foo + hh) * scope_width)); bar = (i + ((foo + hh) * scope_width));
if ((bar > 0) && (bar < (scope_width * scope_height))) { if ((bar > 0) && (bar < (scope_width * scope_height))) {