Module: sems
Branch: sayer/offer_answer
Commit: 2b74b0c98ade2dfcda826a8ab0cc755f478c7bb9
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=2b74b0c98ade2dfcda826a8ab0cc755f478c7bb9

Author: Stefan Sayer <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date:   Tue Oct 19 23:41:26 2010 +0200

fix DTMF reception

---

 core/AmRtpStream.cpp |   44 +++++++++++++++++++++++++++-----------------
 core/AmRtpStream.h   |   13 +++----------
 core/AmSdp.cpp       |   17 ++++++-----------
 core/AmSdp.h         |   15 +++------------
 4 files changed, 39 insertions(+), 50 deletions(-)

diff --git a/core/AmRtpStream.cpp b/core/AmRtpStream.cpp
index 1dca5b6..3e51d48 100644
--- a/core/AmRtpStream.cpp
+++ b/core/AmRtpStream.cpp
@@ -209,7 +209,7 @@ void AmRtpStream::sendDtmfPacket(unsigned int ts) {
     case DTMF_SEND_SENDING: {
       if (ts_less()(ts, current_send_dtmf_ts + current_send_dtmf.second)) {
        // send packet
-       if (!telephone_event_pt.get()) 
+       if (!remote_telephone_event_pt.get()) 
          return;
 
        dtmf_payload_t dtmf;
@@ -221,7 +221,7 @@ void AmRtpStream::sendDtmfPacket(unsigned int ts) {
        DBG("sending DTMF: event=%i; e=%i; r=%i; volume=%i; duration=%i; 
ts=%u\n",
            
dtmf.event,dtmf.e,dtmf.r,dtmf.volume,ntohs(dtmf.duration),current_send_dtmf_ts);
 
-       compile_and_send(telephone_event_pt->payload_type, dtmf.duration == 0, 
+       compile_and_send(remote_telephone_event_pt->payload_type, dtmf.duration 
== 0, 
                         current_send_dtmf_ts, 
                         (unsigned char*)&dtmf, sizeof(dtmf_payload_t)); 
        return;
@@ -240,7 +240,7 @@ void AmRtpStream::sendDtmfPacket(unsigned int ts) {
       } else {
        send_dtmf_end_repeat++;
        // send packet with end bit set, duration = event duration
-       if (!telephone_event_pt.get()) 
+       if (!remote_telephone_event_pt.get()) 
          return;
 
        dtmf_payload_t dtmf;
@@ -253,7 +253,7 @@ void AmRtpStream::sendDtmfPacket(unsigned int ts) {
        DBG("sending DTMF: event=%i; e=%i; r=%i; volume=%i; duration=%i; 
ts=%u\n",
            
dtmf.event,dtmf.e,dtmf.r,dtmf.volume,ntohs(dtmf.duration),current_send_dtmf_ts);
 
-       compile_and_send(telephone_event_pt->payload_type, false, 
+       compile_and_send(remote_telephone_event_pt->payload_type, false, 
                         current_send_dtmf_ts, 
                         (unsigned char*)&dtmf, sizeof(dtmf_payload_t)); 
        return;
@@ -397,13 +397,14 @@ int AmRtpStream::receive( unsigned char* buffer, unsigned 
int size,
     return RTP_EMPTY;
   }
 
-  if (telephone_event_pt.get() && rp->payload == 
telephone_event_pt->payload_type)
+  if (local_telephone_event_pt.get() && 
+      rp->payload == local_telephone_event_pt->payload_type)
     {
       dtmf_payload_t* dpl = (dtmf_payload_t*)rp->getData();
 
       DBG("DTMF: event=%i; e=%i; r=%i; volume=%i; duration=%i; ts=%u\n",
          
dpl->event,dpl->e,dpl->r,dpl->volume,ntohs(dpl->duration),rp->timestamp);
-      session->postDtmfEvent(new AmRtpDtmfEvent(dpl, getTelephoneEventRate(), 
rp->timestamp));
+      session->postDtmfEvent(new AmRtpDtmfEvent(dpl, 
getLocalTelephoneEventRate(), rp->timestamp));
       mem.freePacket(rp);
       return RTP_DTMF;
     }
@@ -431,7 +432,6 @@ AmRtpStream::AmRtpStream(AmSession* _s)
     r_ssrc_i(false),
     session(_s),
     passive(false),
-    telephone_event_pt(NULL),
     mute(false),
     hold(false),
     receiving(true),
@@ -622,6 +622,16 @@ int AmRtpStream::init(AmPayloadProviderInterface* 
payload_provider,
   payload = local_media.payloads[0].payload_type;
   last_payload = payload;
 
+  const SdpPayload *telephone_event_payload = remote.telephoneEventPayload();
+  if(telephone_event_payload) {
+      DBG("remote party supports telephone events (pt=%i)\n",
+         telephone_event_payload->payload_type);
+      remote_telephone_event_pt.reset(telephone_event_payload);
+  } else {
+    DBG("remote party doesn't support telephone events\n");
+  }
+  local_telephone_event_pt.reset(local.telephoneEventPayload());
+
   resume();
 
 #ifdef WITH_ZRTP  
@@ -671,8 +681,8 @@ void AmRtpStream::bufferPacket(AmRtpPacket* p)
 
   receive_mut.lock();
   // free packet on double packet for TS received
-  if(!(telephone_event_pt.get() && 
-       (p->payload == telephone_event_pt->payload_type))) {
+  if(!(local_telephone_event_pt.get() && 
+       (p->payload == local_telephone_event_pt->payload_type))) {
     if (receive_buf.find(p->timestamp) != receive_buf.end()) {
       mem.freePacket(receive_buf[p->timestamp]);
     }
@@ -694,8 +704,8 @@ void AmRtpStream::bufferPacket(AmRtpPacket* p)
          ERROR("parsing decoded packet!\n");
          mem.freePacket(p);
        } else {
-          if(telephone_event_pt.get() && 
-            (p->payload == telephone_event_pt->payload_type)) {
+          if(local_telephone_event_pt.get() && 
+            (p->payload == local_telephone_event_pt->payload_type)) {
             rtp_ev_qu.push(p);
           } else {
            receive_buf[p->timestamp] = p;
@@ -724,8 +734,8 @@ void AmRtpStream::bufferPacket(AmRtpPacket* p)
   } else {
 #endif // WITH_ZRTP
 
-    if(telephone_event_pt.get() && 
-       (p->payload == telephone_event_pt->payload_type)) {
+    if(local_telephone_event_pt.get() && 
+       (p->payload == local_telephone_event_pt->payload_type)) {
       rtp_ev_qu.push(p);
     } else {
       receive_buf[p->timestamp] = p;
@@ -782,17 +792,17 @@ int AmRtpStream::nextPacket(AmRtpPacket*& p)
   return 1;
 }
 
-int AmRtpStream::getTelephoneEventRate()
+int AmRtpStream::getLocalTelephoneEventRate()
 {
   int retval = 0;
-  if (telephone_event_pt.get())
-    retval = telephone_event_pt->clock_rate;
+  if (local_telephone_event_pt.get())
+    retval = local_telephone_event_pt->clock_rate;
   return retval;
 }
 
 void AmRtpStream::sendDtmf(int event, unsigned int duration_ms) {
   dtmf_send_queue_mut.lock();
-  dtmf_send_queue.push(std::make_pair(event, duration_ms * 
getTelephoneEventRate() 
+  dtmf_send_queue.push(std::make_pair(event, duration_ms * 
getLocalTelephoneEventRate() 
                                      / 1000));
   dtmf_send_queue_mut.unlock();
   DBG("enqueued DTMF event %i duration %u\n", event, duration_ms);
diff --git a/core/AmRtpStream.h b/core/AmRtpStream.h
index 39d8db2..4e2c760 100644
--- a/core/AmRtpStream.h
+++ b/core/AmRtpStream.h
@@ -153,7 +153,8 @@ protected:
   bool           passive;      // passive mode ?
 
   /** Payload type for telephone event */
-  auto_ptr<const SdpPayload> telephone_event_pt;
+  auto_ptr<const SdpPayload> remote_telephone_event_pt;
+  auto_ptr<const SdpPayload> local_telephone_event_pt;
 
   PacketMem       mem;
   ReceiveBuffer   receive_buf;
@@ -257,15 +258,7 @@ public:
 
   unsigned int get_ssrc() { return l_ssrc; }
 
-  /** 
-   * Set remote telephone event 
-   * payload type 
-   */
-  void setTelephoneEventPT(const SdpPayload *pt) {
-    telephone_event_pt.reset(pt);
-  }
-
-  int getTelephoneEventRate();
+  int getLocalTelephoneEventRate();
 
   /**
    * send a DTMF as RTP payload (RFC4733)
diff --git a/core/AmSdp.cpp b/core/AmSdp.cpp
index 42859e1..71488d7 100644
--- a/core/AmSdp.cpp
+++ b/core/AmSdp.cpp
@@ -104,7 +104,6 @@ bool SdpPayload::operator == (int r)
 //
 AmSdp::AmSdp()
   : remote_active(false),
-    telephone_event_pt(NULL),
     accepted_media(0)
 {
   l_origin.user = "sems";
@@ -119,7 +118,6 @@ AmSdp::AmSdp(const AmSdp& p_sdp_msg)
     sessionName(p_sdp_msg.sessionName),
     conn(p_sdp_msg.conn),
     media(p_sdp_msg.media),
-    telephone_event_pt(NULL),
     remote_active(false),
     accepted_media(0)
 {
@@ -143,8 +141,6 @@ int AmSdp::parse(const char* _sdp_msg)
     }
   }
   
-  telephone_event_pt = findPayload("telephone-event");
-    
   return ret;
 }
 
@@ -195,19 +191,18 @@ void AmSdp::print(string& body) const
   body = out_buf;
   //mime_type = "application/sdp";
 }
-       
-bool AmSdp::hasTelephoneEvent()
-{
-  return telephone_event_pt != NULL;
+
+const SdpPayload *AmSdp::telephoneEventPayload() const {
+  return findPayload("telephone-event");
 }
 
-const SdpPayload *AmSdp::findPayload(const string& name)
+const SdpPayload *AmSdp::findPayload(const string& name) const
 {
-  vector<SdpMedia>::iterator m_it;
+  vector<SdpMedia>::const_iterator m_it;
 
   for (m_it = media.begin(); m_it != media.end(); ++m_it)
     {
-      vector<SdpPayload>::iterator it = m_it->payloads.begin();
+      vector<SdpPayload>::const_iterator it = m_it->payloads.begin();
       for(; it != m_it->payloads.end(); ++it)
 
        {
diff --git a/core/AmSdp.h b/core/AmSdp.h
index e58c95b..54b4bb5 100644
--- a/core/AmSdp.h
+++ b/core/AmSdp.h
@@ -134,14 +134,10 @@ struct SdpMedia
 class AmSdp
 {
 
-  // Remote payload type for 
-  // 'telephone-event'
-  const SdpPayload *telephone_event_pt;
-
   /**
    * Find payload by name
    */
-  const SdpPayload *findPayload(const string& name);
+  const SdpPayload *findPayload(const string& name) const;
 
 public:
   // parsed SDP definition
@@ -176,13 +172,8 @@ public:
    */
   void print(string& body) const;
 
-  /**
-   * Test if the SDP message advertises 
-   * support for 'telefone_event'.
-   */
-  bool hasTelephoneEvent();
-
-  const SdpPayload *telephoneEventPayload() const { return telephone_event_pt; 
}
+  /** get telephone event payload (new object) */
+  const SdpPayload *telephoneEventPayload() const;
 };
 
 #endif

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to