[asterisk-dev] q931.c: Substitute PROGRESS for DISCONNECT with progress ind... (libpri[1.4])
Richard Mudgett
asteriskteam at digium.com
Wed Mar 16 16:14:21 CDT 2016
Richard Mudgett has uploaded a new change for review.
https://gerrit.asterisk.org/2425
Change subject: q931.c: Substitute PROGRESS for DISCONNECT with progress indicator #8
......................................................................
q931.c: Substitute PROGRESS for DISCONNECT with progress indicator #8
When the pri_set_inbanddisconnect() option is enabled and the call has not
been answered when a DISCONNECT with progress indicator #8 (Inband audio
present) is received, then report the event as a PROGRESS with progress
indicator #8 (Inband audio present) instead. Substituting a PROGRESS
event allows the upper layer to open the media path if it isn't already
open so the user can hear the inband audio message.
PRI-180
Reported by: Alexandr Dranchuk
Change-Id: I62313bf9cc1d2f3b0231f0c07a784717ddba0415
---
M q931.c
1 file changed, 34 insertions(+), 1 deletion(-)
git pull ssh://gerrit.asterisk.org:29418/libpri refs/changes/25/2425/1
diff --git a/q931.c b/q931.c
index 0e7ff79..69c210e 100644
--- a/q931.c
+++ b/q931.c
@@ -8726,6 +8726,7 @@
int res;
int changed;
int mand_cause;
+ enum Q931_CALL_STATE ourcallstate_orig;
struct apdu_event *cur = NULL;
struct pri_subcommand *subcmd;
struct q931_call *master_call;
@@ -9265,14 +9266,46 @@
}
}
+ ourcallstate_orig = c->ourcallstate;
UPDATE_OURCALLSTATE(ctrl, c, Q931_CALL_STATE_DISCONNECT_INDICATION);
c->peercallstate = Q931_CALL_STATE_DISCONNECT_REQUEST;
c->sendhangupack = 1;
/* wait for a RELEASE so that sufficient time has passed
for the inband audio to be heard */
- if (ctrl->acceptinbanddisconnect && (c->progressmask & PRI_PROG_INBAND_AVAILABLE))
+ if (ctrl->acceptinbanddisconnect
+ && (c->progressmask & PRI_PROG_INBAND_AVAILABLE)) {
+ switch (ourcallstate_orig) {
+ case Q931_CALL_STATE_CALL_INITIATED:
+ case Q931_CALL_STATE_OVERLAP_SENDING:
+ case Q931_CALL_STATE_OUTGOING_CALL_PROCEEDING:
+ case Q931_CALL_STATE_CALL_DELIVERED:
+ /*
+ * Open the media path if it isn't already open so
+ * the user can hear the inband audio.
+ */
+ if (ctrl->debug & PRI_DEBUG_Q931_STATE) {
+ pri_message(ctrl, "Report the DISCONNECT as a PROGRESS instead.\n");
+ }
+ ctrl->ev.e = PRI_EVENT_PROGRESS;
+ ctrl->ev.proceeding.cause = c->cause;
+ ctrl->ev.proceeding.subcmds = &ctrl->subcmds;
+ ctrl->ev.proceeding.channel = q931_encode_channel(c);
+ ctrl->ev.proceeding.progress = c->progress;
+ ctrl->ev.proceeding.progressmask = c->progressmask;
+ ctrl->ev.proceeding.cref = c->cr;
+ ctrl->ev.proceeding.call = c->master_call;
+ return Q931_RES_HAVEEVENT;
+ default:
+ break;
+ }
+ /*
+ * Suppress reporting DISCONNECT to the upper layer. The
+ * media path should already be open and we cannot report
+ * a PROGRESS at this time anyway.
+ */
break;
+ }
/* Return such an event */
ctrl->ev.e = PRI_EVENT_HANGUP_REQ;
--
To view, visit https://gerrit.asterisk.org/2425
To unsubscribe, visit https://gerrit.asterisk.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I62313bf9cc1d2f3b0231f0c07a784717ddba0415
Gerrit-PatchSet: 1
Gerrit-Project: libpri
Gerrit-Branch: 1.4
Gerrit-Owner: Richard Mudgett <rmudgett at digium.com>
More information about the asterisk-dev
mailing list