From 665126f91f350e75c4b6ad1f4ef762f4ab6fb60e Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Wed, 2 May 2007 18:08:49 +0000 Subject: [PATCH] changed receiver of keypresses to a more generic interface git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@321 8eb893ce-cfd4-0310-b710-fb5ebe64c474 --- core/AmDtmfDetector.cpp | 24 +++++++++++---------- core/AmDtmfDetector.h | 47 +++++++++++++++++++++++++++++++++-------- 2 files changed, 51 insertions(+), 20 deletions(-) diff --git a/core/AmDtmfDetector.cpp b/core/AmDtmfDetector.cpp index dd6e159b..012bcc0b 100644 --- a/core/AmDtmfDetector.cpp +++ b/core/AmDtmfDetector.cpp @@ -141,8 +141,8 @@ AmRtpDtmfEvent::AmRtpDtmfEvent(const dtmf_payload_t *payload, int sample_rate) // // AmSipDtmfDetector methods // -AmSipDtmfDetector::AmSipDtmfDetector(AmDtmfDetector *owner) - : m_owner(owner) +AmSipDtmfDetector::AmSipDtmfDetector(AmKeyPressSink *keysink) + : m_keysink(keysink) { } @@ -159,7 +159,7 @@ void AmSipDtmfDetector::process(AmSipDtmfEvent *evt) ++stop.tv_sec; stop.tv_usec -= 1000000; } - m_owner->registerKeyReleased(evt->event(), Dtmf::SOURCE_SIP, start, stop); + m_keysink->registerKeyReleased(evt->event(), Dtmf::SOURCE_SIP, start, stop); } // @@ -290,8 +290,8 @@ void AmDtmfDetector::putDtmfAudio(const unsigned char *buf, int size, int user_t } // AmRtpDtmfDetector methods -AmRtpDtmfDetector::AmRtpDtmfDetector(AmDtmfDetector *owner) - : m_owner(owner), m_eventPending(false), m_packetCount(0) +AmRtpDtmfDetector::AmRtpDtmfDetector(AmKeyPressSink *keysink) + : m_keysink(keysink), m_eventPending(false), m_packetCount(0) { } @@ -328,7 +328,7 @@ void AmRtpDtmfDetector::process(AmRtpDtmfEvent *evt) } if (m_eventPending) { - m_owner->registerKeyPressed(m_currentEvent, Dtmf::SOURCE_RTP); + m_keysink->registerKeyPressed(m_currentEvent, Dtmf::SOURCE_RTP); } } } @@ -339,7 +339,7 @@ void AmRtpDtmfDetector::sendPending() { struct timeval end_time; gettimeofday(&end_time, NULL); - m_owner->registerKeyReleased(m_currentEvent, Dtmf::SOURCE_RTP, m_startTime, end_time); + m_keysink->registerKeyReleased(m_currentEvent, Dtmf::SOURCE_RTP, m_startTime, end_time); m_eventPending = false; } } @@ -409,8 +409,8 @@ static char dtmf_matrix[4][4] = {'*', '0', '#', 'D'} }; -AmInbandDtmfDetector::AmInbandDtmfDetector(AmDtmfDetector *owner) - : m_owner(owner), +AmInbandDtmfDetector::AmInbandDtmfDetector(AmKeyPressSink *keysink) + : m_keysink(keysink), m_last(' '), m_idx(0), m_count(0), @@ -423,6 +423,8 @@ AmInbandDtmfDetector::AmInbandDtmfDetector(AmDtmfDetector *owner) rel_cos2pik[i] = (int)(2 * 32768 * cos(2 * PI * k / REL_DTMF_NPOINTS)); } } +AmInbandDtmfDetector::~AmInbandDtmfDetector() { +} /* * Goertzel algorithm. @@ -533,7 +535,7 @@ void AmInbandDtmfDetector::isdn_audio_eval_dtmf_relative() { if (++m_count >= DTMF_INTERVAL) { - m_owner->registerKeyPressed(m_lastCode, Dtmf::SOURCE_INBAND); + m_keysink->registerKeyPressed(m_lastCode, Dtmf::SOURCE_INBAND); } } else @@ -543,7 +545,7 @@ void AmInbandDtmfDetector::isdn_audio_eval_dtmf_relative() struct timeval stop; stop.tv_sec = m_last_ts / SAMPLERATE; stop.tv_usec = (m_last_ts * 1000 / SAMPLERATE) % 1000; - m_owner->registerKeyReleased(m_lastCode, Dtmf::SOURCE_INBAND, m_startTime, stop); + m_keysink->registerKeyReleased(m_lastCode, Dtmf::SOURCE_INBAND, m_startTime, stop); } m_count = 0; } diff --git a/core/AmDtmfDetector.h b/core/AmDtmfDetector.h index a867dc27..b9fd4228 100644 --- a/core/AmDtmfDetector.h +++ b/core/AmDtmfDetector.h @@ -101,6 +101,32 @@ class AmDtmfEvent : public AmEvent */ int duration() const { return m_duration_msec; } }; +/** + * this is the Interface for a sink for KeyPresses. + */ +class AmKeyPressSink { + public: + AmKeyPressSink() { } + virtual ~AmKeyPressSink() { } + + /** + * Through this method the AmDtmfDetector receives events that was + * detected by specific detectors. + * @param event code of key pressed + * @param source which detector posted this event + * @param start time when key was pressed + * @param stop time when key was released + */ + virtual void registerKeyReleased(int event, Dtmf::EventSource source, + const struct timeval& start, const struct timeval& stop) = 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 + */ + virtual void registerKeyPressed(int event, Dtmf::EventSource source) = 0; +}; /** * \brief DTMF received via RTP @@ -168,7 +194,7 @@ class AmInbandDtmfDetector /** * Owner of this class instance */ - AmDtmfDetector *m_owner; + AmKeyPressSink *m_keysink; /** * Time when first audio packet containing current DTMF tone was detected */ @@ -203,7 +229,8 @@ class AmInbandDtmfDetector void isdn_audio_calc_dtmf(const signed short* buf, int len, unsigned int ts); public: - AmInbandDtmfDetector(AmDtmfDetector *owner); + AmInbandDtmfDetector(AmKeyPressSink *keysink); + ~AmInbandDtmfDetector(); /** * Entry point for audio stream */ @@ -219,10 +246,10 @@ class AmInbandDtmfDetector class AmSipDtmfDetector { private: - AmDtmfDetector *m_owner; + AmKeyPressSink *m_keysink; public: - AmSipDtmfDetector(AmDtmfDetector *owner); + AmSipDtmfDetector(AmKeyPressSink *keysink); void process(AmSipDtmfEvent *event); }; @@ -235,9 +262,9 @@ class AmRtpDtmfDetector { private: /** - * Owner of this class instance + * sink for detected keys */ - AmDtmfDetector *m_owner; + AmKeyPressSink *m_keysink; /** * Is there event pending? */ @@ -259,9 +286,9 @@ class AmRtpDtmfDetector public: /** * Constructor - * @param owner is the owner of this class instance + * @param keysink is the sink for detected keys */ - AmRtpDtmfDetector(AmDtmfDetector *owner); + AmRtpDtmfDetector(AmKeyPressSink *keysink); /** * Process RTP DTMF event */ @@ -277,7 +304,9 @@ class AmRtpDtmfDetector * Received DTMF events are further reported to SEMS application via * DialogState::onDtmf() call. */ -class AmDtmfDetector : public AmEventHandler +class AmDtmfDetector +: public AmEventHandler, + public AmKeyPressSink { private: static const int WAIT_TIMEOUT = 100; // miliseconds