diff options
author | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-03-05 22:43:22 +0000 |
---|---|---|
committer | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-03-05 22:43:22 +0000 |
commit | f6b76699b7ba5d7c9d259a918c6e0f14aa4ec00c (patch) | |
tree | a996e649bf519c5eb10d31e1e353e551a9fca363 /main | |
parent | 24c93cfe5699ead70df4459e18cae25636245f0b (diff) |
Merged revisions 106235 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r106235 | file | 2008-03-05 18:32:10 -0400 (Wed, 05 Mar 2008) | 4 lines
Add a control frame to indicate the source of media has changed. Depending on the underlying technology it may need to change some things.
(closes issue #12148)
Reported by: jcomellas
........
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@106239 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r-- | main/channel.c | 12 | ||||
-rw-r--r-- | main/dial.c | 4 | ||||
-rw-r--r-- | main/file.c | 1 | ||||
-rw-r--r-- | main/rtp.c | 6 |
4 files changed, 21 insertions, 2 deletions
diff --git a/main/channel.c b/main/channel.c index ecb12ac57..3c68a71b7 100644 --- a/main/channel.c +++ b/main/channel.c @@ -2745,6 +2745,8 @@ int ast_indicate_data(struct ast_channel *chan, int condition, const void *data, /* Do nothing.... */ } else if (condition == AST_CONTROL_VIDUPDATE) { /* Do nothing.... */ + } else if (condition == AST_CONTROL_SRCUPDATE) { + /* Do nothing... */ } else { /* not handled */ ast_log(LOG_WARNING, "Unable to handle indication %d for '%s'\n", condition, chan->name); @@ -3272,6 +3274,7 @@ struct ast_channel *__ast_request_and_dial(const char *type, int format, void *d case AST_CONTROL_HOLD: case AST_CONTROL_UNHOLD: case AST_CONTROL_VIDUPDATE: + case AST_CONTROL_SRCUPDATE: case -1: /* Ignore -- just stopping indications */ break; @@ -4156,6 +4159,7 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct case AST_CONTROL_HOLD: case AST_CONTROL_UNHOLD: case AST_CONTROL_VIDUPDATE: + case AST_CONTROL_SRCUPDATE: ast_indicate_data(other, f->subclass, f->data, f->datalen); break; default: @@ -4318,6 +4322,10 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha ast_set_flag(c0, AST_FLAG_END_DTMF_ONLY); manager_bridge_event(1, 1, c0, c1); + /* Before we enter in and bridge these two together tell them both the source of audio has changed */ + ast_indicate(c0, AST_CONTROL_SRCUPDATE); + ast_indicate(c1, AST_CONTROL_SRCUPDATE); + for (/* ever */;;) { struct timeval now = { 0, }; int to; @@ -4470,6 +4478,10 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha ast_clear_flag(c0, AST_FLAG_END_DTMF_ONLY); ast_clear_flag(c1, AST_FLAG_END_DTMF_ONLY); + /* Now that we have broken the bridge the source will change yet again */ + ast_indicate(c0, AST_CONTROL_SRCUPDATE); + ast_indicate(c1, AST_CONTROL_SRCUPDATE); + c0->_bridge = NULL; c1->_bridge = NULL; diff --git a/main/dial.c b/main/dial.c index 22472a89e..688382fb8 100644 --- a/main/dial.c +++ b/main/dial.c @@ -422,6 +422,10 @@ static void handle_frame(struct ast_dial *dial, struct ast_dial_channel *channel ast_verb(3, "%s requested a video update, passing it to %s\n", channel->owner->name, chan->name); ast_indicate(chan, AST_CONTROL_VIDUPDATE); break; + case AST_CONTROL_SRCUPDATE: + if (option_verbose > 2) + ast_verbose (VERBOSE_PREFIX_3 "%s requested a source update, passing it to %s\n", channel->owner->name, chan->name); + ast_indicate(chan, AST_CONTROL_SRCUPDATE); case AST_CONTROL_PROCEEDING: ast_verb(3, "%s is proceeding, passing it to %s\n", channel->owner->name, chan->name); ast_indicate(chan, AST_CONTROL_PROCEEDING); diff --git a/main/file.c b/main/file.c index c16f25112..16fe39e77 100644 --- a/main/file.c +++ b/main/file.c @@ -1136,6 +1136,7 @@ static int waitstream_core(struct ast_channel *c, const char *breakon, case AST_CONTROL_RINGING: case AST_CONTROL_ANSWER: case AST_CONTROL_VIDUPDATE: + case AST_CONTROL_SRCUPDATE: case AST_CONTROL_HOLD: case AST_CONTROL_UNHOLD: /* Unimportant */ diff --git a/main/rtp.c b/main/rtp.c index 5be0586c6..433fa2c79 100644 --- a/main/rtp.c +++ b/main/rtp.c @@ -3376,7 +3376,8 @@ static enum ast_bridge_result bridge_native_loop(struct ast_channel *c0, struct if ((fr->subclass == AST_CONTROL_HOLD) || (fr->subclass == AST_CONTROL_UNHOLD) || (fr->subclass == AST_CONTROL_VIDUPDATE) || - (fr->subclass == AST_CONTROL_T38)) { + (fr->subclass == AST_CONTROL_T38) || + (fr->subclass == AST_CONTROL_SRCUPDATE)) { if (fr->subclass == AST_CONTROL_HOLD) { /* If we someone went on hold we want the other side to reinvite back to us */ if (who == c0) @@ -3615,7 +3616,8 @@ static enum ast_bridge_result bridge_p2p_loop(struct ast_channel *c0, struct ast if ((fr->subclass == AST_CONTROL_HOLD) || (fr->subclass == AST_CONTROL_UNHOLD) || (fr->subclass == AST_CONTROL_VIDUPDATE) || - (fr->subclass == AST_CONTROL_T38)) { + (fr->subclass == AST_CONTROL_T38) || + (fr->subclass == AST_CONTROL_SRCUPDATE)) { /* If we are going on hold, then break callback mode and P2P bridging */ if (fr->subclass == AST_CONTROL_HOLD) { if (p0_callback) |