@ -155,6 +155,21 @@ AST_APP_OPTIONS(read_app_options, {
static const char * readsf_name = " ReceiveSF " ;
static const char * readsf_name = " ReceiveSF " ;
static const char sendsf_name [ ] = " SendSF " ;
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 ) {
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) */
/* Bell System Technical Journal 39 (Nov. 1960) */
# define SF_MIN_OFF 25
# 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 ;
char * str = buf ;
int hits = 0 , digits_read = 0 ;
int hits = 0 , digits_read = 0 ;
unsigned short int sf_on = 0 ;
unsigned short int sf_on = 0 ;
int res = 0 ;
if ( ! ( dsp = ast_dsp_new ( ) ) ) {
if ( ! ( dsp = ast_dsp_new ( ) ) ) {
ast_log ( LOG_WARNING , " Unable to allocate DSP! \n " ) ;
ast_log ( LOG_WARNING , " Unable to allocate DSP! \n " ) ;
@ -281,13 +297,14 @@ static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int t
ast_frfree ( frame ) ;
ast_frfree ( frame ) ;
} else {
} else {
pbx_builtin_setvar_helper ( chan , " RECEIVESFSTATUS " , " HANGUP " ) ;
pbx_builtin_setvar_helper ( chan , " RECEIVESFSTATUS " , " HANGUP " ) ;
res = - 1 ;
}
}
}
}
if ( dsp ) {
if ( dsp ) {
ast_dsp_free ( 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 ) ;
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 )
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 ;
double tosec ;
struct ast_flags flags = { 0 } ;
struct ast_flags flags = { 0 } ;
char * argcopy = NULL ;
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_DECLARE_APP_ARGS ( arglist ,
AST_APP_ARG ( variable ) ;
AST_APP_ARG ( variable ) ;
@ -360,14 +377,14 @@ static int read_sf_exec(struct ast_channel *chan, const char *data)
features | = DSP_DIGITMODE_RELAXDTMF ;
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 ) ;
pbx_builtin_setvar_helper ( chan , arglist . variable , tmp ) ;
if ( ! ast_strlen_zero ( tmp ) ) {
if ( ! ast_strlen_zero ( tmp ) ) {
ast_verb ( 3 , " SF digits received: '%s' \n " , 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 " ) ;
ast_verb ( 3 , " No SF digits received. \n " ) ;
}
}
return 0 ;
return res ;
}
}
static int sendsf_exec ( struct ast_channel * chan , const char * vdata )
static int sendsf_exec ( struct ast_channel * chan , const char * vdata )