* \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;
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");
}
} 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)
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);
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)
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
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");
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 */
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)
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);
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)