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:
Paul Belanger
2011-09-13 18:11:33 +00:00
parent 2d18de5f8f
commit 2e2381341e
2 changed files with 69 additions and 63 deletions

View File

@@ -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
=== ===

View File

@@ -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);
} }