From 59f665320a8fd3d68f8ed14b9d486c67b9ca1b34 Mon Sep 17 00:00:00 2001
From: Vincent Lucas <chenzo@jitsi.org>
Date: Thu, 27 Sep 2012 08:45:43 +0000
Subject: [PATCH] Corrects exception when rapid succession of RTP DTMFs are
 sent.

---
 .../transform/dtmf/DtmfTransformEngine.java   | 29 +++++++------------
 1 file changed, 10 insertions(+), 19 deletions(-)

diff --git a/src/org/jitsi/impl/neomedia/transform/dtmf/DtmfTransformEngine.java b/src/org/jitsi/impl/neomedia/transform/dtmf/DtmfTransformEngine.java
index d732e15b..99e9f402 100644
--- a/src/org/jitsi/impl/neomedia/transform/dtmf/DtmfTransformEngine.java
+++ b/src/org/jitsi/impl/neomedia/transform/dtmf/DtmfTransformEngine.java
@@ -6,6 +6,7 @@
  */
 package org.jitsi.impl.neomedia.transform.dtmf;
 
+import java.util.*;
 import javax.media.*;
 
 import org.jitsi.impl.neomedia.*;
@@ -25,7 +26,6 @@ public class DtmfTransformEngine
     implements TransformEngine,
                PacketTransformer
 {
-
     /**
      * The <tt>AudioMediaStreamImpl</tt> that this transform engine was created
      * by and that it's going to deliver DTMF packets for.
@@ -42,13 +42,6 @@ private enum ToneTransmissionState
          */
         IDLE,
 
-        /**
-         * Indicates that the user has just called the {@link
-         * #startSending(DTMFRtpTone)} method and we haven't yet sent any of the
-         * packets corresponding to that particular tone.
-         */
-        SEND_PENDING,
-
         /**
          * Indicates that we are currently in the process of sending a DTMF
          * tone, and we have already sent at least one packet.
@@ -95,7 +88,7 @@ private enum ToneTransmissionState
     /**
      * The tone that we are supposed to be currently transmitting.
      */
-    private DTMFRtpTone currentTone = null;
+    private Vector<DTMFRtpTone> currentTone = new Vector<DTMFRtpTone>(1, 1);
 
     /**
      * The duration (in timestamp units or in other words ms*8) that we have
@@ -223,12 +216,12 @@ public RawPacket reverseTransform(RawPacket pkt)
      */
     public RawPacket transform(RawPacket pkt)
     {
-        if (this.toneTransmissionState.equals(ToneTransmissionState.IDLE)
-             || currentTone == null)
+        if(currentTone.isEmpty())
         {
             return pkt;
         }
 
+        byte toneCode = currentTone.firstElement().getCode();
         byte currentDtmfPayload = mediaStream.getDynamicRTPPayloadType(
                         Constants.TELEPHONE_EVENT);
 
@@ -247,7 +240,7 @@ public RawPacket transform(RawPacket pkt)
         boolean pktMarker = false;
         int pktDuration = 0;
 
-        if(toneTransmissionState == ToneTransmissionState.SEND_PENDING)
+        if(toneTransmissionState == ToneTransmissionState.IDLE)
         {
             currentDuration = 0;
             currentDuration += getCurrentSpacingDuration();
@@ -296,11 +289,14 @@ else if(toneTransmissionState == ToneTransmissionState.END_SEQUENCE_INITIATED)
             remainingsEndPackets--;
 
             if(remainingsEndPackets == 0)
+            {
                 toneTransmissionState = ToneTransmissionState.IDLE;
+                currentTone.remove(0);
+            }
         }
 
         dtmfPkt.init(
-            currentTone.getCode(),
+            toneCode,
             pktEnd,
             pktMarker,
             pktDuration,
@@ -319,12 +315,7 @@ else if(toneTransmissionState == ToneTransmissionState.END_SEQUENCE_INITIATED)
      */
     public void startSending(DTMFRtpTone tone)
     {
-        if(toneTransmissionState != ToneTransmissionState.IDLE)
-            throw new IllegalStateException(
-                "Calling start before stopping previous transmission");
-
-        currentTone = tone;
-        toneTransmissionState = ToneTransmissionState.SEND_PENDING;
+        currentTone.add(tone);
     }
 
     /**
-- 
GitLab