From: Kevin P. Fleming Date: Tue, 1 Jul 2008 19:53:03 +0000 (+0000) Subject: change the process of inserting a delay into the ast_answer() path so that we don... X-Git-Tag: 1.6.2.0-beta1~1825 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8cdb1f7f416a232ba02ef90afd36189b723f04e7;p=thirdparty%2Fasterisk.git change the process of inserting a delay into the ast_answer() path so that we don't tell the calling channel that it has been answered unutil after the delay; for a single-thread call this won't matter all, but for a dual-thread call (using chan_local) this may fix the problem in issue 12924 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@127113 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/channel.c b/main/channel.c index a83c3c94dc..f94afd9cd1 100644 --- a/main/channel.c +++ b/main/channel.c @@ -1696,15 +1696,31 @@ int __ast_answer(struct ast_channel *chan, unsigned int delay) switch (chan->_state) { case AST_STATE_RINGING: case AST_STATE_RING: - if (chan->tech->answer) - res = chan->tech->answer(chan); - ast_setstate(chan, AST_STATE_UP); - ast_cdr_answer(chan->cdr); - ast_channel_unlock(chan); - if (delay) + if (delay) { + int needanswer = (chan->tech->answer != NULL); + + ast_setstate(chan, AST_STATE_UP); + ast_cdr_answer(chan->cdr); + ast_channel_unlock(chan); ast_safe_sleep(chan, delay); + /* don't tell the channel it has been answered until *after* the delay, + so that the media path will be in place and usable when it wants to + send media + */ + if (needanswer) { + ast_channel_lock(chan); + res = chan->tech->answer(chan); + ast_channel_unlock(chan); + } + } else { + if (chan->tech->answer) { + res = chan->tech->answer(chan); + } + ast_setstate(chan, AST_STATE_UP); + ast_cdr_answer(chan->cdr); + ast_channel_unlock(chan); + } return res; - break; case AST_STATE_UP: ast_cdr_answer(chan->cdr); break;