Update of /usr/cvsroot/asterisk-addons/asterisk-ooh323c/src
In directory mongoose.digium.com:/tmp/cvs-serv11947/src
Modified Files:
chan_h323.c chan_h323.h ooh323cDriver.c ooh323cDriver.h
Log Message:
Update - DTMF using H.245 and Q931 support
Index: chan_h323.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/src/chan_h323.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- chan_h323.c 9 Aug 2005 13:55:49 -0000 1.8
+++ chan_h323.c 2 Sep 2005 14:27:10 -0000 1.9
@@ -646,12 +646,20 @@
static int h323_digit(struct ast_channel *chan, char digit)
{
+ char dtmf[2];
struct h323_pvt *p = (struct h323_pvt *) chan->tech_pvt;
+
if(gH323Debug)
ast_verbose("--- h323_digit\n");
if (p && p->rtp && (p->dtmfmode & H323_DTMF_RFC2833)) {
ast_rtp_senddigit(p->rtp, digit);
+ }else if (p && ((p->dtmfmode & H323_DTMF_Q931) ||
+ (p->dtmfmode & H323_DTMF_H245ALPHANUMERIC) ||
+ (p->dtmfmode & H323_DTMF_H245SIGNAL))){
+ dtmf[0]= digit;
+ dtmf[1]='\0';
+ ooSendDTMFDigit(p->callToken, dtmf);
}
if(gH323Debug)
ast_verbose("+++ h323_digit\n");
@@ -1040,6 +1048,38 @@
return OO_OK;
}
+/**
+ * Callback for sending digits from H.323 up to asterisk
+ *
+ */
+int h323_onReceivedDigit(OOH323CallData *call, const char* digit)
+{
+ struct h323_pvt *p=NULL;
+ struct ast_frame f;
+ int res;
+
+ ast_log(LOG_DEBUG, "Received Digit: %c\n", digit);
+ p = find_call(call);
+ if(!p)
+ {
+ ast_log(LOG_ERROR, "Failed to find a matching call.\n");
+ return -1;
+ }
+ ast_mutex_lock(&p->lock);
+ memset(&f, 0, sizeof(f));
+ f.frametype = AST_FRAME_DTMF;
+ f.subclass = digit[0];
+ f.datalen = 0;
+ f.samples = 800;
+ f.offset = 0;
+ f.data = NULL;
+ f.mallocd = 0;
+ f.src = "SEND_DIGIT";
+ res = ast_queue_frame(p->owner, &f);
+ ast_mutex_unlock(&p->lock);
+ return res;
+}
+
int h323_onReceivedSetup(ooCallData *call, Q931Message *pmsg)
{
struct h323_pvt *p=NULL;
@@ -1557,8 +1597,14 @@
}else if (!strcasecmp(v->name, "amaflags")) {
user->amaflags = ast_cdr_amaflags2int(v->value);
} else if (!strcasecmp(v->name, "dtmfmode")) {
- if(!strcasecmp(v->value, "rfc2833"))
+ if(!strcasecmp(v->value, "rfc2833"))
user->dtmfmode = H323_DTMF_RFC2833;
+ else if(!strcasecmp(v->value, "q931keypad"))
+ user->dtmfmode = H323_DTMF_Q931;
+ else if(!strcasecmp(v->value, "h245alphanumeric"))
+ user->dtmfmode = H323_DTMF_H245ALPHANUMERIC;
+ else if(!strcasecmp(v->value, "h245signal"))
+ user->dtmfmode = H323_DTMF_H245SIGNAL;
}
v = v->next;
}
@@ -1647,8 +1693,14 @@
} else if (!strcasecmp(v->name, "amaflags")) {
peer->amaflags = ast_cdr_amaflags2int(v->value);
} else if (!strcasecmp(v->name, "dtmfmode")) {
- if(!strcasecmp(v->value, "rfc2833"))
+ if(!strcasecmp(v->value, "rfc2833"))
peer->dtmfmode = H323_DTMF_RFC2833;
+ else if(!strcasecmp(v->value, "q931keypad"))
+ peer->dtmfmode = H323_DTMF_Q931;
+ else if(!strcasecmp(v->value, "h245alphanumeric"))
+ peer->dtmfmode = H323_DTMF_H245ALPHANUMERIC;
+ else if(!strcasecmp(v->value, "h245signal"))
+ peer->dtmfmode = H323_DTMF_H245SIGNAL;
}
v = v->next;
}
@@ -1868,6 +1920,12 @@
gDTMFMode=H323_DTMF_INBAND;
else if (!strcasecmp(v->value, "rfc2833"))
gDTMFMode = H323_DTMF_RFC2833;
+ else if (!strcasecmp(v->value, "q931keypad"))
+ gDTMFMode = H323_DTMF_Q931;
+ else if (!strcasecmp(v->value, "h245alphanumeric"))
+ gDTMFMode = H323_DTMF_H245ALPHANUMERIC;
+ else if (!strcasecmp(v->value, "h245signal"))
+ gDTMFMode = H323_DTMF_H245SIGNAL;
else {
ast_log(LOG_WARNING, "Unknown dtmf mode '%s', using rfc2833\n",
v->value);
@@ -1970,8 +2028,14 @@
ast_cli(fd, "%-15.15s", "DTMF Mode: ");
if(peer->dtmfmode & H323_DTMF_RFC2833)
ast_cli(fd, "%s\n", "rfc2833");
+ else if(peer->dtmfmode & H323_DTMF_Q931)
+ ast_cli(fd, "%s\n", "q931keypad");
+ else if(peer->dtmfmode & H323_DTMF_H245ALPHANUMERIC)
+ ast_cli(fd, "%s\n", "h245alphanumeric");
+ else if(peer->dtmfmode & H323_DTMF_H245SIGNAL)
+ ast_cli(fd, "%s\n", "h245signal");
else
- ast_cli(fd, "%s\n", "unknown");
+ ast_cli(fd, "%s\n", "unknown");
ast_cli(fd, "%-15.15s%s\n", "AccountCode: ", peer->accountcode);
ast_cli(fd, "%-15.15s%s\n", "AMA flags: ",
ast_cdr_flags2str(peer->amaflags));
ast_cli(fd, "%-15.15s%s\n", "Ip:Port: ", ip_port);
@@ -2052,8 +2116,14 @@
ast_cli(fd, "%-15.15s", "DTMF Mode: ");
if(user->dtmfmode & H323_DTMF_RFC2833)
ast_cli(fd, "%s\n", "rfc2833");
+ else if(user->dtmfmode & H323_DTMF_Q931)
+ ast_cli(fd, "%s\n", "q931keypad");
+ else if(user->dtmfmode & H323_DTMF_H245ALPHANUMERIC)
+ ast_cli(fd, "%s\n", "h245alphanumeric");
+ else if(user->dtmfmode & H323_DTMF_H245SIGNAL)
+ ast_cli(fd, "%s\n", "h245signal");
else
- ast_cli(fd, "%s\n", "unknown");
+ ast_cli(fd, "%s\n", "unknown");
ast_cli(fd, "%-15.15s%s\n", "AccountCode: ", user->accountcode);
ast_cli(fd, "%-15.15s%s\n", "AMA flags: ",
ast_cdr_flags2str(user->amaflags));
ast_cli(fd, "%-15.15s%s\n", "Context: ", user->context);
@@ -2158,6 +2228,12 @@
ast_cli(fd, "%-15s", "DTMF Mode: ");
if(gDTMFMode & H323_DTMF_RFC2833)
ast_cli(fd, "%s\n", "rfc2833");
+ else if (gDTMFMode & H323_DTMF_Q931)
+ ast_cli(fd, "%s\n", "q931keypad");
+ else if(gDTMFMode & H323_DTMF_H245ALPHANUMERIC)
+ ast_cli(fd, "%s\n", "h245alphanumeric");
+ else if(gDTMFMode & H323_DTMF_H245SIGNAL)
+ ast_cli(fd, "%s\n", "h245signal");
else
ast_cli(fd, "%s\n", "unknown");
@@ -2252,7 +2328,8 @@
.onOutgoingCall = NULL,
.onCallEstablished = onCallEstablished,
.onCallCleared = onCallCleared,
- .openLogicalChannels=NULL
+ .openLogicalChannels=NULL,
+ .onReceivedDTMF = &h323_onReceivedDigit
};
userl.users = NULL;
Index: chan_h323.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/src/chan_h323.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- chan_h323.h 23 May 2005 20:55:43 -0000 1.1
+++ chan_h323.h 2 Sep 2005 14:27:10 -0000 1.2
@@ -102,4 +102,5 @@
/* h323 msg callbacks */
int h323_onReceivedSetup(ooCallData *call, Q931Message *pmsg);
+int h323_onReceivedDigit(OOH323CallData *call, const char* digit);
#endif
Index: ooh323cDriver.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/src/ooh323cDriver.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- ooh323cDriver.c 9 Aug 2005 13:55:49 -0000 1.4
+++ ooh323cDriver.c 2 Sep 2005 14:27:10 -0000 1.5
@@ -128,7 +128,11 @@
}
if(dtmf & H323_DTMF_RFC2833)
- ret |= ooH323EpEnableDTMFRFC2833(0);
+ ret |= ooH323EpEnableDTMFRFC2833(0);
+ else if(dtmf & H323_DTMF_H245ALPHANUMERIC)
+ ret |= ooH323EpEnableDTMFH245Alphanumeric();
+ else if(dtmf & H323_DTMF_H245SIGNAL)
+ ret |= ooH323EpEnableDTMFH245Signal();
return ret;
}
@@ -141,6 +145,12 @@
if(gH323Debug)
ast_verbose("\tAdding capabilities to call(%s, %s)\n", call->callType,
call->callToken);
+ if(dtmf & H323_DTMF_RFC2833)
+ ret |= ooCallEnableDTMFRFC2833(call,0);
+ else if(dtmf & H323_DTMF_H245ALPHANUMERIC)
+ ret |= ooCallEnableDTMFH245Alphanumeric(call);
+ else if(dtmf & H323_DTMF_H245SIGNAL)
+ ret |= ooCallEnableDTMFH245Signal(call);
for(x=0; 0 !=(format=ast_codec_pref_index(prefs, x)); x++)
Index: ooh323cDriver.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/src/ooh323cDriver.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- ooh323cDriver.h 23 May 2005 20:55:43 -0000 1.1
+++ ooh323cDriver.h 2 Sep 2005 14:27:10 -0000 1.2
@@ -22,8 +22,11 @@
#include "ooCalls.h"
#include "ooCapability.h"
#include "ooStackCmds.h"
-#define H323_DTMF_RFC2833 (1 << 0)
-#define H323_DTMF_INBAND (1 << 1)
+#define H323_DTMF_RFC2833 (1 << 0)
+#define H323_DTMF_Q931 (1 << 1)
+#define H323_DTMF_H245ALPHANUMERIC (1 << 2)
+#define H323_DTMF_H245SIGNAL (1 << 3)
+#define H323_DTMF_INBAND (1 << 4)
struct h323_pvt;
int ooh323c_start_stack_thread(void);
_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs