sig_analog: Allow three-way flash to time out to silence.

sig_analog allows users to flash and use the three-way dial
tone as a primitive hold function, simply by never timing
it out.

Some systems allow this dial tone to time out to silence,
so the user is not annoyed by a persistent dial tone.
This option allows the dial tone to time out normally to
silence.

ASTERISK-30004 #close
Resolves: #205

UserNote: The threewaysilenthold option now allows the three-way
dial tone to time out to silence, rather than continuing forever.

(cherry picked from commit 5516763e57)
pull/886/head
Naveen Albert 2 years ago committed by Asterisk Development Team
parent 986c71953c
commit 18aa912f46

@ -12898,6 +12898,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
tmp->usedistinctiveringdetection = usedistinctiveringdetection; tmp->usedistinctiveringdetection = usedistinctiveringdetection;
tmp->callwaitingcallerid = conf->chan.callwaitingcallerid; tmp->callwaitingcallerid = conf->chan.callwaitingcallerid;
tmp->threewaycalling = conf->chan.threewaycalling; tmp->threewaycalling = conf->chan.threewaycalling;
tmp->threewaysilenthold = conf->chan.threewaysilenthold;
tmp->adsi = conf->chan.adsi; tmp->adsi = conf->chan.adsi;
tmp->use_smdi = conf->chan.use_smdi; tmp->use_smdi = conf->chan.use_smdi;
tmp->permhidecallerid = conf->chan.hidecallerid; tmp->permhidecallerid = conf->chan.hidecallerid;
@ -18245,6 +18246,8 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
confp->chan.cid_start = CID_START_RING; confp->chan.cid_start = CID_START_RING;
} else if (!strcasecmp(v->name, "threewaycalling")) { } else if (!strcasecmp(v->name, "threewaycalling")) {
confp->chan.threewaycalling = ast_true(v->value); confp->chan.threewaycalling = ast_true(v->value);
} else if (!strcasecmp(v->name, "threewaysilenthold")) {
confp->chan.threewaysilenthold = ast_true(v->value);
} else if (!strcasecmp(v->name, "cancallforward")) { } else if (!strcasecmp(v->name, "cancallforward")) {
confp->chan.cancallforward = ast_true(v->value); confp->chan.cancallforward = ast_true(v->value);
} else if (!strcasecmp(v->name, "relaxdtmf")) { } else if (!strcasecmp(v->name, "relaxdtmf")) {

@ -351,6 +351,11 @@ struct dahdi_pvt {
* \note Set from the "threewaycalling" value read in from chan_dahdi.conf * \note Set from the "threewaycalling" value read in from chan_dahdi.conf
*/ */
unsigned int threewaycalling:1; unsigned int threewaycalling:1;
/*!
* \brief TRUE if a three way dial tone should time out to silence
* \note Set from the "threewaysilenthold" value read in from chan_dahdi.conf
*/
unsigned int threewaysilenthold:1;
/*! /*!
* \brief TRUE if call transfer is enabled * \brief TRUE if call transfer is enabled
* \note For FXS ports (either direct analog or over T1/E1): * \note For FXS ports (either direct analog or over T1/E1):

@ -2166,8 +2166,9 @@ static void *__analog_ss_thread(void *data)
/* Read the first digit */ /* Read the first digit */
timeout = analog_get_firstdigit_timeout(p); timeout = analog_get_firstdigit_timeout(p);
/* If starting a threeway call, never timeout on the first digit so someone /* If starting a threeway call, never timeout on the first digit so someone
can use flash-hook as a "hold" feature */ * can use flash-hook as a "hold" feature...
if (p->subs[ANALOG_SUB_THREEWAY].owner) { * ...Unless three-way dial tone should time out to silence, in which case the default suffices. */
if (!p->threewaysilenthold && p->subs[ANALOG_SUB_THREEWAY].owner) {
timeout = INT_MAX; timeout = INT_MAX;
} }
while (len < AST_MAX_EXTENSION-1) { while (len < AST_MAX_EXTENSION-1) {
@ -2249,7 +2250,11 @@ static void *__analog_ss_thread(void *data)
} }
} else if (res == 0) { } else if (res == 0) {
ast_debug(1, "not enough digits (and no ambiguous match)...\n"); ast_debug(1, "not enough digits (and no ambiguous match)...\n");
if (p->threewaysilenthold) {
ast_debug(1, "Nothing dialed at three-way dial tone, timed out to silent hold\n");
} else {
res = analog_play_tone(p, idx, ANALOG_TONE_CONGESTION); res = analog_play_tone(p, idx, ANALOG_TONE_CONGESTION);
}
analog_wait_event(p); analog_wait_event(p);
ast_hangup(chan); ast_hangup(chan);
goto quit; goto quit;

@ -300,6 +300,7 @@ struct analog_pvt {
unsigned int permhidecallerid:1; /*!< Whether to hide our outgoing caller ID or not */ unsigned int permhidecallerid:1; /*!< Whether to hide our outgoing caller ID or not */
unsigned int pulse:1; unsigned int pulse:1;
unsigned int threewaycalling:1; unsigned int threewaycalling:1;
unsigned int threewaysilenthold:1; /*!< Whether to time out a three-way dial tone to silence */
unsigned int transfer:1; unsigned int transfer:1;
unsigned int transfertobusy:1; /*!< allow flash-transfers to busy channels */ unsigned int transfertobusy:1; /*!< allow flash-transfers to busy channels */
unsigned int use_callerid:1; /*!< Whether or not to use caller id on this channel */ unsigned int use_callerid:1; /*!< Whether or not to use caller id on this channel */

@ -759,6 +759,14 @@ callwaitingcallerid=yes
; ;
threewaycalling=yes threewaycalling=yes
; ;
; By default, the three-way dial tone never times out, allowing it to be
; used as a primitive "hold" mechanism. However, if you'd prefer
; to have the dial tone time out to silence, you can use this option
; to time out after the normal first digit timeout to silence.
; Default is 'no'.
;
;threewaysilenthold=no
;
; For FXS ports (either direct analog or over T1/E1): ; For FXS ports (either direct analog or over T1/E1):
; Support flash-hook call transfer (requires three way calling) ; Support flash-hook call transfer (requires three way calling)
; Also enables call parking (overrides the 'canpark' parameter) ; Also enables call parking (overrides the 'canpark' parameter)

Loading…
Cancel
Save