aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--channels/chan_local.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/channels/chan_local.c b/channels/chan_local.c
index b39aeccd1..410151f1a 100644
--- a/channels/chan_local.c
+++ b/channels/chan_local.c
@@ -212,6 +212,38 @@ static int local_queue_frame(struct local_pvt *p, int isoutbound, struct ast_fra
}
if (other) {
+ if (f->frametype == AST_FRAME_CONTROL) {
+ switch (f->subclass) {
+ case AST_CONTROL_RINGING:
+ ast_setstate(other, AST_STATE_RINGING);
+ break;
+ case AST_CONTROL_ANSWER:
+ ast_setstate(other, AST_STATE_UP);
+ break;
+ case AST_CONTROL_BUSY:
+ ast_setstate(other, AST_STATE_BUSY);
+ break;
+
+ /* not going to handle these */
+ case AST_CONTROL_HANGUP:
+ case AST_CONTROL_RING:
+ case AST_CONTROL_TAKEOFFHOOK:
+ case AST_CONTROL_OFFHOOK:
+ case AST_CONTROL_CONGESTION:
+ case AST_CONTROL_FLASH:
+ case AST_CONTROL_WINK:
+ case AST_CONTROL_OPTION:
+ case AST_CONTROL_RADIO_KEY:
+ case AST_CONTROL_RADIO_UNKEY:
+ case AST_CONTROL_PROGRESS:
+ case AST_CONTROL_PROCEEDING:
+ case AST_CONTROL_HOLD:
+ case AST_CONTROL_UNHOLD:
+ case AST_CONTROL_VIDUPDATE:
+ case AST_CONTROL_SRCUPDATE:
+ break;
+ }
+ }
ast_queue_frame(other, f);
ast_channel_unlock(other);
}