int isoutbound;
ao2_lock(p);
- if (ast_test_flag(p, AST_UNREAL_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, AST_UNREAL_NO_OPTIMIZATION)) {
struct ast_frame f = {
.frametype = AST_FRAME_CONTROL,
.subclass.integer = condition,
}
res = unreal_queue_indicate(p, ast, condition, data, datalen);
break;
+ case AST_CONTROL_RINGING:
+ /* 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.
+ */
+ if (ast_channel_state(ast) == AST_STATE_RING) {
+ res = unreal_queue_indicate(p, ast, condition, data, datalen);
+ } else {
+ res = -1;
+ }
+ break;
default:
res = unreal_queue_indicate(p, ast, condition, data, datalen);
break;