Module: sems
Branch: master
Commit: 575b2e1bc1188c9b104ec165c988dedda88303dd
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=575b2e1bc1188c9b104ec165c988dedda88303dd
Author: Stefan Sayer <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date: Thu Jul 1 16:12:53 2010 +0200
de03bc1
---
core/AmDtmfDetector.cpp | 32 +++++++++++++++++++++-----------
core/AmDtmfDetector.h | 25 ++++++++++++++++---------
2 files changed, 37 insertions(+), 20 deletions(-)
diff --git a/core/AmDtmfDetector.cpp b/core/AmDtmfDetector.cpp
index 678ccdd..d9d1381 100644
--- a/core/AmDtmfDetector.cpp
+++ b/core/AmDtmfDetector.cpp
@@ -238,19 +238,24 @@ void AmDtmfDetector::process(AmEvent *evt)
evt->processed = true;
}
+void AmDtmfDetector::flushKey(unsigned int event_id) {
+ // flush the current key if it corresponds to the one with event_id
+ if (m_eventPending && m_current_eventid_i && event_id == m_current_eventid) {
+ reportEvent();
+ }
+}
+
void AmDtmfDetector::registerKeyReleased(int event, Dtmf::EventSource source,
const struct timeval& start,
const struct timeval& stop,
- bool flush,
bool has_eventid, unsigned int
event_id)
{
// Old event has not been sent yet
// push out it now
- if (flush || (m_eventPending && m_currentEvent != event) ||
- (m_eventPending && has_eventid && m_current_eventid_i && (event_id != m_current_eventid)))
- {
- reportEvent();
- }
+ if ((m_eventPending && m_currentEvent != event) ||
+ (m_eventPending && has_eventid && m_current_eventid_i && (event_id != m_current_eventid))) {
+ reportEvent();
+ }
m_eventPending = true;
m_currentEvent = event;
@@ -277,7 +282,7 @@ void AmDtmfDetector::registerKeyReleased(int event,
Dtmf::EventSource source,
}
}
-void AmDtmfDetector::registerKeyPressed(int event, Dtmf::EventSource type)
+void AmDtmfDetector::registerKeyPressed(int event, Dtmf::EventSource type,
bool has_eventid, unsigned int event_id)
{
struct timeval tm;
gettimeofday(&tm, NULL);
@@ -298,6 +303,11 @@ void AmDtmfDetector::registerKeyPressed(int event,
Dtmf::EventSource type)
if (delta_msec > 0)
memcpy(&m_lastReportTime, &tm, sizeof(struct timeval));
}
+
+ if (has_eventid) {
+ m_current_eventid_i = true;
+ m_current_eventid = event_id;
+ }
}
void AmDtmfDetector::checkTimeout()
@@ -379,7 +389,7 @@ void AmRtpDtmfDetector::process(AmRtpDtmfEvent *evt)
(m_currentTS_i && (evt->ts() != m_currentTS)))
{
// Previous event does not end correctly so send out it now...
- sendPending(true);
+ m_keysink->flushKey(m_currentTS);
// ... and reinitialize to process current event
gettimeofday(&m_startTime, NULL);
m_eventPending = true;
@@ -388,17 +398,17 @@ void AmRtpDtmfDetector::process(AmRtpDtmfEvent *evt)
m_currentTS_i = true;
}
}
- m_keysink->registerKeyPressed(m_currentEvent, Dtmf::SOURCE_RTP);
+ m_keysink->registerKeyPressed(m_currentEvent, Dtmf::SOURCE_RTP, true, m_currentTS);
}
}
-void AmRtpDtmfDetector::sendPending(bool flush)
+void AmRtpDtmfDetector::sendPending()
{
if (m_eventPending)
{
struct timeval end_time;
gettimeofday(&end_time, NULL);
- m_keysink->registerKeyReleased(m_currentEvent, Dtmf::SOURCE_RTP,
m_startTime, end_time, flush, true, m_currentTS);
+ m_keysink->registerKeyReleased(m_currentEvent, Dtmf::SOURCE_RTP,
m_startTime, end_time, true, m_currentTS);
m_eventPending = false;
m_currentTS_i = false;
m_lastTS = m_currentTS;
diff --git a/core/AmDtmfDetector.h b/core/AmDtmfDetector.h
index e9dba50..1afcdad 100644
--- a/core/AmDtmfDetector.h
+++ b/core/AmDtmfDetector.h
@@ -129,18 +129,26 @@ class AmKeyPressSink {
* @param source which detector posted this event
* @param start time when key was pressed
* @param stop time when key was released
- * @param flush whether key should be registered as own keypress immediately
+ * @param has_eventid whether event has an id
+ * @param event_id id of the event
*/
virtual void registerKeyReleased(int event, Dtmf::EventSource source,
- const struct timeval& start, const struct
timeval& stop, bool flush=false,
+ const struct timeval& start, const struct
timeval& stop,
bool has_eventid = false, unsigned int
event_id = 0) = 0;
/**
* Through this method the AmDtmfDetector receives events that was
* detected by specific detectors.
* @param event code of key released
* @param source which detector posted this event
+ * @param has_eventid whether event has an id
+ * @param event_id id of the event
*/
- virtual void registerKeyPressed(int event, Dtmf::EventSource source) = 0;
+ virtual void registerKeyPressed(int event, Dtmf::EventSource source, bool
has_eventid=false, unsigned int event_id=0) = 0;
+ /**
+ * Flush (report to session) any pending key if ti matches the event id
+ * @param event_id ID of the event (e.g. RTP TS)
+ */
+ virtual void flushKey(unsigned int event_id) = 0;
};
/**
@@ -355,7 +363,7 @@ class AmRtpDtmfDetector
/**
* Send out pending event
*/
- void sendPending(bool flush=false);
+ void sendPending();
public:
/**
@@ -423,20 +431,19 @@ class AmDtmfDetector
* @param source which detector posted this event
* @param start time when key was pressed
* @param stop time when key was released
- * @param flush whether key should be registered as own keypress immediately
- * @param has_eventid whether event has an id
- * @param event_id id of the event
*/
void registerKeyReleased(int event, Dtmf::EventSource source,
const struct timeval& start, const struct timeval&
stop,
- bool flush=false, bool has_eventid = false, unsigned
int event_id = 0);
+ bool has_eventid = false, unsigned int event_id = 0);
/**
* Through this method the AmDtmfDetector receives events that was
* detected by specific detectors.
* @param event code of key released
* @param source which detector posted this event
*/
- void registerKeyPressed(int event, Dtmf::EventSource source);
+ void registerKeyPressed(int event, Dtmf::EventSource source, bool
has_eventid=false, unsigned int event_id=0);
+
+ void flushKey(unsigned int event_id);
public:
/**
_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev