Emit call.ringing automatically from outbound calls on FXS interfaces.

Added option to try to provide ringback from analog card or gateway if early media is not available from the called party.


git-svn-id: http://yate.null.ro/svn/yate/trunk@4189 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2011-03-17 08:02:32 +00:00
parent 6ceca253a4
commit fb7cebdafb
2 changed files with 32 additions and 6 deletions

View File

@ -184,6 +184,10 @@
; Defaults to after if missing or invalid
;callsetup=after
; ringback: boolean: Offer a ringback tone even if not provided by peer channel
; This requires ringback tone generation support from the analog circuit driver
;ringback=no
; debuglevel: integer: The debug level of this group
; Applied on reload
; Defaults to the current debug level if missing or invalid

View File

@ -104,7 +104,8 @@ class ModuleGroup : public AnalogLineGroup
public:
// Create an FXS/FXO group of analog lines
inline ModuleGroup(AnalogLine::Type type, const char* name)
: AnalogLineGroup(type,name), m_init(false), m_thread(0), m_callEndedPlayTime(0)
: AnalogLineGroup(type,name),
m_init(false), m_ringback(false), m_thread(0), m_callEndedPlayTime(0)
{ m_prefix << name << "/"; }
// Create a group of analog lines used to record
inline ModuleGroup(const char* name, ModuleGroup* fxo)
@ -120,6 +121,8 @@ public:
{ return static_cast<ModuleGroup*>(fxo()); }
inline const String& prefix()
{ return m_prefix; }
inline bool ringback() const
{ return m_ringback; }
// Remove all channels associated with this group and stop worker thread
virtual void destruct();
// Process an event geberated by a line
@ -173,6 +176,7 @@ private:
static const char* lineParams[];
bool m_init; // Init flag
bool m_ringback; // Lines need to provide ringback
String m_prefix; // Line prefix used to complete commands
AnalogWorkerThread* m_thread; // The worker thread
// FXS/FXO group data
@ -283,6 +287,7 @@ protected:
private:
ModuleLine* m_line; // The analog line associated with this channel
bool m_hungup; // Hang up flag
bool m_ringback; // Circuit ringback provider flag
bool m_routeOnSecondRing; // Delay router if waiting callerid
RecordTrigger m_recording; // Recording trigger source
String m_reason; // Hangup reason
@ -980,6 +985,8 @@ bool ModuleGroup::initialize(const NamedList& params, const NamedList& defaults,
debugLevel(level);
}
m_ringback = params.getBoolValue("ringback");
Lock2 lock(this,fxoRec());
bool ok = true;
if (!m_init) {
@ -1315,6 +1322,7 @@ AnalogChannel::AnalogChannel(ModuleLine* line, Message* msg, RecordTrigger recor
: Channel(&plugin,0,(msg != 0)),
m_line(line),
m_hungup(false),
m_ringback(false),
m_routeOnSecondRing(false),
m_recording(recorder),
m_callEndedTimer(0),
@ -1327,8 +1335,10 @@ AnalogChannel::AnalogChannel(ModuleLine* line, Message* msg, RecordTrigger recor
m_callsetup(AnalogLine::NoCallSetup)
{
m_line->userdata(this);
if (m_line->moduleGroup())
if (m_line->moduleGroup()) {
m_line->moduleGroup()->setEndpoint(this,true);
m_ringback = m_line->moduleGroup()->ringback();
}
// Set caller/called from line
if (isOutgoing()) {
@ -1499,11 +1509,20 @@ bool AnalogChannel::msgRinging(Message& msg)
m_line->acceptPulseDigit(false);
m_line->changeState(AnalogLine::Ringing);
}
if (msg.getBoolValue("earlymedia",getPeer() && getPeer()->getSource())) {
bool media = msg.getBoolValue("earlymedia",getPeer() && getPeer()->getSource());
if (media) {
setAudio(false);
if (m_line)
m_line->setCircuitParam("echotrain",msg.getValue("echotrain"));
}
else if (m_ringback && m_line) {
// Provide ringback from circuit features if supported
NamedList params("ringback");
params.addParam("tone","ringback");
media = m_line->sendEvent(SignallingCircuitEvent::GenericTone,&params);
}
if (media)
m_ringback = false;
return true;
}
@ -1514,10 +1533,9 @@ bool AnalogChannel::msgAnswered(Message& msg)
if (m_line) {
m_line->noRingTimer().stop();
m_line->removeCallSetupDetector();
if (m_line->type() == AnalogLine::FXS) {
m_line->sendEvent(SignallingCircuitEvent::RingEnd);
m_line->sendEvent(SignallingCircuitEvent::RingEnd);
if (m_line->type() == AnalogLine::FXS)
polarityControl(true);
}
else {
m_line->acceptPulseDigit(false);
m_line->sendEvent(SignallingCircuitEvent::OffHook);
@ -1617,6 +1635,7 @@ void AnalogChannel::callAccept(Message& msg)
m_line->acceptPulseDigit(false);
m_line->changeState(AnalogLine::DialComplete);
}
m_ringback = msg.getBoolValue("ringback",m_ringback);
setAudio(false);
setAudio(true);
Channel::callAccept(msg);
@ -2051,6 +2070,7 @@ void AnalogChannel::outCallAnswered(bool stopDial)
if (stopDial)
m_dialTimer.stop();
m_answered = true;
m_ringback = false;
setStatus("answered");
if (m_line) {
m_line->changeState(AnalogLine::Answered);
@ -2756,6 +2776,8 @@ bool AnalogDriver::msgExecute(Message& msg, String& dest)
analogCh->callConnect(msg);
msg.setParam("peerid",analogCh->id());
msg.setParam("targetid",analogCh->id());
if (analogCh->line() && (analogCh->line()->type() == AnalogLine::FXS))
Engine::enqueue(analogCh->message("call.ringing",false,true));
}
}
else