#define FTDM_HALF_DTMF_PAUSE 500
#define FTDM_FULL_DTMF_PAUSE 1000
+#define FTDM_CHANNEL_SW_DTMF_ALLOWED(ftdmchan) (!ftdm_channel_test_feature(ftdmchan, FTDM_CHANNEL_FEATURE_DTMF_DETECT) && !ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SIG_DTMF_DETECTION))
+
ftdm_time_t time_last_throttle_log = 0;
ftdm_time_t time_current_throttle_log = 0;
{ "blocking", FTDM_CHANNEL_BLOCKING},
{ "media", FTDM_CHANNEL_DIGITAL_MEDIA},
{ "native-sigbridge", FTDM_CHANNEL_NATIVE_SIGBRIDGE},
+ { "sig-dtmf-detection", FTDM_CHANNEL_SIG_DTMF_DETECTION},
{ "invalid", FTDM_CHANNEL_MAX_FLAG},
};
{
/* if they don't have thier own, use ours */
if (FTDM_IS_VOICE_CHANNEL(ftdmchan)) {
- if (!ftdm_channel_test_feature(ftdmchan, FTDM_CHANNEL_FEATURE_DTMF_DETECT)) {
+ if (FTDM_CHANNEL_SW_DTMF_ALLOWED(ftdmchan)) {
teletone_dtmf_detect_init (&ftdmchan->dtmf_detect, ftdmchan->rate);
ftdm_set_flag(ftdmchan, FTDM_CHANNEL_DTMF_DETECT);
ftdm_set_flag(ftdmchan, FTDM_CHANNEL_SUPRESS_DTMF);
case FTDM_COMMAND_DISABLE_DTMF_DETECT:
{
if (FTDM_IS_VOICE_CHANNEL(ftdmchan)) {
- if (!ftdm_channel_test_feature(ftdmchan, FTDM_CHANNEL_FEATURE_DTMF_DETECT)) {
- teletone_dtmf_detect_init (&ftdmchan->dtmf_detect, ftdmchan->rate);
- ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_DTMF_DETECT);
+ if (FTDM_CHANNEL_SW_DTMF_ALLOWED(ftdmchan)) {
+ teletone_dtmf_detect_init (&ftdmchan->dtmf_detect, ftdmchan->rate);
+ ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_DTMF_DETECT);
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_SUPRESS_DTMF);
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Disabled software DTMF detector\n");
GOTO_STATUS(done, FTDM_SUCCESS);
break;
case FTDM_COMMAND_SEND_DTMF:
{
- if (!ftdm_channel_test_feature(ftdmchan, FTDM_CHANNEL_FEATURE_DTMF_GENERATE)) {
- char *digits = FTDM_COMMAND_OBJ_CHAR_P;
+ char *digits = FTDM_COMMAND_OBJ_CHAR_P;
+ if (ftdmchan->span->sig_send_dtmf) {
+ status = ftdmchan->span->sig_send_dtmf(ftdmchan, digits);
+ GOTO_STATUS(done, status);
+ } else if (!ftdm_channel_test_feature(ftdmchan, FTDM_CHANNEL_FEATURE_DTMF_GENERATE)) {
if ((status = ftdmchan_activate_dtmf_buffer(ftdmchan)) != FTDM_SUCCESS) {
GOTO_STATUS(done, status);
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Queuing DTMF %s (debug = %d)\n", dtmf, ftdmchan->dtmfdbg.enabled);
- if (ftdmchan->span->sig_dtmf && (ftdmchan->span->sig_dtmf(ftdmchan, dtmf) == FTDM_BREAK)) {
+ if (ftdmchan->span->sig_queue_dtmf && (ftdmchan->span->sig_queue_dtmf(ftdmchan, dtmf) == FTDM_BREAK)) {
/* Signalling module wants to absorb this DTMF event */
return FTDM_SUCCESS;
}
}
}
- if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_DTMF_DETECT) && !ftdm_channel_test_feature(ftdmchan, FTDM_CHANNEL_FEATURE_DTMF_DETECT)) {
+ if (FTDM_CHANNEL_SW_DTMF_ALLOWED(ftdmchan) && ftdm_test_flag(ftdmchan, FTDM_CHANNEL_DTMF_DETECT)) {
teletone_hit_type_t hit;
char digit_char;
uint32_t dur;
return FTDM_SUCCESS;
}
+WAT_AT_CMD_RESPONSE_FUNC(on_dtmf_sent)
+{
+ ftdm_channel_t *ftdmchan = obj;
+ ftdm_span_t *span = ftdmchan->span;
+ int i = 0;
+
+ if (success == WAT_TRUE) {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "DTMF successfully transmitted on span %s\n", span->name);
+ } else {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Command execution failed on span %s. Err: %s\n", span->name, error);
+ }
+
+ for (i = 0; tokens[i]; i++) {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "%s\n", tokens[i]);
+ }
+ return i;
+}
+
+static ftdm_status_t ftdm_gsm_send_dtmf(ftdm_channel_t *ftdmchan, const char* dtmf)
+{
+ ftdm_gsm_span_data_t *gsm_data = ftdmchan->span->signal_data;
+ wat_send_dtmf(ftdmchan->span->span_id, gsm_data->call_id, dtmf, on_dtmf_sent, ftdmchan);
+ return FTDM_SUCCESS;
+}
static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_gsm_configure_span_signaling)
{
gsm_data->dchan = dchan;
gsm_data->bchan = bchan;
- //sprintf(gsm_data->dchan->chan_name, "%s\t\n", "GSM dchan");
- //sprintf(gsm_data->bchan->chan_name, "%s\r\n", "GSM bchan");
-
for (paramindex = 0; ftdm_parameters[paramindex].var; paramindex++) {
var = ftdm_parameters[paramindex].var;
val = ftdm_parameters[paramindex].val;
span_config.hardware_dtmf = WAT_FALSE;
}
ftdm_log(FTDM_LOG_DEBUG, "Configuring GSM span %s with hardware dtmf %s\n", span->name, val);
- ftdm_channel_set_feature(gsm_data->bchan, FTDM_CHANNEL_FEATURE_DTMF_DETECT);
} else {
ftdm_log(FTDM_LOG_ERROR, "Ignoring unknown GSM parameter '%s'", var);
}
span->stop = ftdm_gsm_stop;
span->sig_read = NULL;
span->sig_write = NULL;
+ if (span_config.hardware_dtmf == WAT_TRUE) {
+ span->sig_send_dtmf = ftdm_gsm_send_dtmf;
+ ftdm_set_flag(ftdmchan, FTDM_CHANNEL_SIG_DTMF_DETECTION);
+ }
span->signal_cb = sig_cb;
span->signal_type = FTDM_SIGTYPE_GSM;