Merge twisted's dsp formatting fixes (bug #3218)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4638 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Mark Spencer
2005-01-03 01:21:15 +00:00
parent 056325aca6
commit 75d674dd9b

297
dsp.c
View File

@@ -149,7 +149,6 @@ typedef struct {
typedef struct
{
goertzel_state_t row_out[4];
goertzel_state_t col_out[4];
#ifdef FAX_DETECT
@@ -173,12 +172,11 @@ typedef struct
int current_sample;
char digits[MAX_DTMF_DIGITS + 1];
int current_digits;
int detected_digits;
int lost_digits;
int digit_hits[16];
#ifdef FAX_DETECT
int fax_hits;
#endif
@@ -198,9 +196,10 @@ typedef struct
#else
int hits[5];
#endif
int current_sample;
char digits[MAX_DTMF_DIGITS + 1];
int current_digits;
int detected_digits;
int lost_digits;
@@ -246,6 +245,7 @@ static inline void goertzel_sample(goertzel_state_t *s, short sample)
{
float v1;
float fsamp = sample;
v1 = s->v2;
s->v2 = s->v3;
s->v3 = s->fac * s->v2 - v1 + fsamp;
@@ -254,6 +254,7 @@ static inline void goertzel_sample(goertzel_state_t *s, short sample)
static inline void goertzel_update(goertzel_state_t *s, short *samps, int count)
{
int i;
for (i=0;i<count;i++)
goertzel_sample(s, samps[i]);
}
@@ -317,9 +318,7 @@ static void ast_dtmf_detect_init (dtmf_detect_state_t *s)
#else
s->hits[0] = s->hits[1] = s->hits[2] = 0;
#endif
for (i = 0; i < 4; i++)
{
for (i = 0; i < 4; i++) {
goertzel_init (&s->row_out[i], dtmf_row[i], 102);
goertzel_init (&s->col_out[i], dtmf_col[i], 102);
#ifdef OLD_DSP_ROUTINES
@@ -328,7 +327,6 @@ static void ast_dtmf_detect_init (dtmf_detect_state_t *s)
#endif
s->energy = 0.0;
}
#ifdef FAX_DETECT
/* Same for the fax dector */
goertzel_init (&s->fax_tone, fax_freq, 102);
@@ -338,7 +336,6 @@ static void ast_dtmf_detect_init (dtmf_detect_state_t *s)
goertzel_init (&s->fax_tone2nd, fax_freq * 2.0, 102);
#endif
#endif /* FAX_DETECT */
s->current_sample = 0;
s->detected_digits = 0;
s->current_digits = 0;
@@ -350,24 +347,19 @@ static void ast_dtmf_detect_init (dtmf_detect_state_t *s)
static void ast_mf_detect_init (mf_detect_state_t *s)
{
int i;
#ifdef OLD_DSP_ROUTINES
s->hit1 =
s->hit2 = 0;
#else
s->hits[0] = s->hits[1] = s->hits[2] = s->hits[3] = s->hits[4] = 0;
#endif
for (i = 0; i < 6; i++)
{
for (i = 0; i < 6; i++) {
goertzel_init (&s->tone_out[i], mf_tones[i], 160);
#ifdef OLD_DSP_ROUTINES
goertzel_init (&s->tone_out2nd[i], mf_tones[i] * 2.0, 160);
s->energy = 0.0;
#endif
}
s->current_digits = 0;
memset(&s->digits, 0, sizeof(s->digits));
s->current_sample = 0;
@@ -377,12 +369,9 @@ static void ast_mf_detect_init (mf_detect_state_t *s)
s->mhit = 0;
}
static int dtmf_detect (dtmf_detect_state_t *s,
int16_t amp[],
int samples,
static int dtmf_detect (dtmf_detect_state_t *s, int16_t amp[], int samples,
int digitmode, int *writeback, int faxdetect)
{
float row_energy[4];
float col_energy[4];
#ifdef FAX_DETECT
@@ -402,8 +391,7 @@ static int dtmf_detect (dtmf_detect_state_t *s,
int limit;
hit = 0;
for (sample = 0; sample < samples; sample = limit)
{
for (sample = 0; sample < samples; sample = limit) {
/* 102 is optimised to meet the DTMF specs. */
if ((samples - sample) >= (102 - s->current_sample))
limit = sample + (102 - s->current_sample);
@@ -421,46 +409,35 @@ static int dtmf_detect (dtmf_detect_state_t *s,
#else
/* The following unrolled loop takes only 35% (rough estimate) of the
time of a rolled loop on the machine on which it was developed */
for (j = sample; j < limit; j++)
{
for (j=sample;j<limit;j++) {
famp = amp[j];
s->energy += famp*famp;
/* With GCC 2.95, the following unrolled code seems to take about 35%
(rough estimate) as long as a neat little 0-3 loop */
v1 = s->row_out[0].v2;
s->row_out[0].v2 = s->row_out[0].v3;
s->row_out[0].v3 = s->row_out[0].fac*s->row_out[0].v2 - v1 + famp;
v1 = s->col_out[0].v2;
s->col_out[0].v2 = s->col_out[0].v3;
s->col_out[0].v3 = s->col_out[0].fac*s->col_out[0].v2 - v1 + famp;
v1 = s->row_out[1].v2;
s->row_out[1].v2 = s->row_out[1].v3;
s->row_out[1].v3 = s->row_out[1].fac*s->row_out[1].v2 - v1 + famp;
v1 = s->col_out[1].v2;
s->col_out[1].v2 = s->col_out[1].v3;
s->col_out[1].v3 = s->col_out[1].fac*s->col_out[1].v2 - v1 + famp;
v1 = s->row_out[2].v2;
s->row_out[2].v2 = s->row_out[2].v3;
s->row_out[2].v3 = s->row_out[2].fac*s->row_out[2].v2 - v1 + famp;
v1 = s->col_out[2].v2;
s->col_out[2].v2 = s->col_out[2].v3;
s->col_out[2].v3 = s->col_out[2].fac*s->col_out[2].v2 - v1 + famp;
v1 = s->row_out[3].v2;
s->row_out[3].v2 = s->row_out[3].v3;
s->row_out[3].v3 = s->row_out[3].fac*s->row_out[3].v2 - v1 + famp;
v1 = s->col_out[3].v2;
s->col_out[3].v2 = s->col_out[3].v3;
s->col_out[3].v3 = s->col_out[3].fac*s->col_out[3].v2 - v1 + famp;
#ifdef FAX_DETECT
/* Update fax tone */
v1 = s->fax_tone.v2;
@@ -471,36 +448,27 @@ static int dtmf_detect (dtmf_detect_state_t *s,
v1 = s->col_out2nd[0].v2;
s->col_out2nd[0].v2 = s->col_out2nd[0].v3;
s->col_out2nd[0].v3 = s->col_out2nd[0].fac*s->col_out2nd[0].v2 - v1 + famp;
v1 = s->row_out2nd[0].v2;
s->row_out2nd[0].v2 = s->row_out2nd[0].v3;
s->row_out2nd[0].v3 = s->row_out2nd[0].fac*s->row_out2nd[0].v2 - v1 + famp;
v1 = s->col_out2nd[1].v2;
s->col_out2nd[1].v2 = s->col_out2nd[1].v3;
s->col_out2nd[1].v3 = s->col_out2nd[1].fac*s->col_out2nd[1].v2 - v1 + famp;
v1 = s->row_out2nd[1].v2;
s->row_out2nd[1].v2 = s->row_out2nd[1].v3;
s->row_out2nd[1].v3 = s->row_out2nd[1].fac*s->row_out2nd[1].v2 - v1 + famp;
v1 = s->col_out2nd[2].v2;
s->col_out2nd[2].v2 = s->col_out2nd[2].v3;
s->col_out2nd[2].v3 = s->col_out2nd[2].fac*s->col_out2nd[2].v2 - v1 + famp;
v1 = s->row_out2nd[2].v2;
s->row_out2nd[2].v2 = s->row_out2nd[2].v3;
s->row_out2nd[2].v3 = s->row_out2nd[2].fac*s->row_out2nd[2].v2 - v1 + famp;
v1 = s->col_out2nd[3].v2;
s->col_out2nd[3].v2 = s->col_out2nd[3].v3;
s->col_out2nd[3].v3 = s->col_out2nd[3].fac*s->col_out2nd[3].v2 - v1 + famp;
v1 = s->row_out2nd[3].v2;
s->row_out2nd[3].v2 = s->row_out2nd[3].v3;
s->row_out2nd[3].v3 = s->row_out2nd[3].fac*s->row_out2nd[3].v2 - v1 + famp;
#ifdef FAX_DETECT
/* Update fax tone */
v1 = s->fax_tone.v2;
@@ -521,19 +489,16 @@ static int dtmf_detect (dtmf_detect_state_t *s,
}
continue;
}
#ifdef FAX_DETECT
/* Detect the fax energy, too */
fax_energy = goertzel_result(&s->fax_tone);
#endif
/* We are at the end of a DTMF detection block */
/* Find the peak row and the peak column */
row_energy[0] = goertzel_result (&s->row_out[0]);
col_energy[0] = goertzel_result (&s->col_out[0]);
for (best_row = best_col = 0, i = 1; i < 4; i++)
{
for (best_row = best_col = 0, i = 1; i < 4; i++) {
row_energy[i] = goertzel_result (&s->row_out[i]);
if (row_energy[i] > row_energy[best_row])
best_row = i;
@@ -543,40 +508,30 @@ static int dtmf_detect (dtmf_detect_state_t *s,
}
hit = 0;
/* Basic signal level test and the twist test */
if (row_energy[best_row] >= DTMF_THRESHOLD
&&
col_energy[best_col] >= DTMF_THRESHOLD
&&
col_energy[best_col] < row_energy[best_row]*DTMF_REVERSE_TWIST
&&
col_energy[best_col]*DTMF_NORMAL_TWIST > row_energy[best_row])
{
if (row_energy[best_row] >= DTMF_THRESHOLD &&
col_energy[best_col] >= DTMF_THRESHOLD &&
col_energy[best_col] < row_energy[best_row]*DTMF_REVERSE_TWIST &&
col_energy[best_col]*DTMF_NORMAL_TWIST > row_energy[best_row]) {
/* Relative peak test */
for (i = 0; i < 4; i++)
{
if ((i != best_col && col_energy[i]*DTMF_RELATIVE_PEAK_COL > col_energy[best_col])
||
(i != best_row && row_energy[i]*DTMF_RELATIVE_PEAK_ROW > row_energy[best_row]))
{
for (i = 0; i < 4; i++) {
if ((i != best_col &&
col_energy[i]*DTMF_RELATIVE_PEAK_COL > col_energy[best_col]) ||
(i != best_row
&& row_energy[i]*DTMF_RELATIVE_PEAK_ROW > row_energy[best_row])) {
break;
}
}
#ifdef OLD_DSP_ROUTINES
/* ... and second harmonic test */
if (i >= 4
&&
(row_energy[best_row] + col_energy[best_col]) > 42.0*s->energy
&&
if (i >= 4 &&
(row_energy[best_row] + col_energy[best_col]) > 42.0*s->energy &&
goertzel_result(&s->col_out2nd[best_col])*DTMF_2ND_HARMONIC_COL < col_energy[best_col]
&&
goertzel_result (&s->row_out2nd[best_row])*DTMF_2ND_HARMONIC_ROW < row_energy[best_row])
&& goertzel_result(&s->row_out2nd[best_row])*DTMF_2ND_HARMONIC_ROW < row_energy[best_row]) {
#else
/* ... and fraction of total energy test */
if (i >= 4
&&
(row_energy[best_row] + col_energy[best_col]) > DTMF_TO_TOTAL_ENERGY*s->energy)
if (i >= 4 &&
(row_energy[best_row] + col_energy[best_col]) > DTMF_TO_TOTAL_ENERGY*s->energy) {
#endif
{
/* Got a hit */
hit = dtmf_positions[(best_row << 2) + best_col];
if (!(digitmode & DSP_DIGITMODE_NOQUELCH)) {
@@ -591,37 +546,28 @@ static int dtmf_detect (dtmf_detect_state_t *s,
something different preceeding it. This can work with
back to back differing digits. More importantly, it
can work with nasty phones that give a very wobbly start
to a digit. */
to a digit */
#ifdef OLD_DSP_ROUTINES
if (hit == s->hit3 && s->hit3 != s->hit2)
{
if (hit == s->hit3 && s->hit3 != s->hit2) {
s->mhit = hit;
s->digit_hits[(best_row << 2) + best_col]++;
s->detected_digits++;
if (s->current_digits < MAX_DTMF_DIGITS)
{
if (s->current_digits < MAX_DTMF_DIGITS) {
s->digits[s->current_digits++] = hit;
s->digits[s->current_digits] = '\0';
}
else
{
} else {
s->lost_digits++;
}
}
#else
if (hit == s->hits[2] && hit != s->hits[1] && hit != s->hits[0])
{
if (hit == s->hits[2] && hit != s->hits[1] && hit != s->hits[0]) {
s->mhit = hit;
s->digit_hits[(best_row << 2) + best_col]++;
s->detected_digits++;
if (s->current_digits < MAX_DTMF_DIGITS)
{
if (s->current_digits < MAX_DTMF_DIGITS) {
s->digits[s->current_digits++] = hit;
s->digits[s->current_digits] = '\0';
}
else
{
} else {
s->lost_digits++;
}
}
@@ -629,26 +575,24 @@ static int dtmf_detect (dtmf_detect_state_t *s,
}
}
#ifdef FAX_DETECT
if (!hit && (fax_energy >= FAX_THRESHOLD) && (fax_energy >= DTMF_TO_TOTAL_ENERGY*s->energy) && (faxdetect)) {
if (!hit && (fax_energy >= FAX_THRESHOLD) &&
(fax_energy >= DTMF_TO_TOTAL_ENERGY*s->energy) &&
(faxdetect)) {
#if 0
printf("Fax energy/Second Harmonic: %f\n", fax_energy);
#endif
/* XXX Probably need better checking than just this the energy XXX */
hit = 'f';
s->fax_hits++;
}
else {
} else {
if (s->fax_hits > 5) {
hit = 'f';
s->mhit = 'f';
s->detected_digits++;
if (s->current_digits < MAX_DTMF_DIGITS)
{
if (s->current_digits < MAX_DTMF_DIGITS) {
s->digits[s->current_digits++] = hit;
s->digits[s->current_digits] = '\0';
}
else
{
} else {
s->lost_digits++;
}
}
@@ -665,8 +609,7 @@ static int dtmf_detect (dtmf_detect_state_t *s,
s->hits[2] = hit;
#endif
/* Reinitialise the detector for the next block */
for (i = 0; i < 4; i++)
{
for (i = 0; i < 4; i++) {
goertzel_reset(&s->row_out[i]);
goertzel_reset(&s->col_out[i]);
#ifdef OLD_DSP_ROUTINES
@@ -683,8 +626,7 @@ static int dtmf_detect (dtmf_detect_state_t *s,
s->energy = 0.0;
s->current_sample = 0;
}
if ((!s->mhit) || (s->mhit != hit))
{
if ((!s->mhit) || (s->mhit != hit)) {
s->mhit = 0;
return(0);
}
@@ -698,12 +640,9 @@ static int dtmf_detect (dtmf_detect_state_t *s,
#define MF_GSIZE 120
#endif
static int mf_detect (mf_detect_state_t *s,
int16_t amp[],
int samples,
int digitmode, int *writeback)
static int mf_detect (mf_detect_state_t *s, int16_t amp[],
int samples, int digitmode, int *writeback)
{
#ifdef OLD_DSP_ROUTINES
float tone_energy[6];
int best1;
@@ -724,8 +663,7 @@ static int mf_detect (mf_detect_state_t *s,
int limit;
hit = 0;
for (sample = 0; sample < samples; sample = limit)
{
for (sample = 0; sample < samples; sample = limit) {
/* 80 is optimised to meet the MF specs. */
if ((samples - sample) >= (MF_GSIZE - s->current_sample))
limit = sample + (MF_GSIZE - s->current_sample);
@@ -743,61 +681,47 @@ static int mf_detect (mf_detect_state_t *s,
#else
/* The following unrolled loop takes only 35% (rough estimate) of the
time of a rolled loop on the machine on which it was developed */
for (j = sample; j < limit; j++)
{
for (j = sample; j < limit; j++) {
famp = amp[j];
#ifdef OLD_DSP_ROUTINES
s->energy += famp*famp;
#endif
/* With GCC 2.95, the following unrolled code seems to take about 35%
(rough estimate) as long as a neat little 0-3 loop */
v1 = s->tone_out[0].v2;
s->tone_out[0].v2 = s->tone_out[0].v3;
s->tone_out[0].v3 = s->tone_out[0].fac*s->tone_out[0].v2 - v1 + famp;
v1 = s->tone_out[1].v2;
s->tone_out[1].v2 = s->tone_out[1].v3;
s->tone_out[1].v3 = s->tone_out[1].fac*s->tone_out[1].v2 - v1 + famp;
v1 = s->tone_out[2].v2;
s->tone_out[2].v2 = s->tone_out[2].v3;
s->tone_out[2].v3 = s->tone_out[2].fac*s->tone_out[2].v2 - v1 + famp;
v1 = s->tone_out[3].v2;
s->tone_out[3].v2 = s->tone_out[3].v3;
s->tone_out[3].v3 = s->tone_out[3].fac*s->tone_out[3].v2 - v1 + famp;
v1 = s->tone_out[4].v2;
s->tone_out[4].v2 = s->tone_out[4].v3;
s->tone_out[4].v3 = s->tone_out[4].fac*s->tone_out[4].v2 - v1 + famp;
v1 = s->tone_out[5].v2;
s->tone_out[5].v2 = s->tone_out[5].v3;
s->tone_out[5].v3 = s->tone_out[5].fac*s->tone_out[5].v2 - v1 + famp;
#ifdef OLD_DSP_ROUTINES
v1 = s->tone_out2nd[0].v2;
s->tone_out2nd[0].v2 = s->tone_out2nd[0].v3;
s->tone_out2nd[0].v3 = s->tone_out2nd[0].fac*s->tone_out2nd[0].v2 - v1 + famp;
v1 = s->tone_out2nd[1].v2;
s->tone_out2nd[1].v2 = s->tone_out2nd[1].v3;
s->tone_out2nd[1].v3 = s->tone_out2nd[1].fac*s->tone_out2nd[1].v2 - v1 + famp;
v1 = s->tone_out2nd[2].v2;
s->tone_out2nd[2].v2 = s->tone_out2nd[2].v3;
s->tone_out2nd[2].v3 = s->tone_out2nd[2].fac*s->tone_out2nd[2].v2 - v1 + famp;
v1 = s->tone_out2nd[3].v2;
s->tone_out2nd[3].v2 = s->tone_out2nd[3].v3;
s->tone_out2nd[3].v3 = s->tone_out2nd[3].fac*s->tone_out2nd[3].v2 - v1 + famp;
v1 = s->tone_out2nd[4].v2;
s->tone_out2nd[4].v2 = s->tone_out2nd[4].v3;
s->tone_out2nd[4].v3 = s->tone_out2nd[4].fac*s->tone_out2nd[2].v2 - v1 + famp;
v1 = s->tone_out2nd[3].v2;
s->tone_out2nd[5].v2 = s->tone_out2nd[6].v3;
s->tone_out2nd[5].v3 = s->tone_out2nd[6].fac*s->tone_out2nd[3].v2 - v1 + famp;
@@ -815,8 +739,6 @@ static int mf_detect (mf_detect_state_t *s,
}
continue;
}
#ifdef OLD_DSP_ROUTINES
/* We're at the end of an MF detection block. Go ahead and calculate
all the energies. */
@@ -849,14 +771,17 @@ static int mf_detect (mf_detect_state_t *s,
best2 = i;
}
}
hit = 0;
if (best1 != best2) sofarsogood=1;
else sofarsogood=0;
if (best1 != best2)
sofarsogood=1;
else
sofarsogood=0;
/* Check for relative energies */
for (i=0;i<6;i++) {
if (i == best1) continue;
if (i == best2) continue;
if (i == best1)
continue;
if (i == best2)
continue;
if (tone_energy[best1] < tone_energy[i] * MF_RELATIVE_PEAK) {
sofarsogood = 0;
break;
@@ -899,8 +824,7 @@ static int mf_detect (mf_detect_state_t *s,
s->hit2 = s->hit3;
s->hit3 = hit;
/* Reinitialise the detector for the next block */
for (i = 0; i < 6; i++)
{
for (i = 0; i < 6; i++) {
goertzel_reset(&s->tone_out[i]);
goertzel_reset(&s->tone_out2nd[i]);
}
@@ -917,48 +841,33 @@ static int mf_detect (mf_detect_state_t *s,
are considerably stronger than any of the others. */
energy[0] = goertzel_result(&s->tone_out[0]);
energy[1] = goertzel_result(&s->tone_out[1]);
if (energy[0] > energy[1])
{
if (energy[0] > energy[1]) {
best = 0;
second_best = 1;
}
else
{
} else {
best = 1;
second_best = 0;
}
/*endif*/
for (i = 2; i < 6; i++)
{
for (i=2;i<6;i++) {
energy[i] = goertzel_result(&s->tone_out[i]);
if (energy[i] >= energy[best])
{
if (energy[i] >= energy[best]) {
second_best = best;
best = i;
}
else if (energy[i] >= energy[second_best])
{
} else if (energy[i] >= energy[second_best]) {
second_best = i;
}
}
/* Basic signal level and twist tests */
hit = 0;
if (energy[best] >= BELL_MF_THRESHOLD
&&
energy[second_best] >= BELL_MF_THRESHOLD
&&
energy[best] < energy[second_best]*BELL_MF_TWIST
&&
energy[best]*BELL_MF_TWIST > energy[second_best])
{
if (energy[best] >= BELL_MF_THRESHOLD && energy[second_best] >= BELL_MF_THRESHOLD
&& energy[best] < energy[second_best]*BELL_MF_TWIST
&& energy[best]*BELL_MF_TWIST > energy[second_best]) {
/* Relative peak test */
hit = -1;
for (i = 0; i < 6; i++)
{
if (i != best && i != second_best)
{
if (energy[i]*BELL_MF_RELATIVE_PEAK >= energy[second_best])
{
for (i=0;i<6;i++) {
if (i != best && i != second_best) {
if (energy[i]*BELL_MF_RELATIVE_PEAK >= energy[second_best]) {
/* The best two are not clearly the best */
hit = 0;
break;
@@ -966,11 +875,9 @@ static int mf_detect (mf_detect_state_t *s,
}
}
}
if (hit)
{
if (hit) {
/* Get the values into ascending order */
if (second_best < best)
{
if (second_best < best) {
i = best;
best = second_best;
second_best = i;
@@ -983,28 +890,19 @@ static int mf_detect (mf_detect_state_t *s,
two blocks of something different preceeding it. For anything
else we need two successive identical clean detects, with
two blocks of something different preceeding it. */
if (hit == s->hits[4]
&&
hit == s->hits[3]
&&
((hit != '*' && hit != s->hits[2] && hit != s->hits[1])
||
(hit == '*' && hit == s->hits[2] && hit != s->hits[1] && hit != s->hits[0])))
{
if (hit == s->hits[4] && hit == s->hits[3] &&
((hit != '*' && hit != s->hits[2] && hit != s->hits[1])||
(hit == '*' && hit == s->hits[2] && hit != s->hits[1] &&
hit != s->hits[0]))) {
s->detected_digits++;
if (s->current_digits < MAX_DTMF_DIGITS)
{
if (s->current_digits < MAX_DTMF_DIGITS) {
s->digits[s->current_digits++] = hit;
s->digits[s->current_digits] = '\0';
}
else
{
} else {
s->lost_digits++;
}
}
}
else
{
} else {
hit = 0;
}
s->hits[0] = s->hits[1];
@@ -1018,8 +916,7 @@ static int mf_detect (mf_detect_state_t *s,
s->current_sample = 0;
}
#endif
if ((!s->mhit) || (s->mhit != hit))
{
if ((!s->mhit) || (s->mhit != hit)) {
s->mhit = 0;
return(0);
}
@@ -1029,6 +926,7 @@ static int mf_detect (mf_detect_state_t *s,
static int __ast_dsp_digitdetect(struct ast_dsp *dsp, short *s, int len, int *writeback)
{
int res;
if (dsp->digitmode & DSP_DIGITMODE_MF)
res = mf_detect(&dsp->td.mf, s, len, dsp->digitmode & DSP_DIGITMODE_RELAXDTMF, writeback);
else
@@ -1041,6 +939,7 @@ int ast_dsp_digitdetect(struct ast_dsp *dsp, struct ast_frame *inf)
short *s;
int len;
int ign=0;
if (inf->frametype != AST_FRAME_VOICE) {
ast_log(LOG_WARNING, "Can't check call progress of non-voice frames\n");
return 0;
@@ -1074,15 +973,12 @@ static inline int pair_there(float p1, float p2, float i1, float i2, float e)
return 1;
}
int ast_dsp_getdigits (struct ast_dsp *dsp,
char *buf,
int max)
int ast_dsp_getdigits (struct ast_dsp *dsp, char *buf, int max)
{
if (dsp->digitmode & DSP_DIGITMODE_MF) {
if (max > dsp->td.mf.current_digits)
max = dsp->td.mf.current_digits;
if (max > 0)
{
if (max > 0) {
memcpy(buf, dsp->td.mf.digits, max);
memmove(dsp->td.mf.digits, dsp->td.mf.digits + max, dsp->td.mf.current_digits - max);
dsp->td.mf.current_digits -= max;
@@ -1092,8 +988,7 @@ int ast_dsp_getdigits (struct ast_dsp *dsp,
} else {
if (max > dsp->td.dtmf.current_digits)
max = dsp->td.dtmf.current_digits;
if (max > 0)
{
if (max > 0) {
memcpy (buf, dsp->td.dtmf.digits, max);
memmove (dsp->td.dtmf.digits, dsp->td.dtmf.digits + max, dsp->td.dtmf.current_digits - max);
dsp->td.dtmf.current_digits -= max;
@@ -1166,19 +1061,22 @@ static int __ast_dsp_call_progress(struct ast_dsp *dsp, short *s, int len)
if (newstate == dsp->tstate) {
dsp->tcount++;
if (dsp->tcount == COUNT_THRESH) {
if ((dsp->features & DSP_PROGRESS_BUSY) && dsp->tstate == DSP_TONE_STATE_BUSY) {
if ((dsp->features & DSP_PROGRESS_BUSY) &&
dsp->tstate == DSP_TONE_STATE_BUSY) {
res = AST_CONTROL_BUSY;
dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
} else if ((dsp->features & DSP_PROGRESS_TALK) && dsp->tstate == DSP_TONE_STATE_TALKING) {
} else if ((dsp->features & DSP_PROGRESS_TALK) &&
dsp->tstate == DSP_TONE_STATE_TALKING) {
res = AST_CONTROL_ANSWER;
dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
} else if ((dsp->features & DSP_PROGRESS_RINGING) && dsp->tstate == DSP_TONE_STATE_RINGING)
} else if ((dsp->features & DSP_PROGRESS_RINGING) &&
dsp->tstate == DSP_TONE_STATE_RINGING)
res = AST_CONTROL_RINGING;
else if ((dsp->features & DSP_PROGRESS_CONGESTION) && dsp->tstate == DSP_TONE_STATE_SPECIAL3) {
else if ((dsp->features & DSP_PROGRESS_CONGESTION) &&
dsp->tstate == DSP_TONE_STATE_SPECIAL3) {
res = AST_CONTROL_CONGESTION;
dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
}
}
} else {
#if 0
@@ -1223,7 +1121,6 @@ static int __ast_dsp_silence(struct ast_dsp *dsp, short *s, int len, int *totals
if (!len)
return 0;
accum = 0;
for (x=0;x<len; x++)
accum += abs(s[x]);
@@ -1261,7 +1158,6 @@ static int __ast_dsp_silence(struct ast_dsp *dsp, short *s, int len, int *totals
else
dsp->busymaybe = 0;
}
}
dsp->totalsilence = 0;
}
@@ -1308,7 +1204,9 @@ int ast_dsp_busydetect(struct ast_dsp *dsp)
}
}
#ifndef BUSYDETECT_TONEONLY
if ((hittone >= dsp->busycount - 1) && (hitsilence >= dsp->busycount - 1) && (avgtone >= BUSY_MIN && avgtone <= BUSY_MAX) && (avgsilence >= BUSY_MIN && avgsilence <= BUSY_MAX)) {
if ((hittone >= dsp->busycount - 1) && (hitsilence >= dsp->busycount - 1) &&
(avgtone >= BUSY_MIN && avgtone <= BUSY_MAX) &&
(avgsilence >= BUSY_MIN && avgsilence <= BUSY_MAX)) {
#else
if ((hittone >= dsp->busycount - 1) && (avgtone >= BUSY_MIN && avgtone <= BUSY_MAX)) {
#endif
@@ -1483,7 +1381,8 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
if (dsp->digitmode & (DSP_DIGITMODE_MUTECONF | DSP_DIGITMODE_MUTEMAX)) {
if (!dsp->thinkdigit) {
if (digit) {
/* Looks like we might have something. Request a conference mute for the moment */
/* Looks like we might have something.
* Request a conference mute for the moment */
memset(&dsp->f, 0, sizeof(dsp->f));
dsp->f.frametype = AST_FRAME_DTMF;
dsp->f.subclass = 'm';
@@ -1594,6 +1493,7 @@ static void ast_dsp_prog_reset(struct ast_dsp *dsp)
{
int max = 0;
int x;
dsp->gsamp_size = modes[dsp->progmode].size;
dsp->gsamps = 0;
for (x=0;x<sizeof(modes[dsp->progmode].freqs) / sizeof(modes[dsp->progmode].freqs[0]);x++) {
@@ -1608,6 +1508,7 @@ static void ast_dsp_prog_reset(struct ast_dsp *dsp)
struct ast_dsp *ast_dsp_new(void)
{
struct ast_dsp *dsp;
dsp = malloc(sizeof(struct ast_dsp));
if (dsp) {
memset(dsp, 0, sizeof(struct ast_dsp));
@@ -1649,6 +1550,7 @@ void ast_dsp_set_busy_count(struct ast_dsp *dsp, int cadences)
void ast_dsp_digitreset(struct ast_dsp *dsp)
{
int i;
dsp->thinkdigit = 0;
if (dsp->digitmode & DSP_DIGITMODE_MF) {
memset(dsp->td.mf.digits, 0, sizeof(dsp->td.mf.digits));
@@ -1698,18 +1600,20 @@ void ast_dsp_digitreset(struct ast_dsp *dsp)
void ast_dsp_reset(struct ast_dsp *dsp)
{
int x;
dsp->totalsilence = 0;
dsp->gsamps = 0;
for (x=0;x<4;x++)
dsp->freqs[x].v2 = dsp->freqs[x].v3 = 0.0;
memset(dsp->historicsilence, 0, sizeof(dsp->historicsilence));
memset(dsp->historicnoise, 0, sizeof(dsp->historicnoise));
}
int ast_dsp_digitmode(struct ast_dsp *dsp, int digitmode)
{
int new, old;
int new;
int old;
old = dsp->digitmode & (DSP_DIGITMODE_DTMF | DSP_DIGITMODE_MF | DSP_DIGITMODE_MUTECONF | DSP_DIGITMODE_MUTEMAX);
new = digitmode & (DSP_DIGITMODE_DTMF | DSP_DIGITMODE_MF | DSP_DIGITMODE_MUTECONF | DSP_DIGITMODE_MUTEMAX);
if (old != new) {
@@ -1726,6 +1630,7 @@ int ast_dsp_digitmode(struct ast_dsp *dsp, int digitmode)
int ast_dsp_set_call_progress_zone(struct ast_dsp *dsp, char *zone)
{
int x;
for (x=0;x<sizeof(aliases) / sizeof(aliases[0]);x++) {
if (!strcasecmp(aliases[x].name, zone)) {
dsp->progmode = aliases[x].mode;
@@ -1741,9 +1646,7 @@ int ast_dsp_get_tstate(struct ast_dsp *dsp)
return dsp->tstate;
}
int ast_dsp_get_tcount(struct ast_dsp *dsp)
{
return dsp->tcount;
}