diff --git a/apps/app_mf.c b/apps/app_mf.c index 33c1aaa958..eef5419ce2 100644 --- a/apps/app_mf.c +++ b/apps/app_mf.c @@ -226,7 +226,7 @@ static const char sendmf_name[] = "SendMF"; * \param maxdigits If greater than 0, only read this many digits no matter what * * \retval 0 if successful - * \retval -1 if unsuccessful. + * \retval -1 if unsuccessful (including hangup). */ static int read_mf_digits(struct ast_channel *chan, char *buf, int buflen, int timeout, int features, int laxkp, int override, int no_kp, int no_st, int maxdigits) { struct ast_dsp *dsp; @@ -236,6 +236,7 @@ static int read_mf_digits(struct ast_channel *chan, char *buf, int buflen, int t int digits_read = 0; int is_start_digit = 0; char *str = buf; + int res = 0; if (!(dsp = ast_dsp_new())) { ast_log(LOG_WARNING, "Unable to allocate DSP!\n"); @@ -318,11 +319,12 @@ static int read_mf_digits(struct ast_channel *chan, char *buf, int buflen, int t } } else { pbx_builtin_setvar_helper(chan, "RECEIVEMFSTATUS", "HANGUP"); + res = -1; } } ast_dsp_free(dsp); ast_debug(3, "channel '%s' - event loop stopped { timeout: %d, remaining_time: %d }\n", ast_channel_name(chan), timeout, remaining_time); - return 0; + return res; } static int read_mf_exec(struct ast_channel *chan, const char *data) @@ -334,7 +336,7 @@ static int read_mf_exec(struct ast_channel *chan, const char *data) struct ast_flags flags = {0}; char *optargs[OPT_ARG_ARRAY_SIZE]; char *argcopy = NULL; - int features = 0, maxdigits = 0; + int res, features = 0, maxdigits = 0; AST_DECLARE_APP_ARGS(arglist, AST_APP_ARG(variable); @@ -392,15 +394,15 @@ static int read_mf_exec(struct ast_channel *chan, const char *data) features |= DSP_DIGITMODE_RELAXDTMF; } - read_mf_digits(chan, tmp, BUFFER_SIZE, to, features, (ast_test_flag(&flags, OPT_LAX_KP)), + res = read_mf_digits(chan, tmp, BUFFER_SIZE, to, features, (ast_test_flag(&flags, OPT_LAX_KP)), (ast_test_flag(&flags, OPT_KP_OVERRIDE)), (ast_test_flag(&flags, OPT_NO_KP)), (ast_test_flag(&flags, OPT_NO_ST)), maxdigits); pbx_builtin_setvar_helper(chan, arglist.variable, tmp); if (!ast_strlen_zero(tmp)) { ast_verb(3, "MF digits received: '%s'\n", tmp); - } else { + } else if (!res) { /* if channel hung up, don't print anything out */ ast_verb(3, "No MF digits received.\n"); } - return 0; + return res; } static int sendmf_exec(struct ast_channel *chan, const char *vdata) diff --git a/apps/app_sf.c b/apps/app_sf.c index dadc9cce52..70f60d41e5 100644 --- a/apps/app_sf.c +++ b/apps/app_sf.c @@ -155,6 +155,21 @@ AST_APP_OPTIONS(read_app_options, { static const char *readsf_name = "ReceiveSF"; static const char sendsf_name[] = "SendSF"; +/*! + * \brief Detects SF digits on channel using DSP + * + * \param chan channel on which to read digits + * \param buf Buffer in which to store digits + * \param buflen Size of buffer + * \param timeout ms to wait for all digits before giving up + * \param maxdigits Maximum number of digits + * \param freq Frequency to use + * \param features DSP features + * \param extrapulses Whether to recognize extra pulses + * + * \retval 0 if successful + * \retval -1 if unsuccessful (including hangup). + */ static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int timeout, int maxdigits, int freq, int features, int extrapulses) { /* Bell System Technical Journal 39 (Nov. 1960) */ #define SF_MIN_OFF 25 @@ -169,6 +184,7 @@ static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int t char *str = buf; int hits = 0, digits_read = 0; unsigned short int sf_on = 0; + int res = 0; if (!(dsp = ast_dsp_new())) { ast_log(LOG_WARNING, "Unable to allocate DSP!\n"); @@ -261,7 +277,7 @@ static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int t ast_debug(2, "Got more than 10 pulses, truncating to 10\n"); hits = 0; /* 10 dial pulses = digit 0 */ *str++ = hits + '0'; - } + } } else { if (hits == 10) { hits = 0; /* 10 dial pulses = digit 0 */ @@ -281,13 +297,14 @@ static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int t ast_frfree(frame); } else { pbx_builtin_setvar_helper(chan, "RECEIVESFSTATUS", "HANGUP"); + res = -1; } } if (dsp) { ast_dsp_free(dsp); } ast_debug(3, "channel '%s' - event loop stopped { timeout: %d, remaining_time: %d }\n", ast_channel_name(chan), timeout, remaining_time); - return 0; + return res; } static int read_sf_exec(struct ast_channel *chan, const char *data) @@ -297,7 +314,7 @@ static int read_sf_exec(struct ast_channel *chan, const char *data) double tosec; struct ast_flags flags = {0}; char *argcopy = NULL; - int features = 0, digits = 0, to = 0, freq = 2600; + int res, features = 0, digits = 0, to = 0, freq = 2600; AST_DECLARE_APP_ARGS(arglist, AST_APP_ARG(variable); @@ -360,14 +377,14 @@ static int read_sf_exec(struct ast_channel *chan, const char *data) features |= DSP_DIGITMODE_RELAXDTMF; } - read_sf_digits(chan, tmp, BUFFER_SIZE, to, digits, freq, features, ast_test_flag(&flags, OPT_EXTRAPULSES)); + res = read_sf_digits(chan, tmp, BUFFER_SIZE, to, digits, freq, features, ast_test_flag(&flags, OPT_EXTRAPULSES)); pbx_builtin_setvar_helper(chan, arglist.variable, tmp); if (!ast_strlen_zero(tmp)) { ast_verb(3, "SF digits received: '%s'\n", tmp); - } else { + } else if (!res) { /* if channel hung up, don't print anything out */ ast_verb(3, "No SF digits received.\n"); } - return 0; + return res; } static int sendsf_exec(struct ast_channel *chan, const char *vdata)