ref: 053d3b16498c601e2af3023f2011e9fa6bf84843
parent: 663bc67e12efaccd4109068b05f8e6d671b7bd23
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Wed Aug 25 20:00:02 EDT 2021
free voices that faded out below "silence" threshold (chosen to be 0 when converted to s16)
--- a/fs.c
+++ b/fs.c
@@ -9,6 +9,7 @@
#define MAX(a,b) ((a)>=(b)?(a):(b))
#define MIN(a,b) ((a)<=(b)?(a):(b))
+#define Silence 0.00003f
enum {
Maxobjs = 64,
@@ -150,7 +151,7 @@
static int
auxreaddsp(Aux *a, float *b, int total)
{
- int i, j, n, cross;
+ int i, j, n, cross, nzeromax;
Voice *v;
float *m;
State *s;
@@ -173,6 +174,8 @@
v = s->voice;
cross = -1;
+ a->numvoices = 0;
+ nzeromax = a->rate / 5; /* 1/5th of a second, assuming it's mono */
for (i = 0, n = total; i < nelem(s->voice) && n > 0; i++, v++) {
if (v->dsp == nil)
continue;
@@ -194,6 +197,7 @@
}
v->state = Vplaying;
v->samples = 0;
+ v->nzero = 0;
/* slippery floor */
case Vplaying:
if (n < 1)
@@ -206,7 +210,18 @@
b[j] += m[j];
if (s->crossvoice && cross < 0 && j > 0 && CROSS(m[j-1], m[j]))
cross = j;
+ if (m[j] >= -Silence && m[j] <= Silence)
+ v->nzero++;
+ else
+ v->nzero = 0;
}
+
+ if (v->nzero >= nzeromax) { /* been quite for a while? shut it */
+ cross = 0;
+ shutup(s, v);
+ } else {
+ a->numvoices++;
+ }
}
}
@@ -247,7 +262,7 @@
break;
case Xdspctl:
o = auxtype2obj(&a->type);
- sprint(b, "numin\t%d\nnumout\t%d\trate\t%d\n", o->numin, o->numout, o->rate);
+ sprint(b, "numin\t%d\nnumout\t%d\nrate\t%d\nnumvoices\t%d\n", o->numin, o->numout, o->rate, o->numvoices);
readstr(r, b);
respond(r, nil);
break;
--- a/fs.h
+++ b/fs.h
@@ -38,6 +38,7 @@
int numin;
int numout;
int rate;
+ int numvoices;
struct UI *ui;
State *state;
@@ -69,6 +70,7 @@
uvlong samples;
Auxdsp *dsp;
int state;
+ int nzero;
};
struct State {