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
