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
sayer/1.4-spce2.6
Stefan Sayer 20 years ago
parent 3df0445040
commit 665126f91f

@ -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;
}

@ -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

Loading…
Cancel
Save