diff --git a/apps/app_queue.c b/apps/app_queue.c index 855615e4e5..d31636703d 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -3801,6 +3801,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte } return NULL; } + if ((f->frametype == AST_FRAME_DTMF) && caller_disconnect && (f->subclass.integer == '*')) { ast_verb(3, "User hit %c to disconnect call.\n", f->subclass.integer); *to = 0; @@ -3814,6 +3815,38 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte ast_frfree(f); return NULL; } + + /* Send the frame from the in channel to all outgoing channels. */ + for (o = start; o; o = o->call_next) { + if (!o->stillgoing || !o->chan) { + /* This outgoing channel has died so don't send the frame to it. */ + continue; + } + switch (f->frametype) { + case AST_FRAME_CONTROL: + switch (f->subclass.integer) { + case AST_CONTROL_CONNECTED_LINE: + if (ast_channel_connected_line_macro(in, o->chan, f, 0, 1)) { + ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen); + } + break; + case AST_CONTROL_REDIRECTING: + if (ast_channel_redirecting_macro(in, o->chan, f, 0, 1)) { + ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen); + } + break; + default: + /* We are not going to do anything with this frame. */ + goto skip_frame; + } + break; + default: + /* We are not going to do anything with this frame. */ + goto skip_frame; + } + } +skip_frame:; + ast_frfree(f); } if (!*to) {