diff --git a/channels/chan_local.c b/channels/chan_local.c index 794bbae8b7185c04747fcc7d84062ce22daec9f8..562c181702b366bf97c1a705d7698d84b8c2a8ed 100644 --- a/channels/chan_local.c +++ b/channels/chan_local.c @@ -751,10 +751,22 @@ static int local_indicate(struct ast_channel *ast, int condition, const void *da res = local_queue_frame(p, isoutbound, &f, ast, 1); } ao2_unlock(p); + } else if (condition == AST_CONTROL_RINGING && ast_channel_state(ast) != AST_STATE_RING) { + /* Don't queue ringing frames if the channel is not in a "ring" state. Otherwise, + * the real channel on the other end will likely start a playtones generator. It is + * possible that this playtones generator will never be stopped under certain + * circumstances. + */ + res = -1; } else { /* Queue up a frame representing the indication as a control frame */ ao2_lock(p); - if (ast_test_flag(p, LOCAL_NO_OPTIMIZATION)) { + /* + * Block -1 stop tones events if we are to be optimized out. We + * don't need a flurry of these events on an unreal channel chain + * when initially connected to slow the optimization process. + */ + if (0 <= condition || ast_test_flag(p, LOCAL_NO_OPTIMIZATION)) { isoutbound = IS_OUTBOUND(ast, p); f.subclass.integer = condition; f.data.ptr = (void *) data;