diff options
author | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-03-05 22:32:10 +0000 |
---|---|---|
committer | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-03-05 22:32:10 +0000 |
commit | 277beb94a0f5aa85eeb0603f6d11319cce02c3cd (patch) | |
tree | 32a4e75de52a4d00eb32bb5917c271f775d0743e | |
parent | 1de0d5b8308435068cf5a04314bfd98cc712c8ee (diff) |
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/branches/1.4@106235 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | apps/app_dial.c | 8 | ||||
-rw-r--r-- | apps/app_followme.c | 4 | ||||
-rw-r--r-- | channels/chan_alsa.c | 54 | ||||
-rw-r--r-- | channels/chan_h323.c | 4 | ||||
-rw-r--r-- | channels/chan_mgcp.c | 3 | ||||
-rw-r--r-- | channels/chan_oss.c | 47 | ||||
-rw-r--r-- | channels/chan_phone.c | 27 | ||||
-rw-r--r-- | channels/chan_sip.c | 4 | ||||
-rw-r--r-- | channels/chan_skinny.c | 3 | ||||
-rw-r--r-- | channels/chan_zap.c | 3 | ||||
-rw-r--r-- | include/asterisk/frame.h | 2 | ||||
-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 |
15 files changed, 117 insertions, 65 deletions
diff --git a/apps/app_dial.c b/apps/app_dial.c index 4cf7153cb..2465bfc1d 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -635,6 +635,11 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct dial_l ast_verbose (VERBOSE_PREFIX_3 "%s requested a video update, passing it to %s\n", c->name, in->name); ast_indicate(in, 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", c->name, in->name); + ast_indicate(in, AST_CONTROL_SRCUPDATE); + break; case AST_CONTROL_PROCEEDING: if (option_verbose > 2) ast_verbose (VERBOSE_PREFIX_3 "%s is proceeding passing it to %s\n", c->name, in->name); @@ -745,7 +750,8 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct dial_l if (single && (f->frametype == AST_FRAME_CONTROL) && ((f->subclass == AST_CONTROL_HOLD) || (f->subclass == AST_CONTROL_UNHOLD) || - (f->subclass == AST_CONTROL_VIDUPDATE))) { + (f->subclass == AST_CONTROL_VIDUPDATE) || + (f->subclass == AST_CONTROL_SRCUPDATE))) { if (option_verbose > 2) ast_verbose(VERBOSE_PREFIX_3 "%s requested special control %d, passing it to %s\n", in->name, f->subclass, outgoing->chan->name); ast_indicate_data(outgoing->chan, f->subclass, f->data, f->datalen); diff --git a/apps/app_followme.c b/apps/app_followme.c index cd79cc308..78f5c70cf 100644 --- a/apps/app_followme.c +++ b/apps/app_followme.c @@ -673,6 +673,10 @@ static struct ast_channel *wait_for_winner(struct findme_user_listptr *findme_us if (option_verbose > 2) ast_verbose ( VERBOSE_PREFIX_3 "%s requested a video update, passing it to %s\n", winner->name, caller->name); break; + case AST_CONTROL_SRCUPDATE: + if (option_verbose > 2) + ast_verbose ( VERBOSE_PREFIX_3 "%s requested a source update, passing it to %s\n", winner->name, caller->name); + break; case AST_CONTROL_PROCEEDING: if (option_verbose > 2) ast_verbose ( VERBOSE_PREFIX_3 "%s is proceeding passing it to %s\n", winner->name,caller->name); diff --git a/channels/chan_alsa.c b/channels/chan_alsa.c index 79bc313cd..9a416837b 100644 --- a/channels/chan_alsa.c +++ b/channels/chan_alsa.c @@ -743,32 +743,34 @@ static int alsa_indicate(struct ast_channel *chan, int cond, const void *data, s ast_mutex_lock(&alsalock); switch (cond) { - case AST_CONTROL_BUSY: - res = 1; - break; - case AST_CONTROL_CONGESTION: - res = 2; - break; - case AST_CONTROL_RINGING: - case AST_CONTROL_PROGRESS: - break; - case -1: - res = -1; - break; - case AST_CONTROL_VIDUPDATE: - res = -1; - break; - case AST_CONTROL_HOLD: - ast_verbose(" << Console Has Been Placed on Hold >> \n"); - ast_moh_start(chan, data, mohinterpret); - break; - case AST_CONTROL_UNHOLD: - ast_verbose(" << Console Has Been Retrieved from Hold >> \n"); - ast_moh_stop(chan); - break; - default: - ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n", cond, chan->name); - res = -1; + case AST_CONTROL_BUSY: + res = 1; + break; + case AST_CONTROL_CONGESTION: + res = 2; + break; + case AST_CONTROL_RINGING: + case AST_CONTROL_PROGRESS: + break; + case -1: + res = -1; + break; + case AST_CONTROL_VIDUPDATE: + res = -1; + break; + case AST_CONTROL_HOLD: + ast_verbose(" << Console Has Been Placed on Hold >> \n"); + ast_moh_start(chan, data, mohinterpret); + break; + case AST_CONTROL_UNHOLD: + ast_verbose(" << Console Has Been Retrieved from Hold >> \n"); + ast_moh_stop(chan); + break; + case AST_CONTROL_SRCUPDATE: + break; + default: + ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n", cond, chan->name); + res = -1; } if (res > -1) diff --git a/channels/chan_h323.c b/channels/chan_h323.c index fb0d8315f..57dbf8065 100644 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -915,6 +915,10 @@ static int oh323_indicate(struct ast_channel *c, int condition, const void *data ast_moh_stop(c); res = 0; break; + case AST_CONTROL_SRCUPDATE: + ast_rtp_new_source(pvt->rtp); + res = 0; + break; case AST_CONTROL_PROCEEDING: case -1: break; diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c index 353877285..bd57e54f3 100644 --- a/channels/chan_mgcp.c +++ b/channels/chan_mgcp.c @@ -1445,6 +1445,9 @@ static int mgcp_indicate(struct ast_channel *ast, int ind, const void *data, siz case AST_CONTROL_UNHOLD: ast_moh_stop(ast); break; + case AST_CONTROL_SRCUPDATE: + ast_rtp_new_source(sub->rtp); + break; case -1: transmit_notify_request(sub, ""); break; diff --git a/channels/chan_oss.c b/channels/chan_oss.c index 7b3c88751..0820c4b7f 100644 --- a/channels/chan_oss.c +++ b/channels/chan_oss.c @@ -951,32 +951,33 @@ static int oss_indicate(struct ast_channel *c, int cond, const void *data, size_ int res = -1; switch (cond) { - case AST_CONTROL_BUSY: - case AST_CONTROL_CONGESTION: - case AST_CONTROL_RINGING: + case AST_CONTROL_BUSY: + case AST_CONTROL_CONGESTION: + case AST_CONTROL_RINGING: res = cond; break; - - case -1: - o->cursound = -1; - o->nosound = 0; /* when cursound is -1 nosound must be 0 */ - return 0; - - case AST_CONTROL_VIDUPDATE: - res = -1; - break; - case AST_CONTROL_HOLD: - ast_verbose(" << Console Has Been Placed on Hold >> \n"); - ast_moh_start(c, data, o->mohinterpret); - break; - case AST_CONTROL_UNHOLD: - ast_verbose(" << Console Has Been Retrieved from Hold >> \n"); - ast_moh_stop(c); + + case -1: + o->cursound = -1; + o->nosound = 0; /* when cursound is -1 nosound must be 0 */ + return 0; + + case AST_CONTROL_VIDUPDATE: + res = -1; + break; + case AST_CONTROL_HOLD: + ast_verbose(" << Console Has Been Placed on Hold >> \n"); + ast_moh_start(c, data, o->mohinterpret); break; - - default: - ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n", cond, c->name); - return -1; + case AST_CONTROL_UNHOLD: + ast_verbose(" << Console Has Been Retrieved from Hold >> \n"); + ast_moh_stop(c); + break; + case AST_CONTROL_SRCUPDATE: + break; + default: + ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n", cond, c->name); + return -1; } if (res > -1) diff --git a/channels/chan_phone.c b/channels/chan_phone.c index ad34d2329..b551b1cba 100644 --- a/channels/chan_phone.c +++ b/channels/chan_phone.c @@ -213,21 +213,24 @@ static int phone_indicate(struct ast_channel *chan, int condition, const void *d int res=-1; ast_log(LOG_DEBUG, "Requested indication %d on channel %s\n", condition, chan->name); switch(condition) { - case AST_CONTROL_FLASH: - ioctl(p->fd, IXJCTL_PSTN_SET_STATE, PSTN_ON_HOOK); - usleep(320000); - ioctl(p->fd, IXJCTL_PSTN_SET_STATE, PSTN_OFF_HOOK); + case AST_CONTROL_FLASH: + ioctl(p->fd, IXJCTL_PSTN_SET_STATE, PSTN_ON_HOOK); + usleep(320000); + ioctl(p->fd, IXJCTL_PSTN_SET_STATE, PSTN_OFF_HOOK); p->lastformat = -1; res = 0; break; - case AST_CONTROL_HOLD: - ast_moh_start(chan, data, NULL); - break; - case AST_CONTROL_UNHOLD: - ast_moh_stop(chan); - break; - default: - ast_log(LOG_WARNING, "Condition %d is not supported on channel %s\n", condition, chan->name); + case AST_CONTROL_HOLD: + ast_moh_start(chan, data, NULL); + break; + case AST_CONTROL_UNHOLD: + ast_moh_stop(chan); + break; + case AST_CONTROL_SRCUPDATE: + res = 0; + break; + default: + ast_log(LOG_WARNING, "Condition %d is not supported on channel %s\n", condition, chan->name); } return res; } diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 48dc39e4a..fe1f4bc3b 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -3663,7 +3663,6 @@ static int sip_answer(struct ast_channel *ast) ast_log(LOG_DEBUG,"T38State change to %d on channel %s\n", p->t38.state, ast->name); res = transmit_response_with_t38_sdp(p, "200 OK", &p->initreq, XMIT_CRITICAL); } else { - ast_rtp_new_source(p->rtp); res = transmit_response_with_sdp(p, "200 OK", &p->initreq, XMIT_CRITICAL); } } @@ -3938,6 +3937,9 @@ static int sip_indicate(struct ast_channel *ast, int condition, const void *data } else res = -1; break; + case AST_CONTROL_SRCUPDATE: + ast_rtp_new_source(p->rtp); + break; case -1: res = -1; break; diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index c712e3d94..2e160c865 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -2794,6 +2794,9 @@ static int skinny_indicate(struct ast_channel *ast, int ind, const void *data, s break; case AST_CONTROL_PROCEEDING: break; + case AST_CONTROL_SRCUPDATE: + ast_rtp_new_source(sub->rtp); + break; default: ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", ind); return -1; diff --git a/channels/chan_zap.c b/channels/chan_zap.c index 42757fb5c..0c33f6286 100644 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -5186,6 +5186,9 @@ static int zt_indicate(struct ast_channel *chan, int condition, const void *data } else res = 0; break; + case AST_CONTROL_SRCUPDATE: + res = 0; + break; case -1: res = tone_zone_play_tone(p->subs[index].zfd, -1); break; diff --git a/include/asterisk/frame.h b/include/asterisk/frame.h index 3f1543028..9165b34e8 100644 --- a/include/asterisk/frame.h +++ b/include/asterisk/frame.h @@ -85,6 +85,7 @@ struct ast_codec_pref { \arg \b HOLD Call is placed on hold \arg \b UNHOLD Call is back from hold \arg \b VIDUPDATE Video update requested + \arg \b SRCUPDATE The source of media has changed */ @@ -290,6 +291,7 @@ enum ast_control_frame_type { AST_CONTROL_HOLD = 16, /*!< Indicate call is placed on hold */ AST_CONTROL_UNHOLD = 17, /*!< Indicate call is left from hold */ AST_CONTROL_VIDUPDATE = 18, /*!< Indicate video frame update */ + AST_CONTROL_SRCUPDATE = 20, /*!< Indicate source of media has changed */ }; #define AST_SMOOTHER_FLAG_G729 (1 << 0) diff --git a/main/channel.c b/main/channel.c index 16881a3d5..73c7db603 100644 --- a/main/channel.c +++ b/main/channel.c @@ -2372,6 +2372,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); @@ -2890,6 +2892,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; @@ -3774,6 +3777,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: @@ -3907,6 +3911,10 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha if (!c1->tech->send_digit_begin) ast_set_flag(c0, AST_FLAG_END_DTMF_ONLY); + /* 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; @@ -4070,6 +4078,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 807ba12c3..e96e776de 100644 --- a/main/dial.c +++ b/main/dial.c @@ -358,6 +358,10 @@ static void handle_frame(struct ast_dial *dial, struct ast_dial_channel *channel ast_verbose (VERBOSE_PREFIX_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: if (option_verbose > 2) ast_verbose (VERBOSE_PREFIX_3 "%s is proceeding, passing it to %s\n", channel->owner->name, chan->name); diff --git a/main/file.c b/main/file.c index c1ff4c39a..809eb43c0 100644 --- a/main/file.c +++ b/main/file.c @@ -1159,6 +1159,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 6578c400e..b5864f916 100644 --- a/main/rtp.c +++ b/main/rtp.c @@ -2968,7 +2968,8 @@ static enum ast_bridge_result bridge_native_loop(struct ast_channel *c0, struct } else if ((fr->frametype == AST_FRAME_CONTROL) && !(flags & AST_BRIDGE_IGNORE_SIGS)) { if ((fr->subclass == AST_CONTROL_HOLD) || (fr->subclass == AST_CONTROL_UNHOLD) || - (fr->subclass == AST_CONTROL_VIDUPDATE)) { + (fr->subclass == AST_CONTROL_VIDUPDATE) || + (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) @@ -3199,7 +3200,8 @@ static enum ast_bridge_result bridge_p2p_loop(struct ast_channel *c0, struct ast } else if ((fr->frametype == AST_FRAME_CONTROL) && !(flags & AST_BRIDGE_IGNORE_SIGS)) { if ((fr->subclass == AST_CONTROL_HOLD) || (fr->subclass == AST_CONTROL_UNHOLD) || - (fr->subclass == AST_CONTROL_VIDUPDATE)) { + (fr->subclass == AST_CONTROL_VIDUPDATE) || + (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) |