From 1b1917f4b3e3dca56aceffe4b955a6a7bb5ee18b Mon Sep 17 00:00:00 2001 From: Mark Spencer <markster@digium.com> Date: Thu, 14 Aug 2003 19:18:18 +0000 Subject: [PATCH] Preserve queued frames git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1328 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channel.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/channel.c b/channel.c index 3fe2a02d77..5cc58d0f9a 100755 --- a/channel.c +++ b/channel.c @@ -1834,10 +1834,11 @@ void ast_change_name(struct ast_channel *chan, char *newname) static int ast_do_masquerade(struct ast_channel *original) { - int x; + int x,i; int res=0; char *tmp; void *tmpv; + struct ast_frame *cur, *prev; struct ast_channel_pvt *p; struct ast_channel *clone = original->masq; int rformat = original->readformat; @@ -1892,7 +1893,28 @@ static int ast_do_masquerade(struct ast_channel *original) p = original->pvt; original->pvt = clone->pvt; clone->pvt = p; - + + /* Save any pending frames on both sides. Start by counting + * how many we're going to need... */ + prev = NULL; + cur = clone->pvt->readq; + x = 0; + while(cur) { + x++; + prev = cur; + cur = cur->next; + } + /* If we had any, prepend them to the ones already in the queue, and + * load up the alertpipe */ + if (prev) { + prev->next = original->pvt->readq; + original->pvt->readq = clone->pvt->readq; + clone->pvt->readq = NULL; + if (original->pvt->alertpipe[1] > -1) { + for (i=0;i<x;i++) + write(original->pvt->alertpipe[1], &x, sizeof(x)); + } + } clone->_softhangup = AST_SOFTHANGUP_DEV; -- GitLab