aboutsummaryrefslogtreecommitdiffstats
path: root/channels/sig_analog.c
diff options
context:
space:
mode:
authoralecdavis <alecdavis@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-22 23:14:50 +0000
committeralecdavis <alecdavis@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-22 23:14:50 +0000
commitf4110f5c77863958065979fab4027770ea2990c7 (patch)
tree46a9b237320ec45b34bbc4c57965d79679fb8688 /channels/sig_analog.c
parent14194cacf54fca15caba5c92e71d0268525897d6 (diff)
Support FXS module Polarity Reversal on remote party Answer and Hangup
FXS lines normally connect to a telephone. However, when FXS lines are routed to an external PBX or Key System to act as "external" or "CO" lines, it is extremely difficult, if not impossible for the external PBX to know when the call has been disconnected without receiving a polarity reversal on the line. Now using answeronpolarityswitch and hanguponpolarityswitch keywords that previously were used only for FXO ports, now applies like functionality for an FXS port, but from the connected equipment's point of view. (closes issue #17318) Reported by: armeniki Patches: fxs_linepolarity.diff5.txt uploaded by alecdavis (license 585) Tested by: alecdavis Review: https://reviewboard.asterisk.org/r/797/ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@278809 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/sig_analog.c')
-rw-r--r--channels/sig_analog.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/channels/sig_analog.c b/channels/sig_analog.c
index 68677f561..3214681bd 100644
--- a/channels/sig_analog.c
+++ b/channels/sig_analog.c
@@ -537,6 +537,35 @@ static void analog_set_needringing(struct analog_pvt *p, int value)
}
}
+#if 0
+static void analog_set_polarity(struct analog_pvt *p, int value)
+{
+ if (p->calls->set_polarity) {
+ return p->calls->set_polarity(p->chan_pvt, value);
+ }
+}
+#endif
+
+static void analog_start_polarityswitch(struct analog_pvt *p)
+{
+ if (p->calls->start_polarityswitch) {
+ return p->calls->start_polarityswitch(p->chan_pvt);
+ }
+}
+static void analog_answer_polarityswitch(struct analog_pvt *p)
+{
+ if (p->calls->answer_polarityswitch) {
+ return p->calls->answer_polarityswitch(p->chan_pvt);
+ }
+}
+
+static void analog_hangup_polarityswitch(struct analog_pvt *p)
+{
+ if (p->calls->hangup_polarityswitch) {
+ return p->calls->hangup_polarityswitch(p->chan_pvt);
+ }
+}
+
static int analog_dsp_set_digitmode(struct analog_pvt *p, enum analog_dsp_digitmode mode)
{
if (p->calls->dsp_set_digitmode) {
@@ -1269,6 +1298,7 @@ int analog_hangup(struct analog_pvt *p, struct ast_channel *ast)
case ANALOG_SIG_FXOKS:
/* If they're off hook, try playing congestion */
if (analog_is_off_hook(p)) {
+ analog_hangup_polarityswitch(p);
analog_play_tone(p, ANALOG_SUB_REAL, ANALOG_TONE_CONGESTION);
} else {
analog_play_tone(p, ANALOG_SUB_REAL, -1);
@@ -1360,9 +1390,21 @@ int analog_answer(struct analog_pvt *p, struct ast_channel *ast)
p->owner = p->subs[ANALOG_SUB_REAL].owner;
}
}
- if ((p->sig == ANALOG_SIG_FXSLS) || (p->sig == ANALOG_SIG_FXSKS) || (p->sig == ANALOG_SIG_FXSGS)) {
+
+ switch (p->sig) {
+ case ANALOG_SIG_FXSLS:
+ case ANALOG_SIG_FXSKS:
+ case ANALOG_SIG_FXSGS:
analog_set_echocanceller(p, 1);
analog_train_echocanceller(p);
+ break;
+ case ANALOG_SIG_FXOLS:
+ case ANALOG_SIG_FXOKS:
+ case ANALOG_SIG_FXOGS:
+ analog_answer_polarityswitch(p);
+ break;
+ default:
+ break;
}
break;
default:
@@ -2524,6 +2566,7 @@ static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_
case ANALOG_SIG_FXOLS:
case ANALOG_SIG_FXOGS:
case ANALOG_SIG_FXOKS:
+ analog_start_polarityswitch(p);
p->fxsoffhookstate = 0;
p->onhooktime = time(NULL);
p->msgstate = -1;
@@ -2705,6 +2748,7 @@ static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_
ast_setstate(ast, AST_STATE_DIALING);
} else {
ast_setstate(ast, AST_STATE_UP);
+ analog_answer_polarityswitch(p);
}
return &p->subs[index].f;
case AST_STATE_DOWN:
@@ -3443,6 +3487,7 @@ void *analog_handle_init_event(struct analog_pvt *i, int event)
case ANALOG_SIG_FXOLS:
case ANALOG_SIG_FXOGS:
i->fxsoffhookstate = 0;
+ analog_start_polarityswitch(i);
case ANALOG_SIG_FEATD:
case ANALOG_SIG_FEATDMF:
case ANALOG_SIG_FEATDMF_TA: