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
This commit is contained in:
parent
24c93cfe56
commit
f6b76699b7
|
@ -717,6 +717,10 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
|
|||
ast_verb(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:
|
||||
ast_verb(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:
|
||||
ast_verb(3, "%s is proceeding passing it to %s\n", c->name, in->name);
|
||||
if (single && CAN_EARLY_BRIDGE(peerflags))
|
||||
|
@ -820,7 +824,8 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
|
|||
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))) {
|
||||
ast_verb(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);
|
||||
}
|
||||
|
|
|
@ -656,6 +656,9 @@ static struct ast_channel *wait_for_winner(struct findme_user_listptr *findme_us
|
|||
case AST_CONTROL_VIDUPDATE:
|
||||
ast_verb(3, "%s requested a video update, passing it to %s\n", winner->name, caller->name);
|
||||
break;
|
||||
case AST_CONTROL_SRCUPDATE:
|
||||
ast_verb(3, "%s requested a source update, passing it to %s\n", winner->name, caller->name);
|
||||
break;
|
||||
case AST_CONTROL_PROCEEDING:
|
||||
ast_verb(3, "%s is proceeding passing it to %s\n", winner->name,caller->name);
|
||||
break;
|
||||
|
|
|
@ -510,6 +510,7 @@ static int alsa_indicate(struct ast_channel *chan, int cond, const void *data, s
|
|||
case AST_CONTROL_PROGRESS:
|
||||
case AST_CONTROL_PROCEEDING:
|
||||
case AST_CONTROL_VIDUPDATE:
|
||||
case AST_CONTROL_SRCUPDATE:
|
||||
break;
|
||||
case AST_CONTROL_HOLD:
|
||||
ast_verbose(" << Console Has Been Placed on Hold >> \n");
|
||||
|
|
|
@ -610,6 +610,7 @@ static int console_indicate(struct ast_channel *chan, int cond, const void *data
|
|||
case AST_CONTROL_PROGRESS:
|
||||
case AST_CONTROL_PROCEEDING:
|
||||
case AST_CONTROL_VIDUPDATE:
|
||||
case AST_CONTROL_SRCUPDATE:
|
||||
break;
|
||||
case AST_CONTROL_HOLD:
|
||||
ast_verb(1, V_BEGIN "Console Has Been Placed on Hold" V_END);
|
||||
|
|
|
@ -914,6 +914,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;
|
||||
|
|
|
@ -1479,6 +1479,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;
|
||||
|
|
|
@ -764,6 +764,7 @@ static int oss_indicate(struct ast_channel *c, int cond, const void *data, size_
|
|||
case AST_CONTROL_PROGRESS:
|
||||
case AST_CONTROL_PROCEEDING:
|
||||
case AST_CONTROL_VIDUPDATE:
|
||||
case AST_CONTROL_SRCUPDATE:
|
||||
break;
|
||||
case AST_CONTROL_HOLD:
|
||||
ast_verbose(" << Console Has Been Placed on Hold >> \n");
|
||||
|
|
|
@ -206,21 +206,24 @@ static int phone_indicate(struct ast_channel *chan, int condition, const void *d
|
|||
int res=-1;
|
||||
ast_debug(1, "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;
|
||||
}
|
||||
|
|
|
@ -5140,6 +5140,9 @@ static int sip_indicate(struct ast_channel *ast, int condition, const void *data
|
|||
}
|
||||
}
|
||||
break;
|
||||
case AST_CONTROL_SRCUPDATE:
|
||||
ast_rtp_new_source(p->rtp);
|
||||
break;
|
||||
case -1:
|
||||
res = -1;
|
||||
break;
|
||||
|
|
|
@ -3650,6 +3650,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;
|
||||
|
|
|
@ -4117,6 +4117,7 @@ static int unistim_indicate(struct ast_channel *ast, int ind, const void *data,
|
|||
ast_moh_stop(ast);
|
||||
break;
|
||||
case AST_CONTROL_PROGRESS:
|
||||
case AST_CONTROL_SRCUPDATE:
|
||||
break;
|
||||
case -1:
|
||||
ast_playtones_stop(ast);
|
||||
|
|
|
@ -5813,6 +5813,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;
|
||||
|
|
|
@ -83,6 +83,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
|
||||
|
||||
*/
|
||||
|
||||
|
@ -292,7 +293,8 @@ 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_T38 = 19 /*!< T38 state change request/notification */
|
||||
AST_CONTROL_T38 = 19, /*!< T38 state change request/notification */
|
||||
AST_CONTROL_SRCUPDATE = 20, /*!< Indicate source of media has changed */
|
||||
};
|
||||
|
||||
enum ast_control_t38 {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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)
|
||||
|
|
Reference in New Issue