[Asterisk-cvs] asterisk indications.c,1.28,1.29
markster
markster
Sat Oct 15 23:13:04 CDT 2005
Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv7302
Modified Files:
indications.c
Log Message:
Make indications work more efficiently and without heavy floating point (bug #5360)
Index: indications.c
===================================================================
RCS file: /usr/cvsroot/asterisk/indications.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- indications.c 14 Sep 2005 20:46:49 -0000 1.28
+++ indications.c 16 Oct 2005 03:07:15 -0000 1.29
@@ -61,10 +61,14 @@
};
struct playtones_item {
- int freq1;
- int freq2;
- int duration;
+ int fac1;
+ int init_v2_1;
+ int init_v3_1;
+ int fac2;
+ int init_v2_2;
+ int init_v3_2;
int modulate;
+ int duration;
};
struct playtones_def {
@@ -77,10 +81,17 @@
struct playtones_state {
int vol;
+ int v1_1;
+ int v2_1;
+ int v3_1;
+ int v1_2;
+ int v2_2;
+ int v3_2;
int reppos;
int nitems;
struct playtones_item *items;
int npos;
+ int oldnpos;
int pos;
int origwfmt;
struct ast_frame f;
@@ -115,6 +126,7 @@
ps->reppos = pd->reppos;
ps->nitems = pd->nitems;
ps->items = pd->items;
+ ps->oldnpos = -1;
}
/* Let interrupts interrupt :) */
if (pd->interruptible)
@@ -140,20 +152,34 @@
memset(&ps->f, 0, sizeof(ps->f));
pi = &ps->items[ps->npos];
+ if (ps->oldnpos != ps->npos) {
+ /* Load new parameters */
+ ps->v1_1 = 0;
+ ps->v2_1 = pi->init_v2_1;
+ ps->v3_1 = pi->init_v3_1;
+ ps->v1_2 = 0;
+ ps->v2_2 = pi->init_v2_2;
+ ps->v3_2 = pi->init_v3_2;
+ ps->oldnpos = ps->npos;
+ }
for (x=0;x<len/2;x++) {
- if (pi->modulate)
- /* Modulate 1st tone with 2nd, to 90% modulation depth */
- ps->data[x] = ps->vol * 2 * (
- sin((pi->freq1 * 2.0 * M_PI / 8000.0) * (ps->pos + x)) *
- (0.9 * fabs(sin((pi->freq2 * 2.0 * M_PI / 8000.0) * (ps->pos + x))) + 0.1)
- );
- else
- /* Add 2 tones together */
- ps->data[x] = ps->vol * (
- sin((pi->freq1 * 2.0 * M_PI / 8000.0) * (ps->pos + x)) +
- sin((pi->freq2 * 2.0 * M_PI / 8000.0) * (ps->pos + x))
- );
+ ps->v1_1 = ps->v2_1;
+ ps->v2_1 = ps->v3_1;
+ ps->v3_1 = (pi->fac1 * ps->v2_1 >> 15) - ps->v1_1;
+
+ ps->v1_2 = ps->v2_2;
+ ps->v2_2 = ps->v3_2;
+ ps->v3_2 = (pi->fac2 * ps->v2_2 >> 15) - ps->v1_2;
+ if (pi->modulate) {
+ int p;
+ p = ps->v3_2 - 32768;
+ if (p < 0) p = -p;
+ p = ((p * 9) / 10) + 1;
+ ps->data[x] = (ps->v3_1 * p) >> 15;
+ } else
+ ps->data[x] = ps->v3_1 + ps->v3_2;
}
+
ps->f.frametype = AST_FRAME_VOICE;
ps->f.subclass = AST_FORMAT_SLINEAR;
ps->f.datalen = len;
@@ -192,7 +218,7 @@
if (!data)
return -1;
if (vol < 1)
- d.vol = 8192;
+ d.vol = 7219; /* Default to -8db */
d.interruptible = interruptible;
@@ -278,8 +304,13 @@
ast_log(LOG_WARNING, "Realloc failed!\n");
return -1;
}
- d.items[d.nitems].freq1 = freq1;
- d.items[d.nitems].freq2 = freq2;
+ d.items[d.nitems].fac1 = 2.0 * cos(2.0 * M_PI * (freq1 / 8000.0)) * 32768.0;
+ d.items[d.nitems].init_v2_1 = sin(-4.0 * M_PI * (freq1 / 8000.0)) * d.vol;
+ d.items[d.nitems].init_v3_1 = sin(-2.0 * M_PI * (freq1 / 8000.0)) * d.vol;
+
+ d.items[d.nitems].fac2 = 2.0 * cos(2.0 * M_PI * (freq2 / 8000.0)) * 32768.0;
+ d.items[d.nitems].init_v2_2 = sin(-4.0 * M_PI * (freq2 / 8000.0)) * d.vol;
+ d.items[d.nitems].init_v3_2 = sin(-2.0 * M_PI * (freq2 / 8000.0)) * d.vol;
d.items[d.nitems].duration = time;
d.items[d.nitems].modulate = modulate;
d.nitems++;
More information about the svn-commits
mailing list