Hi,

> I'm trying to build some doug app connected to asterisk and
> I'm fighting with a few obstacles.[...]
[...]

> With asterisk dtmfmode rfc2833
>  - I get an exeption: can't decode format <PTMarker
telephone-event(dynamic)/8000/None at -4859fc74>

After some modifications it seems to move in the desired direction.

In shtoom/app/doug.py - incomingRTP I changed

-    if packet.header.pt is PT_NTE:
+    if packet.header.ct is PT_NTE:

and I added to shtoom/doug/voiceapp.py quite
some things from shtoom/doug/leg.py regarding
the DTMF processing.

Now the ConferencingApp's announceFile aborts if
a DTMF event occurs.

My changes are more based on guesses than on knowledge ;-)
especially I'm uncertain if they follow Anthonys intentions,
therefore any advice would be appreciated!

Regards,
Frank
Index: shtoom/app/doug.py
===================================================================
--- shtoom/app/doug.py  (Revision 1597)
+++ shtoom/app/doug.py  (Arbeitskopie)
@@ -191,15 +191,15 @@
     def incomingRTP(self, callcookie, packet):
         from shtoom.rtp.formats import PT_NTE
         v = self._voiceapps[callcookie]
-        if packet.header.pt is PT_NTE:
+        if packet.header.ct is PT_NTE:
             data = packet.data
             key = ord(data[0])
             start = (ord(data[1]) & 128) and True or False
             if start:
-                #print "start inbound dtmf", key
+                print "start inbound dtmf", key
                 v.va_startDTMFevent(nteMap[key], callcookie)
             else:
-                #print "stop inbound dtmf", key
+                print "stop inbound dtmf", key
                 v.va_stopDTMFevent(nteMap[key], callcookie)
             return
         try:
Index: shtoom/doug/voiceapp.py
===================================================================
--- shtoom/doug/voiceapp.py     (Revision 1597)
+++ shtoom/doug/voiceapp.py     (Arbeitskopie)
@@ -12,6 +12,7 @@
 from shtoom.doug.events import TimeoutEvent, CallStartedEvent
 from shtoom.doug.events import CallAnsweredEvent, CallRejectedEvent
 from shtoom.doug.events import CallEndedEvent
+from shtoom.doug.events import DTMFReceivedEvent
 #from shtoom.doug.exceptions import *
 from shtoom.doug.statemachine import StateMachine
 from twisted.internet import reactor
@@ -41,6 +42,9 @@
         self.__appl = appl
         self.__legs = OrderedDict()
         self.__dict__.update(kwargs)
+        self.__currentDTMFKey = None
+        self.__collectedDTMFKeys = ''
+        self.__dtmfSingleMode = True
         super(VoiceApp, self).__init__(defer, **kwargs)
 
     def getDefaultLeg(self):
@@ -186,3 +190,28 @@
                 lambda k=key: self.__appl.startDTMF(cookie, k))
             reactor.callLater(i+n*(duration+delay)+duration,
                 lambda k=key: self.__appl.stopDTMF(cookie, k))
+
+    def _inboundDTMFKeyPress(self, dtmf):
+        if self.__dtmfSingleMode:
+            self._triggerEvent(DTMFReceivedEvent(dtmf, self))
+        else:
+            self.__collectedDTMFKeys += dtmf
+            if dtmf in ('#', '*'):
+                dtmf, self.__collectedDTMFKeys = self.__collectedDTMFKeys, ''
+                self._triggerEvent(DTMFReceivedEvent(dtmf, self))
+
+    def va_startDTMFevent(self, dtmf, cookie=None):
+        c = self.__currentDTMFKey
+        if dtmf:
+            if c is not dtmf:
+                self.va_stopDTMFevent(c)
+                self.__currentDTMFKey = dtmf
+                self._inboundDTMFKeyPress(dtmf)
+            else:
+                # repeat
+                pass
+
+    def va_stopDTMFevent(self, dtmf, cookie=None):
+        # For now, I only care about dtmf start events
+        if dtmf == self.__currentDTMFKey:
+            self.__currentDTMFKey = None
_______________________________________________
Shtoom mailing list
[email protected]
http://mail.python.org/mailman/listinfo/shtoom

Reply via email to