diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index bb621acabc8f8fadae07ab8beef9cb36e2da5458..aeb15e014c4b787d779f2ad8a4f8836264ccc9f8 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -1408,6 +1408,7 @@ static struct dahdi_chan_conf dahdi_chan_conf_default(void) .localdialplan = PRI_NATIONAL_ISDN + 1, .nodetype = PRI_CPE, .qsigchannelmapping = DAHDI_CHAN_MAPPING_PHYSICAL, + .inband_on_proceeding = 1, #if defined(HAVE_PRI_CCSS) .cc_ptmp_recall_mode = 1,/* specificRecall */ @@ -12930,6 +12931,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf, pris[span].pri.layer1_ignored = 0; } pris[span].pri.append_msn_to_user_tag = conf->pri.pri.append_msn_to_user_tag; + pris[span].pri.inband_on_proceeding = conf->pri.pri.inband_on_proceeding; ast_copy_string(pris[span].pri.initial_user_tag, conf->chan.cid_tag, sizeof(pris[span].pri.initial_user_tag)); ast_copy_string(pris[span].pri.msn_list, conf->pri.pri.msn_list, sizeof(pris[span].pri.msn_list)); #if defined(HAVE_PRI_MWI) @@ -18192,6 +18194,8 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct #endif /* defined(HAVE_PRI_MWI) */ } else if (!strcasecmp(v->name, "append_msn_to_cid_tag")) { confp->pri.pri.append_msn_to_user_tag = ast_true(v->value); + } else if (!strcasecmp(v->name, "inband_on_proceeding")) { + confp->pri.pri.inband_on_proceeding = ast_true(v->value); #if defined(HAVE_PRI_DISPLAY_TEXT) } else if (!strcasecmp(v->name, "display_send")) { confp->pri.pri.display_flags_send = dahdi_display_text_option(v->value); diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 96ae24e1760cf439b6f93ffd9367109412f9739d..be8dfb4d3337a575d5b9505fb5baf57e7b6ae244 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -6752,9 +6752,11 @@ static void *pri_dchannel(void *vpri) /* Bring voice path up */ pri_queue_control(pri, chanpos, AST_CONTROL_PROGRESS); pri->pvts[chanpos]->progress = 1; + sig_pri_set_dialing(pri->pvts[chanpos], 0); sig_pri_open_media(pri->pvts[chanpos]); + } else if (pri->inband_on_proceeding) { + sig_pri_set_dialing(pri->pvts[chanpos], 0); } - sig_pri_set_dialing(pri->pvts[chanpos], 0); sig_pri_unlock_private(pri->pvts[chanpos]); break; case PRI_EVENT_FACILITY: diff --git a/channels/sig_pri.h b/channels/sig_pri.h index 80f22c9a68948788c2d1d98d27b9f6cad7f12978..43acb12697de1e3a4f7d3933148b354cf9283238 100644 --- a/channels/sig_pri.h +++ b/channels/sig_pri.h @@ -470,6 +470,8 @@ struct sig_pri_span { * appended to the initial_user_tag[]. */ unsigned int append_msn_to_user_tag:1; + /*! TRUE if a PROCEEDING message needs to unsquelch the received audio. */ + unsigned int inband_on_proceeding:1; #if defined(HAVE_PRI_MCID) /*! \brief TRUE if allow sending MCID request on this span. */ unsigned int mcid_send:1; diff --git a/configs/chan_dahdi.conf.sample b/configs/chan_dahdi.conf.sample index 85ffd6d616a316578316f28f4bb37e30e921e149..7d64cf3831bdcbd7f5ab329bc954844866391989 100644 --- a/configs/chan_dahdi.conf.sample +++ b/configs/chan_dahdi.conf.sample @@ -196,6 +196,18 @@ context=public ; ;resetinterval = 3600 ; +; Assume inband audio may be present when a PROCEEDING message is received. +; Q.931 Section 5.1.2 says the network cannot assume that the CPE side has +; attached to the B channel at this time without explicitly sending the +; progress indicator ie informing the CPE side to attach to the B channel +; for audio. However, some non-compliant ISDN switches send a PROCEEDING +; without the progress indicator ie indicating inband audio is available and +; assume that the CPE device has connected the media path for listening to +; ringback and other messages. +; Default yes in current release branches for backward compatibility. +; +;inband_on_proceeding=yes +; ; Overlap dialing mode (sending overlap digits) ; Cannot be changed on a reload. ;