Fix chan_dahdi option ringtimeout

dahdi_read relies on the dahdi_pvt copy of ringt which was not getting set
in sig_analog. This patch adds a callback to do so.

(closes issue #15288)
Reported by: alecdavis
Patches:
      chan_dahdi.ringtimeout.diff.txt uploaded by alecdavis (license 585)
Tested by: alecdavis



git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@211908 65c4cc65-6c06-0410-ace0-fbb531ad65f3
certified/1.8.6
Jeff Peeler 16 years ago
parent 56110dd4f1
commit b65c0edd52

@ -2049,6 +2049,12 @@ static void my_set_dialing(void *pvt, int flag)
p->dialing = flag; p->dialing = flag;
} }
static void my_set_ringtimeout(void *pvt, int ringt)
{
struct dahdi_pvt *p = pvt;
p->ringt = ringt;
}
static void my_increase_ss_count(void) static void my_increase_ss_count(void)
{ {
ast_mutex_lock(&ss_thread_lock); ast_mutex_lock(&ss_thread_lock);
@ -2772,6 +2778,7 @@ static struct analog_callback dahdi_analog_callbacks =
.get_sub_fd = my_get_sub_fd, .get_sub_fd = my_get_sub_fd,
.set_cadence = my_set_cadence, .set_cadence = my_set_cadence,
.set_dialing = my_set_dialing, .set_dialing = my_set_dialing,
.set_ringtimeout = my_set_ringtimeout,
}; };
static struct dahdi_pvt *round_robin[32]; static struct dahdi_pvt *round_robin[32];

@ -707,6 +707,15 @@ static void analog_set_dialing(struct analog_pvt *p, int flag)
} }
} }
static void analog_set_ringtimeout(struct analog_pvt *p, int ringt)
{
p->ringt = ringt;
if (!p->calls->set_ringtimeout) {
return;
}
p->calls->set_ringtimeout(p->chan_pvt, ringt);
}
int analog_call(struct analog_pvt *p, struct ast_channel *ast, char *rdest, int timeout) int analog_call(struct analog_pvt *p, struct ast_channel *ast, char *rdest, int timeout)
{ {
int res, index,mysig; int res, index,mysig;
@ -1060,7 +1069,7 @@ int analog_hangup(struct analog_pvt *p, struct ast_channel *ast)
if (!p->subs[ANALOG_SUB_REAL].owner && !p->subs[ANALOG_SUB_CALLWAIT].owner && !p->subs[ANALOG_SUB_THREEWAY].owner) { if (!p->subs[ANALOG_SUB_REAL].owner && !p->subs[ANALOG_SUB_CALLWAIT].owner && !p->subs[ANALOG_SUB_THREEWAY].owner) {
p->owner = NULL; p->owner = NULL;
p->ringt = 0; analog_set_ringtimeout(p, 0);
p->outgoing = 0; p->outgoing = 0;
p->onhooktime = time(NULL); p->onhooktime = time(NULL);
p->cidrings = 1; p->cidrings = 1;
@ -1130,7 +1139,7 @@ int analog_answer(struct analog_pvt *p, struct ast_channel *ast)
case ANALOG_SIG_FXSLS: case ANALOG_SIG_FXSLS:
case ANALOG_SIG_FXSGS: case ANALOG_SIG_FXSGS:
case ANALOG_SIG_FXSKS: case ANALOG_SIG_FXSKS:
p->ringt = 0; analog_set_ringtimeout(p, 0);
/* Fall through */ /* Fall through */
case ANALOG_SIG_EM: case ANALOG_SIG_EM:
case ANALOG_SIG_EM_E1: case ANALOG_SIG_EM_E1:
@ -2093,7 +2102,7 @@ static void *__analog_ss_thread(void *data)
ast_setstate(chan, AST_STATE_RING); ast_setstate(chan, AST_STATE_RING);
chan->rings = 1; chan->rings = 1;
p->ringt = p->ringt_base; analog_set_ringtimeout(p, p->ringt_base);
res = ast_pbx_run(chan); res = ast_pbx_run(chan);
if (res) { if (res) {
ast_hangup(chan); ast_hangup(chan);
@ -2413,7 +2422,7 @@ static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_
case ANALOG_SIG_FXSGS: case ANALOG_SIG_FXSGS:
case ANALOG_SIG_FXSKS: case ANALOG_SIG_FXSKS:
if (ast->_state == AST_STATE_RING) { if (ast->_state == AST_STATE_RING) {
p->ringt = p->ringt_base; analog_set_ringtimeout(p, p->ringt_base);
} }
/* Fall through */ /* Fall through */
@ -2457,7 +2466,7 @@ static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_
case ANALOG_SIG_FXSGS: case ANALOG_SIG_FXSGS:
case ANALOG_SIG_FXSKS: case ANALOG_SIG_FXSKS:
if (ast->_state == AST_STATE_RING) { if (ast->_state == AST_STATE_RING) {
p->ringt = p->ringt_base; analog_set_ringtimeout(p, p->ringt_base);
} }
break; break;
} }
@ -3007,7 +3016,7 @@ int analog_handle_init_event(struct analog_pvt *i, int event)
case ANALOG_SIG_FXSLS: case ANALOG_SIG_FXSLS:
case ANALOG_SIG_FXSGS: case ANALOG_SIG_FXSGS:
case ANALOG_SIG_FXSKS: case ANALOG_SIG_FXSKS:
i->ringt = i->ringt_base; analog_set_ringtimeout(i, i->ringt_base);
/* Fall through */ /* Fall through */
case ANALOG_SIG_EMWINK: case ANALOG_SIG_EMWINK:
case ANALOG_SIG_FEATD: case ANALOG_SIG_FEATD:

@ -193,6 +193,7 @@ struct analog_callback {
int (* const get_sub_fd)(void *pvt, enum analog_sub sub); int (* const get_sub_fd)(void *pvt, enum analog_sub sub);
void (* const set_cadence)(void *pvt, int *cidrings, struct ast_channel *chan); void (* const set_cadence)(void *pvt, int *cidrings, struct ast_channel *chan);
void (* const set_dialing)(void *pvt, int flag); void (* const set_dialing)(void *pvt, int flag);
void (* const set_ringtimeout)(void *pvt, int ringt);
}; };

Loading…
Cancel
Save