mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-18 07:48:14 +00:00
dsp.c User Configurable DTMF_HITS_TO_BEGIN and DTMF_MISSES_TO_END
Instead of a recompile, allow values to be adjusted in dsp.conf For binary distributions allows easy adjustment for wobbly GSM calls, and other reasons. Defaults to DTMF_HITS_TO_BEGIN=2 and DTMF_MISSES_TO_END=3 (closes issue ASTERISK-17493) Reported by: alecdavis Tested by: alecdavis alecdavis (license 585) Review https://reviewboard.asterisk.org/r/2144/ ........ Merged revisions 374479 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 374481 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@374485 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
5
CHANGES
5
CHANGES
@@ -1522,8 +1522,9 @@ Miscellaneous
|
|||||||
rate changes during translation are now avoided unless absolutely necessary.
|
rate changes during translation are now avoided unless absolutely necessary.
|
||||||
* The addition of the res_stun_monitor module for monitoring and reacting to network
|
* The addition of the res_stun_monitor module for monitoring and reacting to network
|
||||||
changes while behind a NAT.
|
changes while behind a NAT.
|
||||||
* The DTMF Normal and Reverse Twist acceptance values can be set in dsp.conf.
|
* DTMF: Normal and Reverse Twist acceptance values can be set in dsp.conf.
|
||||||
This allows support for any Administration. Default is AT&T values.
|
DTMF Valid/Invalid number of hits/misses can be set in dsp.conf.
|
||||||
|
These allow support for any Administration. Default is AT&T values.
|
||||||
|
|
||||||
CLI Changes
|
CLI Changes
|
||||||
-----------
|
-----------
|
||||||
|
|||||||
@@ -36,3 +36,8 @@
|
|||||||
;dtmf_reverse_twist=2.51
|
;dtmf_reverse_twist=2.51
|
||||||
;relax_dtmf_normal_twist=6.31
|
;relax_dtmf_normal_twist=6.31
|
||||||
;relax_dtmf_reverse_twist=3.98
|
;relax_dtmf_reverse_twist=3.98
|
||||||
|
|
||||||
|
;successive number hits/misses of 12.75ms before a digit/nodigit is considered valid
|
||||||
|
;dtmf_hits_to_begin=2
|
||||||
|
;dtmf_misses_to_end=3
|
||||||
|
|
||||||
|
|||||||
44
main/dsp.c
44
main/dsp.c
@@ -210,10 +210,15 @@ enum gsamp_thresh {
|
|||||||
/* DTMF goertzel size */
|
/* DTMF goertzel size */
|
||||||
#define DTMF_GSIZE 102
|
#define DTMF_GSIZE 102
|
||||||
|
|
||||||
/* How many successive hits needed to consider begin of a digit */
|
/* How many successive hits needed to consider begin of a digit
|
||||||
#define DTMF_HITS_TO_BEGIN 2
|
* IE. Override with dtmf_hits_to_begin=4 in dsp.conf
|
||||||
/* How many successive misses needed to consider end of a digit */
|
*/
|
||||||
#define DTMF_MISSES_TO_END 3
|
#define DEF_DTMF_HITS_TO_BEGIN 2
|
||||||
|
|
||||||
|
/* How many successive misses needed to consider end of a digit
|
||||||
|
* IE. Override with dtmf_misses_to_end=4 in dsp.conf
|
||||||
|
*/
|
||||||
|
#define DEF_DTMF_MISSES_TO_END 3
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief The default silence threshold we will use if an alternate
|
* \brief The default silence threshold we will use if an alternate
|
||||||
@@ -258,8 +263,6 @@ typedef struct
|
|||||||
{
|
{
|
||||||
goertzel_state_t row_out[4];
|
goertzel_state_t row_out[4];
|
||||||
goertzel_state_t col_out[4];
|
goertzel_state_t col_out[4];
|
||||||
int hits_to_begin; /* How many successive hits needed to consider begin of a digit */
|
|
||||||
int misses_to_end; /* How many successive misses needed to consider end of a digit */
|
|
||||||
int hits; /* How many successive hits we have seen already */
|
int hits; /* How many successive hits we have seen already */
|
||||||
int misses; /* How many successive misses we have seen already */
|
int misses; /* How many successive misses we have seen already */
|
||||||
int lasthit;
|
int lasthit;
|
||||||
@@ -308,6 +311,8 @@ static float dtmf_normal_twist; /* AT&T = 8dB */
|
|||||||
static float dtmf_reverse_twist; /* AT&T = 4dB */
|
static float dtmf_reverse_twist; /* AT&T = 4dB */
|
||||||
static float relax_dtmf_normal_twist; /* AT&T = 8dB */
|
static float relax_dtmf_normal_twist; /* AT&T = 8dB */
|
||||||
static float relax_dtmf_reverse_twist; /* AT&T = 6dB */
|
static float relax_dtmf_reverse_twist; /* AT&T = 6dB */
|
||||||
|
static int dtmf_hits_to_begin; /* How many successive hits needed to consider begin of a digit */
|
||||||
|
static int dtmf_misses_to_end; /* How many successive misses needed to consider end of a digit */
|
||||||
|
|
||||||
static inline void goertzel_sample(goertzel_state_t *s, short sample)
|
static inline void goertzel_sample(goertzel_state_t *s, short sample)
|
||||||
{
|
{
|
||||||
@@ -502,9 +507,6 @@ static void ast_dtmf_detect_init (dtmf_detect_state_t *s, unsigned int sample_ra
|
|||||||
s->current_sample = 0;
|
s->current_sample = 0;
|
||||||
s->hits = 0;
|
s->hits = 0;
|
||||||
s->misses = 0;
|
s->misses = 0;
|
||||||
|
|
||||||
s->hits_to_begin = DTMF_HITS_TO_BEGIN;
|
|
||||||
s->misses_to_end = DTMF_MISSES_TO_END;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ast_mf_detect_init (mf_detect_state_t *s, unsigned int sample_rate)
|
static void ast_mf_detect_init (mf_detect_state_t *s, unsigned int sample_rate)
|
||||||
@@ -794,7 +796,7 @@ static int dtmf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp
|
|||||||
/* We are in the middle of a digit already */
|
/* We are in the middle of a digit already */
|
||||||
if (hit != s->td.dtmf.current_hit) {
|
if (hit != s->td.dtmf.current_hit) {
|
||||||
s->td.dtmf.misses++;
|
s->td.dtmf.misses++;
|
||||||
if (s->td.dtmf.misses == s->td.dtmf.misses_to_end) {
|
if (s->td.dtmf.misses == dtmf_misses_to_end) {
|
||||||
/* There were enough misses to consider digit ended */
|
/* There were enough misses to consider digit ended */
|
||||||
s->td.dtmf.current_hit = 0;
|
s->td.dtmf.current_hit = 0;
|
||||||
}
|
}
|
||||||
@@ -815,9 +817,9 @@ static int dtmf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp
|
|||||||
}
|
}
|
||||||
if (hit && hit != s->td.dtmf.current_hit) {
|
if (hit && hit != s->td.dtmf.current_hit) {
|
||||||
s->td.dtmf.hits++;
|
s->td.dtmf.hits++;
|
||||||
if (s->td.dtmf.hits == s->td.dtmf.hits_to_begin) {
|
if (s->td.dtmf.hits == dtmf_hits_to_begin) {
|
||||||
store_digit(s, hit);
|
store_digit(s, hit);
|
||||||
s->digitlen[s->current_digits - 1] = s->td.dtmf.hits_to_begin * DTMF_GSIZE;
|
s->digitlen[s->current_digits - 1] = dtmf_hits_to_begin * DTMF_GSIZE;
|
||||||
s->td.dtmf.current_hit = hit;
|
s->td.dtmf.current_hit = hit;
|
||||||
s->td.dtmf.misses = 0;
|
s->td.dtmf.misses = 0;
|
||||||
}
|
}
|
||||||
@@ -1847,6 +1849,8 @@ static int _dsp_init(int reload)
|
|||||||
dtmf_reverse_twist = DEF_DTMF_REVERSE_TWIST;
|
dtmf_reverse_twist = DEF_DTMF_REVERSE_TWIST;
|
||||||
relax_dtmf_normal_twist = DEF_RELAX_DTMF_NORMAL_TWIST;
|
relax_dtmf_normal_twist = DEF_RELAX_DTMF_NORMAL_TWIST;
|
||||||
relax_dtmf_reverse_twist = DEF_RELAX_DTMF_REVERSE_TWIST;
|
relax_dtmf_reverse_twist = DEF_RELAX_DTMF_REVERSE_TWIST;
|
||||||
|
dtmf_hits_to_begin = DEF_DTMF_HITS_TO_BEGIN;
|
||||||
|
dtmf_misses_to_end = DEF_DTMF_MISSES_TO_END;
|
||||||
|
|
||||||
if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEINVALID) {
|
if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEINVALID) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1893,6 +1897,22 @@ static int _dsp_init(int reload)
|
|||||||
} else {
|
} else {
|
||||||
relax_dtmf_reverse_twist = cfg_twist;
|
relax_dtmf_reverse_twist = cfg_twist;
|
||||||
}
|
}
|
||||||
|
} else if (!strcasecmp(v->name, "dtmf_hits_to_begin")) {
|
||||||
|
if (sscanf(v->value, "%30d", &cfg_threshold) < 1) {
|
||||||
|
ast_log(LOG_WARNING, "Unable to convert '%s' to a numeric value.\n", v->value);
|
||||||
|
} else if (cfg_threshold < 1) { /* must be 1 or greater */
|
||||||
|
ast_log(LOG_WARNING, "Invalid dtmf_hits_to_begin value '%d' specified, using default of %d\n", cfg_threshold, dtmf_hits_to_begin);
|
||||||
|
} else {
|
||||||
|
dtmf_hits_to_begin = cfg_threshold;
|
||||||
|
}
|
||||||
|
} else if (!strcasecmp(v->name, "dtmf_misses_to_end")) {
|
||||||
|
if (sscanf(v->value, "%30d", &cfg_threshold) < 1) {
|
||||||
|
ast_log(LOG_WARNING, "Unable to convert '%s' to a numeric value.\n", v->value);
|
||||||
|
} else if (cfg_threshold < 1) { /* must be 1 or greater */
|
||||||
|
ast_log(LOG_WARNING, "Invalid dtmf_misses_to_end value '%d' specified, using default of %d\n", cfg_threshold, dtmf_misses_to_end);
|
||||||
|
} else {
|
||||||
|
dtmf_misses_to_end = cfg_threshold;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast_config_destroy(cfg);
|
ast_config_destroy(cfg);
|
||||||
|
|||||||
Reference in New Issue
Block a user