diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 9e1436f443..cd3ea48760 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -1185,6 +1185,7 @@ static int gendigittimeout = 8000; /* How long to wait for an extra digit, if there is an ambiguous match */ static int matchdigittimeout = 3000; +#define SUBSTATE_UNSET 0 #define SUBSTATE_OFFHOOK 1 #define SUBSTATE_ONHOOK 2 #define SUBSTATE_RINGOUT 3 @@ -4706,6 +4707,8 @@ static void setsubstate_offhook(struct skinny_subchannel *sub) transmit_start_tone(d, SKINNY_DIALTONE, l->instance, sub->callid); transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_OFFHOOK); + sub->substate = SUBSTATE_OFFHOOK; + /* start the switch thread */ if (ast_pthread_create(&t, NULL, skinny_ss, sub->owner)) { ast_log(LOG_WARNING, "Unable to create switch thread: %s\n", strerror(errno)); @@ -5181,23 +5184,26 @@ static int handle_stimulus_message(struct skinny_req *req, struct skinnysession /* XXX determine the best way to pull off a conference. Meetme? */ break; case STIMULUS_VOICEMAIL: - if (skinnydebug) + if (skinnydebug) { ast_verb(1, "Received Stimulus: Voicemail(%d/%d)\n", instance, callreference); + } if (!sub || !sub->owner) { c = skinny_new(l, AST_STATE_DOWN, NULL, SKINNY_OUTGOING); } else { c = sub->owner; } + if (!c) { ast_log(LOG_WARNING, "Unable to create channel for %s@%s\n", l->name, d->name); - } else { - sub = c->tech_pvt; + break; + } + + sub = c->tech_pvt; + if (sub->substate == SUBSTATE_UNSET || sub->substate == SUBSTATE_OFFHOOK){ l = sub->line; l->activesub = sub; - setsubstate_dialing(sub,l->vmexten); - } break; case STIMULUS_CALLPARK: