[Asterisk-cvs] asterisk-addons/asterisk-ooh323c/src chan_h323.c, 1.8, 1.9 chan_h323.h, 1.1, 1.2 ooh323cDriver.c, 1.4, 1.5 ooh323cDriver.h, 1.1, 1.2

vphirke vphirke
Fri Sep 2 10:26:16 CDT 2005


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);




More information about the svn-commits mailing list