diff -u -r chan_ss7-1.1/l4isup.c chan_ss7-1.1-hwdtmf/l4isup.c
--- chan_ss7-1.1/l4isup.c 2008-12-05 13:50:47.000000000 +0100
+++ chan_ss7-1.1-hwdtmf/l4isup.c 2009-05-21 23:34:59.000000000 +0200
@@ -58,6 +58,12 @@
#include "asterisk/alaw.h"
#include "asterisk/ulaw.h"
+#ifndef DAHDI_TONEDETECT
+/* Work around older code with no tone detect */
+#define DAHDI_EVENT_DTMFDOWN 0
+#define DAHDI_EVENT_DTMFUP 0
+#endif
+
#ifdef DAHDI
#include <dahdi/user.h>
#else
@@ -69,6 +75,12 @@
#define DAHDI_LAW_MULAW ZT_LAW_MULAW
#define DAHDI_SETGAINS ZT_SETGAINS
#define dahdi_gains zt_gains
+#define DAHDI_TONEDETECT ZT_TONEDETECT
+#define DAHDI_TONEDETECT_ON ZT_TONEDETECT_ON
+#define DAHDI_TONEDETECT_MUTE ZT_TONEDETECT_MUTE
+#define DAHDI_EVENT_DTMFDOWN ZT_EVENT_DTMFDOWN
+#define DAHDI_EVENT_DTMFDUP ZT_EVENT_DTMFUP
+
#endif
#include "astversion.h"
@@ -169,6 +181,8 @@
int law;
char context[AST_MAX_CONTEXT];
char language[MAX_LANGUAGE];
+ unsigned int hardwaredtmf:1;
+
};
/* Locking order (deadlock avoidance): global lock, chan->lock, pvt->lock
@@ -2164,6 +2178,22 @@
static void ss7_handle_event(struct ss7_chan *pvt, int event) {
int res, doing_dtmf;
+ if(event & DAHDI_EVENT_DTMFDOWN ) {
+ pvt->frame.frametype = AST_FRAME_DTMF_BEGIN;
+ pvt->frame.sub & 0xff;
+ return ;
+
+ }
+
+ if(event & DAHDI_EVENT_DTMFUP ) {
+ pvt->frame.frametype = AST_FRAME_DTMF_END;
+ pvt->frame.sub & 0xff;
+ return;
+
+ }
+
+
+
switch(event) {
case DAHDI_EVENT_DIALCOMPLETE:
/* Chech if still doing DTMF sending. If not, set flag to start
@@ -2305,7 +2335,13 @@
#endif
pvt->frame.datalen = sofar;
pvt->frame.samples = sofar;
- processed_frame = ast_dsp_process(chan, pvt->dsp, &pvt->frame);
+
+ if(pvt->dsp){
+ processed_frame = ast_dsp_process(chan, pvt->dsp, &pvt->frame);
+ } else {
+ /*Incase of HWDTF */
+ processed_frame = &pvt->frame;
+ }
ast_mutex_unlock(&pvt->lock);
@@ -4463,6 +4499,7 @@
int cic = link->first_cic + channel;
char* lang = link->linkset->language;
char* ctxt = link->linkset->context;
+ int features,x;
struct ss7_chan *pvt;
pvt = malloc(sizeof(*pvt));
@@ -4473,6 +4510,7 @@
init_pvt(pvt, cic);
pvt->link = link;
pvt->equipped = 1;
+ features=0;
if(ctxt != NULL) {
ast_copy_string(pvt->context, ctxt, sizeof(pvt->context));
}
@@ -4486,14 +4524,28 @@
pvt->zaptel_fd = openchannel(link, channel);
if (pvt->zaptel_fd < 0)
return pvt->zaptel_fd < 0;
- pvt->dsp = ast_dsp_new();
- if(pvt->dsp == NULL) {
- ast_log(LOG_WARNING, "Failed to allocate DSP for CIC=%d.\n", pvt->cic);
- return -1;
- }
- ast_dsp_set_features(pvt->dsp, DSP_FEATURE_DTMF_DETECT);
- ast_dsp_digitmode(pvt->dsp, DSP_DIGITMODE_DTMF | (link->relaxdtmf ? DSP_DIGITMODE_RELAXDTMF : 0));
+#ifdef DAHDI_TONEDETECT
+ x = DAHDI_TONEDETECT_ON | DAHDI_TONEDETECT_MUTE;
+ if (ioctl(pvt->zaptel_fd, DAHDI_TONEDETECT, &x)) {
+#endif
+ pvt->hardwaredtmf = 0;
+ features |= DSP_FEATURE_DTMF_DETECT;
+#ifdef DAHDI_TONEDETECT
+ } else if (0) {
+ pvt->hardwaredtmf = 1;
+ features |= DSP_FEATURE_DTMF_DETECT;
+ }
+#endif
+ if(features){
+ pvt->dsp = ast_dsp_new();
+ if(pvt->dsp == NULL) {
+ ast_log(LOG_WARNING, "Failed to allocate DSP for CIC=%d.\n", pvt->cic);
+ return -1;
+ }
+ ast_dsp_set_features(pvt->dsp, DSP_FEATURE_DTMF_DETECT);
+ ast_dsp_digitmode(pvt->dsp, DSP_DIGITMODE_DTMF | (link->relaxdtmf ? DSP_DIGITMODE_RELAXDTMF : 0));
+ }
/* Set gain - Channel must be in audiomode when setting gain */
set_audiomode(pvt->zaptel_fd);
set_gain(pvt, link->rxgain, link->txgain);