Hi there, to stop my inbox from being filled with those "...iconnect inband dtmf .. yadda yadda..." mails, i am sending this patch to the list ;-) thanks to lele for updating it to patch against latest cvs :) you can enable inband dtmf by adding the line inbanddtmf=1 to the sip pvt in sip.conf.
Mark, i will send you a disclaimer on monday (really!), hope you will merge it (although you dont like the idea...). regards kapejod -- Klaus-Peter Junghanns CEO,CTO Junghanns.NET GmbH Breite Strasse 13 - 12167 Berlin - Germany fon: +49 30 79705390 fax: +49 30 79705391 iaxtel: 1-700-157-8753 email: [EMAIL PROTECTED] Am Fre, 2003-02-28 um 18.08 schrieb Mark Spencer: > I am looking for someone to confirm that Iconnecthere sends DTMF either > in-band or out-of-band. If it is out-of-band, then I'll need to work with > someone to figure out the issue. If it is in-band then I will need to add > in-band DTMF detection to SIP. > > Mark > > On Thu, 27 Feb 2003, Ben Clark wrote: > > > Is anyone working on a fix to send / receive DTMF with IConnectHere? > > > > _______________________________________________ > > Asterisk-Users mailing list > > [EMAIL PROTECTED] > > http://lists.digium.com/mailman/listinfo/asterisk-users > > > > _______________________________________________ > Asterisk-Users mailing list > [EMAIL PROTECTED] > http://lists.digium.com/mailman/listinfo/asterisk-users
--- asterisk.wml-T50/channels/chan_sip.c 2003-02-27 09:10:52.000000000 +0100 +++ asterisk.wml-T50-dtmf/channels/chan_sip.c 2003-02-28 01:35:35.000000000 +0100 @@ -33,6 +33,7 @@ #include <asterisk/md5.h> #include <asterisk/app.h> #include <asterisk/musiconhold.h> +#include <asterisk/dsp.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> @@ -170,6 +171,9 @@ int maxtime; /* Max time for first response */ int initid; /* Auto-congest ID if appropriate */ + + int inbanddtmf; + struct ast_dsp *vad; struct sip_peer *peerpoke; /* If this calls is to poke a peer, which one */ struct sip_registry *registry; /* If this is a REGISTER call, to which registry */ @@ -197,6 +201,7 @@ int amaflags; int insecure; int canreinvite; + int inbanddtmf; struct ast_ha *ha; struct sip_user *next; }; @@ -216,6 +221,7 @@ int capability; int insecure; int canreinvite; + int inbanddtmf; struct sockaddr_in addr; struct in_addr mask; @@ -368,6 +374,7 @@ r->insecure = p->insecure; r->canreinvite = p->canreinvite; r->maxtime = p->maxms; + r->inbanddtmf = p->inbanddtmf; strncpy(r->context, p->context,sizeof(r->context)-1); if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) && (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) { @@ -671,6 +678,9 @@ needcancel = 1; /* Disconnect */ p = ast->pvt->pvt; + if ((p->inbanddtmf == 1) && (p->vad != NULL)) { + ast_dsp_free(p->vad); + } p->owner = NULL; ast->pvt->pvt = NULL; @@ -916,6 +926,10 @@ else snprintf(tmp->name, sizeof(tmp->name), "SIP/%s:%d", inet_ntoa(i->sa.sin_addr), ntohs(i->sa.sin_port)); tmp->type = type; + if (i->inbanddtmf == 1) { + i->vad = ast_dsp_new(); + ast_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT); + } tmp->fds[0] = ast_rtp_fd(i->rtp); ast_setstate(tmp, state); if (state == AST_STATE_RING) @@ -1035,6 +1049,9 @@ ast_set_read_format(p->owner, p->owner->readformat); ast_set_write_format(p->owner, p->owner->writeformat); } + if (p->inbanddtmf == 1) { + f = ast_dsp_process(p->owner,p->vad,f,0); + } } } return f; @@ -2458,6 +2475,7 @@ strncpy(p->accountcode, user->accountcode, sizeof(p->accountcode) -1); p->canreinvite = user->canreinvite; p->amaflags = user->amaflags; + p->inbanddtmf = user->inbanddtmf; } break; } @@ -2489,13 +2507,18 @@ if (p->owner) { if (sipdebug) ast_verbose("Message received: '%s'\n", buf); - memset(&f, 0, sizeof(f)); - f.frametype = AST_FRAME_TEXT; - f.subclass = 0; - f.offset = 0; - f.data = buf; - f.datalen = strlen(buf); - ast_queue_frame(p->owner, &f, 1); + if (p->inbanddtmf == 0) { + + memset(&f, 0, sizeof(f)); + f.frametype = AST_FRAME_TEXT; + f.subclass = 0; + f.offset = 0; + f.data = buf; + f.datalen = strlen(buf); + ast_queue_frame(p->owner, &f, 1); + } else { + // drop out of band dtmfs when doing inband detection! + } } } @@ -3671,7 +3694,9 @@ } else if (!strcasecmp(v->name, "auth")) { strncpy(user->methods, v->value, sizeof(user->methods)-1); } else if (!strcasecmp(v->name, "secret")) { - strncpy(user->secret, v->value, sizeof(user->secret)-1); + strncpy(user->secret, v->value, sizeof(user->secret)-1); + } else if (!strcasecmp(v->name, "inbanddtmf")) { + user->inbanddtmf=atoi(v->value); } else if (!strcasecmp(v->name, "canreinvite")) { user->canreinvite = ast_true(v->value); } else if (!strcasecmp(v->name, "callerid")) { @@ -3752,6 +3777,8 @@ peer->canreinvite = ast_true(v->value); else if (!strcasecmp(v->name, "context")) strncpy(peer->context, v->value, sizeof(peer->context)-1); + else if (!strcasecmp(v->name, "inbanddtmf")) + peer->inbanddtmf=atoi(v->value); else if (!strcasecmp(v->name, "host")) { if (!strcasecmp(v->value, "dynamic")) { /* They'll register with us */