mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-06 12:36:58 +00:00
Clean up dsp.conf parsing
Review: https://reviewboard.asterisk.org/r/1434/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@335603 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -34,6 +34,7 @@ Configuration Files:
|
|||||||
|
|
||||||
- cdr.conf: [general] and [csv] sections
|
- cdr.conf: [general] and [csv] sections
|
||||||
- dnsmgr.conf
|
- dnsmgr.conf
|
||||||
|
- dsp.conf
|
||||||
|
|
||||||
SIP
|
SIP
|
||||||
===
|
===
|
||||||
|
131
main/dsp.c
131
main/dsp.c
@@ -59,7 +59,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
|||||||
enum gsamp_size {
|
enum gsamp_size {
|
||||||
GSAMP_SIZE_NA = 183, /*!< North America - 350, 440, 480, 620, 950, 1400, 1800 Hz */
|
GSAMP_SIZE_NA = 183, /*!< North America - 350, 440, 480, 620, 950, 1400, 1800 Hz */
|
||||||
GSAMP_SIZE_CR = 188, /*!< Costa Rica, Brazil - Only care about 425 Hz */
|
GSAMP_SIZE_CR = 188, /*!< Costa Rica, Brazil - Only care about 425 Hz */
|
||||||
GSAMP_SIZE_UK = 160 /*!< UK disconnect goertzel feed - should trigger 400hz */
|
GSAMP_SIZE_UK = 160 /*!< UK disconnect goertzel feed - should trigger 400hz */
|
||||||
};
|
};
|
||||||
|
|
||||||
enum prog_mode {
|
enum prog_mode {
|
||||||
@@ -68,7 +68,7 @@ enum prog_mode {
|
|||||||
PROG_MODE_UK
|
PROG_MODE_UK
|
||||||
};
|
};
|
||||||
|
|
||||||
enum freq_index {
|
enum freq_index {
|
||||||
/*! For US modes { */
|
/*! For US modes { */
|
||||||
HZ_350 = 0,
|
HZ_350 = 0,
|
||||||
HZ_440,
|
HZ_440,
|
||||||
@@ -103,8 +103,8 @@ static struct progress {
|
|||||||
int freqs[7];
|
int freqs[7];
|
||||||
} modes[] = {
|
} modes[] = {
|
||||||
{ GSAMP_SIZE_NA, { 350, 440, 480, 620, 950, 1400, 1800 } }, /*!< North America */
|
{ GSAMP_SIZE_NA, { 350, 440, 480, 620, 950, 1400, 1800 } }, /*!< North America */
|
||||||
{ GSAMP_SIZE_CR, { 425 } }, /*!< Costa Rica, Brazil */
|
{ GSAMP_SIZE_CR, { 425 } }, /*!< Costa Rica, Brazil */
|
||||||
{ GSAMP_SIZE_UK, { 350, 400, 440 } }, /*!< UK */
|
{ GSAMP_SIZE_UK, { 350, 400, 440 } }, /*!< UK */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!\brief This value is the minimum threshold, calculated by averaging all
|
/*!\brief This value is the minimum threshold, calculated by averaging all
|
||||||
@@ -117,26 +117,26 @@ static struct progress {
|
|||||||
#define DEFAULT_THRESHOLD 512
|
#define DEFAULT_THRESHOLD 512
|
||||||
|
|
||||||
enum busy_detect {
|
enum busy_detect {
|
||||||
BUSY_PERCENT = 10, /*!< The percentage difference between the two last silence periods */
|
BUSY_PERCENT = 10, /*!< The percentage difference between the two last silence periods */
|
||||||
BUSY_PAT_PERCENT = 7, /*!< The percentage difference between measured and actual pattern */
|
BUSY_PAT_PERCENT = 7, /*!< The percentage difference between measured and actual pattern */
|
||||||
BUSY_THRESHOLD = 100, /*!< Max number of ms difference between max and min times in busy */
|
BUSY_THRESHOLD = 100, /*!< Max number of ms difference between max and min times in busy */
|
||||||
BUSY_MIN = 75, /*!< Busy must be at least 80 ms in half-cadence */
|
BUSY_MIN = 75, /*!< Busy must be at least 80 ms in half-cadence */
|
||||||
BUSY_MAX =3100 /*!< Busy can't be longer than 3100 ms in half-cadence */
|
BUSY_MAX =3100 /*!< Busy can't be longer than 3100 ms in half-cadence */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! Remember last 15 units */
|
/*! Remember last 15 units */
|
||||||
#define DSP_HISTORY 15
|
#define DSP_HISTORY 15
|
||||||
|
|
||||||
#define TONE_THRESH 10.0 /*!< How much louder the tone should be than channel energy */
|
#define TONE_THRESH 10.0 /*!< How much louder the tone should be than channel energy */
|
||||||
#define TONE_MIN_THRESH 1e8 /*!< How much tone there should be at least to attempt */
|
#define TONE_MIN_THRESH 1e8 /*!< How much tone there should be at least to attempt */
|
||||||
|
|
||||||
/*! All THRESH_XXX values are in GSAMP_SIZE chunks (us = 22ms) */
|
/*! All THRESH_XXX values are in GSAMP_SIZE chunks (us = 22ms) */
|
||||||
enum gsamp_thresh {
|
enum gsamp_thresh {
|
||||||
THRESH_RING = 8, /*!< Need at least 150ms ring to accept */
|
THRESH_RING = 8, /*!< Need at least 150ms ring to accept */
|
||||||
THRESH_TALK = 2, /*!< Talk detection does not work continuously */
|
THRESH_TALK = 2, /*!< Talk detection does not work continuously */
|
||||||
THRESH_BUSY = 4, /*!< Need at least 80ms to accept */
|
THRESH_BUSY = 4, /*!< Need at least 80ms to accept */
|
||||||
THRESH_CONGESTION = 4, /*!< Need at least 80ms to accept */
|
THRESH_CONGESTION = 4, /*!< Need at least 80ms to accept */
|
||||||
THRESH_HANGUP = 60, /*!< Need at least 1300ms to accept hangup */
|
THRESH_HANGUP = 60, /*!< Need at least 1300ms to accept hangup */
|
||||||
THRESH_RING2ANSWER = 300 /*!< Timeout from start of ring to answer (about 6600 ms) */
|
THRESH_RING2ANSWER = 300 /*!< Timeout from start of ring to answer (about 6600 ms) */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -312,10 +312,10 @@ static int thresholds[THRESHOLD_MAX];
|
|||||||
static inline void goertzel_sample(goertzel_state_t *s, short sample)
|
static inline void goertzel_sample(goertzel_state_t *s, short sample)
|
||||||
{
|
{
|
||||||
int v1;
|
int v1;
|
||||||
|
|
||||||
v1 = s->v2;
|
v1 = s->v2;
|
||||||
s->v2 = s->v3;
|
s->v2 = s->v3;
|
||||||
|
|
||||||
s->v3 = (s->fac * s->v2) >> 15;
|
s->v3 = (s->fac * s->v2) >> 15;
|
||||||
s->v3 = s->v3 - v1 + (sample >> s->chunky);
|
s->v3 = s->v3 - v1 + (sample >> s->chunky);
|
||||||
if (abs(s->v3) > 32768) {
|
if (abs(s->v3) > 32768) {
|
||||||
@@ -329,7 +329,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)
|
static inline void goertzel_update(goertzel_state_t *s, short *samps, int count)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
goertzel_sample(s, samps[i]);
|
goertzel_sample(s, samps[i]);
|
||||||
}
|
}
|
||||||
@@ -433,7 +433,7 @@ static void ast_tone_detect_init(tone_detect_state_t *s, int freq, int duration,
|
|||||||
|
|
||||||
/* If we want to remove tone, it is important to have block size not
|
/* If we want to remove tone, it is important to have block size not
|
||||||
to exceed frame size. Otherwise by the moment tone is detected it is too late
|
to exceed frame size. Otherwise by the moment tone is detected it is too late
|
||||||
to squelch it from previous frames. Block size is 20ms at the given sample rate.*/
|
to squelch it from previous frames. Block size is 20ms at the given sample rate.*/
|
||||||
s->block_size = (20 * sample_rate) / 1000;
|
s->block_size = (20 * sample_rate) / 1000;
|
||||||
|
|
||||||
periods_in_block = s->block_size * freq / sample_rate;
|
periods_in_block = s->block_size * freq / sample_rate;
|
||||||
@@ -441,8 +441,9 @@ static void ast_tone_detect_init(tone_detect_state_t *s, int freq, int duration,
|
|||||||
/* Make sure we will have at least 5 periods at target frequency for analisys.
|
/* Make sure we will have at least 5 periods at target frequency for analisys.
|
||||||
This may make block larger than expected packet and will make squelching impossible
|
This may make block larger than expected packet and will make squelching impossible
|
||||||
but at least we will be detecting the tone */
|
but at least we will be detecting the tone */
|
||||||
if (periods_in_block < 5)
|
if (periods_in_block < 5) {
|
||||||
periods_in_block = 5;
|
periods_in_block = 5;
|
||||||
|
}
|
||||||
|
|
||||||
/* Now calculate final block size. It will contain integer number of periods */
|
/* Now calculate final block size. It will contain integer number of periods */
|
||||||
s->block_size = periods_in_block * sample_rate / freq;
|
s->block_size = periods_in_block * sample_rate / freq;
|
||||||
@@ -493,8 +494,9 @@ static void ast_v21_detect_init(v21_detect_state_t *s, unsigned int sample_rate)
|
|||||||
/* Make sure we will have at least 5 periods at target frequency for analisys.
|
/* Make sure we will have at least 5 periods at target frequency for analisys.
|
||||||
This may make block larger than expected packet and will make squelching impossible
|
This may make block larger than expected packet and will make squelching impossible
|
||||||
but at least we will be detecting the tone */
|
but at least we will be detecting the tone */
|
||||||
if (periods_in_block < 5)
|
if (periods_in_block < 5) {
|
||||||
periods_in_block = 5;
|
periods_in_block = 5;
|
||||||
|
}
|
||||||
|
|
||||||
/* Now calculate final block size. It will contain integer number of periods */
|
/* Now calculate final block size. It will contain integer number of periods */
|
||||||
s->block_size = periods_in_block * sample_rate / 1850;
|
s->block_size = periods_in_block * sample_rate / 1850;
|
||||||
@@ -842,7 +844,7 @@ static int dtmf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp
|
|||||||
}
|
}
|
||||||
hit = 0;
|
hit = 0;
|
||||||
/* Basic signal level test and the twist test */
|
/* Basic signal level test and the twist test */
|
||||||
if (row_energy[best_row] >= DTMF_THRESHOLD &&
|
if (row_energy[best_row] >= DTMF_THRESHOLD &&
|
||||||
col_energy[best_col] >= DTMF_THRESHOLD &&
|
col_energy[best_col] >= DTMF_THRESHOLD &&
|
||||||
col_energy[best_col] < row_energy[best_row] * DTMF_REVERSE_TWIST &&
|
col_energy[best_col] < row_energy[best_row] * DTMF_REVERSE_TWIST &&
|
||||||
col_energy[best_col] * DTMF_NORMAL_TWIST > row_energy[best_row]) {
|
col_energy[best_col] * DTMF_NORMAL_TWIST > row_energy[best_row]) {
|
||||||
@@ -850,7 +852,7 @@ static int dtmf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp
|
|||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
if ((i != best_col &&
|
if ((i != best_col &&
|
||||||
col_energy[i] * DTMF_RELATIVE_PEAK_COL > col_energy[best_col]) ||
|
col_energy[i] * DTMF_RELATIVE_PEAK_COL > col_energy[best_col]) ||
|
||||||
(i != best_row
|
(i != best_row
|
||||||
&& row_energy[i] * DTMF_RELATIVE_PEAK_ROW > row_energy[best_row])) {
|
&& row_energy[i] * DTMF_RELATIVE_PEAK_ROW > row_energy[best_row])) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -861,7 +863,7 @@ static int dtmf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp
|
|||||||
/* Got a hit */
|
/* Got a hit */
|
||||||
hit = dtmf_positions[(best_row << 2) + best_col];
|
hit = dtmf_positions[(best_row << 2) + best_col];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->td.dtmf.current_hit) {
|
if (s->td.dtmf.current_hit) {
|
||||||
/* We are in the middle of a digit already */
|
/* We are in the middle of a digit already */
|
||||||
@@ -1001,8 +1003,8 @@ static int mf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp[]
|
|||||||
/* Basic signal level and twist tests */
|
/* Basic signal level and twist tests */
|
||||||
hit = 0;
|
hit = 0;
|
||||||
if (energy[best] >= BELL_MF_THRESHOLD && energy[second_best] >= BELL_MF_THRESHOLD
|
if (energy[best] >= BELL_MF_THRESHOLD && energy[second_best] >= BELL_MF_THRESHOLD
|
||||||
&& energy[best] < energy[second_best]*BELL_MF_TWIST
|
&& energy[best] < energy[second_best]*BELL_MF_TWIST
|
||||||
&& energy[best] * BELL_MF_TWIST > energy[second_best]) {
|
&& energy[best] * BELL_MF_TWIST > energy[second_best]) {
|
||||||
/* Relative peak test */
|
/* Relative peak test */
|
||||||
hit = -1;
|
hit = -1;
|
||||||
for (i = 0; i < 6; i++) {
|
for (i = 0; i < 6; i++) {
|
||||||
@@ -1032,7 +1034,7 @@ static int mf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp[]
|
|||||||
two blocks of something different preceeding it. */
|
two blocks of something different preceeding it. */
|
||||||
if (hit == s->td.mf.hits[4] && hit == s->td.mf.hits[3] &&
|
if (hit == s->td.mf.hits[4] && hit == s->td.mf.hits[3] &&
|
||||||
((hit != '*' && hit != s->td.mf.hits[2] && hit != s->td.mf.hits[1])||
|
((hit != '*' && hit != s->td.mf.hits[2] && hit != s->td.mf.hits[1])||
|
||||||
(hit == '*' && hit == s->td.mf.hits[2] && hit != s->td.mf.hits[1] &&
|
(hit == '*' && hit == s->td.mf.hits[2] && hit != s->td.mf.hits[1] &&
|
||||||
hit != s->td.mf.hits[0]))) {
|
hit != s->td.mf.hits[0]))) {
|
||||||
store_digit(s, hit);
|
store_digit(s, hit);
|
||||||
}
|
}
|
||||||
@@ -1061,8 +1063,9 @@ static int mf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp[]
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Reinitialise the detector for the next block */
|
/* Reinitialise the detector for the next block */
|
||||||
for (i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++) {
|
||||||
goertzel_reset(&s->td.mf.tone_out[i]);
|
goertzel_reset(&s->td.mf.tone_out[i]);
|
||||||
|
}
|
||||||
s->td.mf.current_sample = 0;
|
s->td.mf.current_sample = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1365,8 +1368,8 @@ int ast_dsp_busydetect(struct ast_dsp *dsp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifndef BUSYDETECT_TONEONLY
|
#ifndef BUSYDETECT_TONEONLY
|
||||||
if ((hittone >= dsp->busycount - 1) && (hitsilence >= dsp->busycount - 1) &&
|
if ((hittone >= dsp->busycount - 1) && (hitsilence >= dsp->busycount - 1) &&
|
||||||
(avgtone >= BUSY_MIN && avgtone <= BUSY_MAX) &&
|
(avgtone >= BUSY_MIN && avgtone <= BUSY_MAX) &&
|
||||||
(avgsilence >= BUSY_MIN && avgsilence <= BUSY_MAX)) {
|
(avgsilence >= BUSY_MIN && avgsilence <= BUSY_MAX)) {
|
||||||
#else
|
#else
|
||||||
if ((hittone >= dsp->busycount - 1) && (avgtone >= BUSY_MIN && avgtone <= BUSY_MAX)) {
|
if ((hittone >= dsp->busycount - 1) && (avgtone >= BUSY_MIN && avgtone <= BUSY_MAX)) {
|
||||||
@@ -1603,10 +1606,11 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dsp->features & (DSP_FEATURE_DIGIT_DETECT | DSP_FEATURE_BUSY_DETECT)) {
|
if (dsp->features & (DSP_FEATURE_DIGIT_DETECT | DSP_FEATURE_BUSY_DETECT)) {
|
||||||
if (dsp->digitmode & DSP_DIGITMODE_MF)
|
if (dsp->digitmode & DSP_DIGITMODE_MF) {
|
||||||
digit = mf_detect(dsp, &dsp->digit_state, shortdata, len, (dsp->digitmode & DSP_DIGITMODE_NOQUELCH) == 0, (dsp->digitmode & DSP_DIGITMODE_RELAXDTMF));
|
digit = mf_detect(dsp, &dsp->digit_state, shortdata, len, (dsp->digitmode & DSP_DIGITMODE_NOQUELCH) == 0, (dsp->digitmode & DSP_DIGITMODE_RELAXDTMF));
|
||||||
else
|
} else {
|
||||||
digit = dtmf_detect(dsp, &dsp->digit_state, shortdata, len, (dsp->digitmode & DSP_DIGITMODE_NOQUELCH) == 0, (dsp->digitmode & DSP_DIGITMODE_RELAXDTMF));
|
digit = dtmf_detect(dsp, &dsp->digit_state, shortdata, len, (dsp->digitmode & DSP_DIGITMODE_NOQUELCH) == 0, (dsp->digitmode & DSP_DIGITMODE_RELAXDTMF));
|
||||||
|
}
|
||||||
|
|
||||||
if (dsp->digit_state.current_digits) {
|
if (dsp->digit_state.current_digits) {
|
||||||
int event = 0, event_len = 0;
|
int event = 0, event_len = 0;
|
||||||
@@ -1634,7 +1638,7 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
|
|||||||
dsp->dtmf_began = 0;
|
dsp->dtmf_began = 0;
|
||||||
|
|
||||||
if (dsp->features & DSP_FEATURE_BUSY_DETECT) {
|
if (dsp->features & DSP_FEATURE_BUSY_DETECT) {
|
||||||
/* Reset Busy Detector as we have some confirmed activity */
|
/* Reset Busy Detector as we have some confirmed activity */
|
||||||
memset(dsp->historicsilence, 0, sizeof(dsp->historicsilence));
|
memset(dsp->historicsilence, 0, sizeof(dsp->historicsilence));
|
||||||
memset(dsp->historicnoise, 0, sizeof(dsp->historicnoise));
|
memset(dsp->historicnoise, 0, sizeof(dsp->historicnoise));
|
||||||
ast_debug(1, "DTMF Detected - Reset busydetector\n");
|
ast_debug(1, "DTMF Detected - Reset busydetector\n");
|
||||||
@@ -1675,8 +1679,9 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
|
|||||||
dsp->f.frametype = AST_FRAME_CONTROL;
|
dsp->f.frametype = AST_FRAME_CONTROL;
|
||||||
dsp->f.subclass.integer = res;
|
dsp->f.subclass.integer = res;
|
||||||
dsp->f.src = "dsp_progress";
|
dsp->f.src = "dsp_progress";
|
||||||
if (chan)
|
if (chan) {
|
||||||
ast_queue_frame(chan, &dsp->f);
|
ast_queue_frame(chan, &dsp->f);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ast_log(LOG_WARNING, "Don't know how to represent call progress message %d\n", res);
|
ast_log(LOG_WARNING, "Don't know how to represent call progress message %d\n", res);
|
||||||
@@ -1722,7 +1727,7 @@ static void ast_dsp_prog_reset(struct ast_dsp *dsp)
|
|||||||
{
|
{
|
||||||
int max = 0;
|
int max = 0;
|
||||||
int x;
|
int x;
|
||||||
|
|
||||||
dsp->gsamp_size = modes[dsp->progmode].size;
|
dsp->gsamp_size = modes[dsp->progmode].size;
|
||||||
dsp->gsamps = 0;
|
dsp->gsamps = 0;
|
||||||
for (x = 0; x < ARRAY_LEN(modes[dsp->progmode].freqs); x++) {
|
for (x = 0; x < ARRAY_LEN(modes[dsp->progmode].freqs); x++) {
|
||||||
@@ -1743,8 +1748,8 @@ unsigned int ast_dsp_get_sample_rate(const struct ast_dsp *dsp)
|
|||||||
static struct ast_dsp *__ast_dsp_new(unsigned int sample_rate)
|
static struct ast_dsp *__ast_dsp_new(unsigned int sample_rate)
|
||||||
{
|
{
|
||||||
struct ast_dsp *dsp;
|
struct ast_dsp *dsp;
|
||||||
|
|
||||||
if ((dsp = ast_calloc(1, sizeof(*dsp)))) {
|
if ((dsp = ast_calloc(1, sizeof(*dsp)))) {
|
||||||
dsp->threshold = DEFAULT_THRESHOLD;
|
dsp->threshold = DEFAULT_THRESHOLD;
|
||||||
dsp->features = DSP_FEATURE_SILENCE_SUPPRESS;
|
dsp->features = DSP_FEATURE_SILENCE_SUPPRESS;
|
||||||
dsp->busycount = DSP_HISTORY;
|
dsp->busycount = DSP_HISTORY;
|
||||||
@@ -1810,7 +1815,7 @@ void ast_dsp_set_busy_pattern(struct ast_dsp *dsp, const struct ast_dsp_busy_pat
|
|||||||
void ast_dsp_digitreset(struct ast_dsp *dsp)
|
void ast_dsp_digitreset(struct ast_dsp *dsp)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
dsp->dtmf_began = 0;
|
dsp->dtmf_began = 0;
|
||||||
if (dsp->digitmode & DSP_DIGITMODE_MF) {
|
if (dsp->digitmode & DSP_DIGITMODE_MF) {
|
||||||
mf_detect_state_t *s = &dsp->digit_state.td.mf;
|
mf_detect_state_t *s = &dsp->digit_state.td.mf;
|
||||||
@@ -1841,14 +1846,14 @@ void ast_dsp_digitreset(struct ast_dsp *dsp)
|
|||||||
void ast_dsp_reset(struct ast_dsp *dsp)
|
void ast_dsp_reset(struct ast_dsp *dsp)
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
|
|
||||||
dsp->totalsilence = 0;
|
dsp->totalsilence = 0;
|
||||||
dsp->gsamps = 0;
|
dsp->gsamps = 0;
|
||||||
for (x = 0; x < 4; x++) {
|
for (x = 0; x < 4; x++) {
|
||||||
dsp->freqs[x].v2 = dsp->freqs[x].v3 = 0.0;
|
dsp->freqs[x].v2 = dsp->freqs[x].v3 = 0.0;
|
||||||
}
|
}
|
||||||
memset(dsp->historicsilence, 0, sizeof(dsp->historicsilence));
|
memset(dsp->historicsilence, 0, sizeof(dsp->historicsilence));
|
||||||
memset(dsp->historicnoise, 0, sizeof(dsp->historicnoise));
|
memset(dsp->historicnoise, 0, sizeof(dsp->historicnoise));
|
||||||
dsp->ringtimeout= 0;
|
dsp->ringtimeout= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1856,7 +1861,7 @@ int ast_dsp_set_digitmode(struct ast_dsp *dsp, int digitmode)
|
|||||||
{
|
{
|
||||||
int new;
|
int new;
|
||||||
int old;
|
int old;
|
||||||
|
|
||||||
old = dsp->digitmode & (DSP_DIGITMODE_DTMF | DSP_DIGITMODE_MF | DSP_DIGITMODE_MUTECONF | DSP_DIGITMODE_MUTEMAX);
|
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);
|
new = digitmode & (DSP_DIGITMODE_DTMF | DSP_DIGITMODE_MF | DSP_DIGITMODE_MUTECONF | DSP_DIGITMODE_MUTEMAX);
|
||||||
if (old != new) {
|
if (old != new) {
|
||||||
@@ -1879,7 +1884,7 @@ int ast_dsp_set_faxmode(struct ast_dsp *dsp, int faxmode)
|
|||||||
int ast_dsp_set_call_progress_zone(struct ast_dsp *dsp, char *zone)
|
int ast_dsp_set_call_progress_zone(struct ast_dsp *dsp, char *zone)
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
|
|
||||||
for (x = 0; x < ARRAY_LEN(aliases); x++) {
|
for (x = 0; x < ARRAY_LEN(aliases); x++) {
|
||||||
if (!strcasecmp(aliases[x].name, zone)) {
|
if (!strcasecmp(aliases[x].name, zone)) {
|
||||||
dsp->progmode = aliases[x].mode;
|
dsp->progmode = aliases[x].mode;
|
||||||
@@ -1895,45 +1900,46 @@ int ast_dsp_was_muted(struct ast_dsp *dsp)
|
|||||||
return (dsp->mute_fragments > 0);
|
return (dsp->mute_fragments > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ast_dsp_get_tstate(struct ast_dsp *dsp)
|
int ast_dsp_get_tstate(struct ast_dsp *dsp)
|
||||||
{
|
{
|
||||||
return dsp->tstate;
|
return dsp->tstate;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ast_dsp_get_tcount(struct ast_dsp *dsp)
|
int ast_dsp_get_tcount(struct ast_dsp *dsp)
|
||||||
{
|
{
|
||||||
return dsp->tcount;
|
return dsp->tcount;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _dsp_init(int reload)
|
static int _dsp_init(int reload)
|
||||||
{
|
{
|
||||||
struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
|
|
||||||
struct ast_config *cfg;
|
struct ast_config *cfg;
|
||||||
|
struct ast_variable *v;
|
||||||
|
struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
|
||||||
|
int cfg_threshold;
|
||||||
|
|
||||||
|
if ((cfg = ast_config_load2(CONFIG_FILE_NAME, "dsp", config_flags)) == CONFIG_STATUS_FILEUNCHANGED) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
thresholds[THRESHOLD_SILENCE] = DEFAULT_SILENCE_THRESHOLD;
|
||||||
|
|
||||||
cfg = ast_config_load2(CONFIG_FILE_NAME, "dsp", config_flags);
|
|
||||||
if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEINVALID) {
|
if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEINVALID) {
|
||||||
ast_verb(5, "Can't find dsp config file %s. Assuming default silencethreshold of %d.\n", CONFIG_FILE_NAME, DEFAULT_SILENCE_THRESHOLD);
|
|
||||||
thresholds[THRESHOLD_SILENCE] = DEFAULT_SILENCE_THRESHOLD;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
|
for (v = ast_variable_browse(cfg, "default"); v; v = v->next) {
|
||||||
return 0;
|
if (!strcasecmp(v->name, "silencethreshold")) {
|
||||||
}
|
if (sscanf(v->value, "%30d", &cfg_threshold) < 1) {
|
||||||
|
ast_log(LOG_WARNING, "Unable to convert '%s' to a numeric value.\n", v->value);
|
||||||
if (cfg) {
|
} else if (cfg_threshold < 0) {
|
||||||
const char *value;
|
ast_log(LOG_WARNING, "Invalid silence threshold '%d' specified, using default\n", cfg_threshold);
|
||||||
|
} else {
|
||||||
value = ast_variable_retrieve(cfg, "default", "silencethreshold");
|
thresholds[THRESHOLD_SILENCE] = cfg_threshold;
|
||||||
if (value && sscanf(value, "%30d", &thresholds[THRESHOLD_SILENCE]) != 1) {
|
}
|
||||||
ast_verb(5, "%s: '%s' is not a valid silencethreshold value\n", CONFIG_FILE_NAME, value);
|
|
||||||
thresholds[THRESHOLD_SILENCE] = DEFAULT_SILENCE_THRESHOLD;
|
|
||||||
} else if (!value) {
|
|
||||||
thresholds[THRESHOLD_SILENCE] = DEFAULT_SILENCE_THRESHOLD;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_config_destroy(cfg);
|
|
||||||
}
|
}
|
||||||
|
ast_config_destroy(cfg);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1951,4 +1957,3 @@ int ast_dsp_reload(void)
|
|||||||
{
|
{
|
||||||
return _dsp_init(1);
|
return _dsp_init(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user