aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_meetme.c
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-12-09 21:03:44 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-12-09 21:03:44 +0000
commit5c56d07705d9b9303d05ee3c3dedf167cc8128b3 (patch)
treef7c28dd34368b15c84d233f93f3369c1eadafd01 /apps/app_meetme.c
parent9b22c5078266129ac2b63bc80b62ea11dd6ed0f5 (diff)
Merged revisions 162291 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r162291 | russell | 2008-12-09 14:59:54 -0600 (Tue, 09 Dec 2008) | 17 lines Merged revisions 162286 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r162286 | russell | 2008-12-09 14:57:35 -0600 (Tue, 09 Dec 2008) | 9 lines Fix an issue where callers on an incoming call on an SLA trunk would not hear ringback. We need to make sure that we don't start writing audio to the trunk channel until we're actually ready to answer it. Otherwise, the channel driver will treat it as inband progress, even though all they are getting is silence. (closes issue #12471) Reported by: mthomasslo ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@162302 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_meetme.c')
-rw-r--r--apps/app_meetme.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/apps/app_meetme.c b/apps/app_meetme.c
index 787f73ecc..c6902ffa0 100644
--- a/apps/app_meetme.c
+++ b/apps/app_meetme.c
@@ -159,6 +159,8 @@ enum {
CONFFLAG_KICK_CONTINUE = (1 << 28),
CONFFLAG_DURATION_STOP = (1 << 29),
CONFFLAG_DURATION_LIMIT = (1 << 30),
+ /*! Do not write any audio to this channel until the state is up. */
+ CONFFLAG_NO_AUDIO_UNTIL_UP = (1 << 31),
};
enum {
@@ -1615,6 +1617,15 @@ static void *announce_thread(void *data)
return NULL;
}
+static int can_write(struct ast_channel *chan, int confflags)
+{
+ if (!(confflags & CONFFLAG_NO_AUDIO_UNTIL_UP)) {
+ return 1;
+ }
+
+ return (chan->_state == AST_STATE_UP);
+}
+
static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int confflags, char *optargs[])
{
struct ast_conf_user *user = NULL;
@@ -1964,7 +1975,10 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
}
}
- ast_indicate(chan, -1);
+ if (!(confflags & CONFFLAG_NO_AUDIO_UNTIL_UP)) {
+ /* We're leaving this alone until the state gets changed to up */
+ ast_indicate(chan, -1);
+ }
if (ast_set_write_format(chan, AST_FORMAT_SLINEAR) < 0) {
ast_log(LOG_WARNING, "Unable to set '%s' to write linear mode\n", chan->name);
@@ -2745,7 +2759,7 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
}
if (conf->transframe[idx]) {
if (conf->transframe[idx]->frametype != AST_FRAME_NULL) {
- if (ast_write(chan, conf->transframe[idx]))
+ if (can_write(chan, confflags) && ast_write(chan, conf->transframe[idx]))
ast_log(LOG_WARNING, "Unable to write frame to channel %s\n", chan->name);
}
} else {
@@ -2757,7 +2771,7 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
bailoutandtrynormal:
if (user->listen.actual)
ast_frame_adjust_volume(&fr, user->listen.actual);
- if (ast_write(chan, &fr) < 0) {
+ if (can_write(chan, confflags) && ast_write(chan, &fr) < 0) {
ast_log(LOG_WARNING, "Unable to write frame to channel %s\n", chan->name);
}
}
@@ -4062,6 +4076,12 @@ struct run_station_args {
ast_cond_t *cond;
};
+static void answer_trunk_chan(struct ast_channel *chan)
+{
+ ast_answer(chan);
+ ast_indicate(chan, -1);
+}
+
static void *run_station(void *data)
{
struct sla_station *station;
@@ -4084,7 +4104,7 @@ static void *run_station(void *data)
ast_str_set(&conf_name, 0, "SLA_%s", trunk_ref->trunk->name);
ast_set_flag(&conf_flags,
CONFFLAG_QUIET | CONFFLAG_MARKEDEXIT | CONFFLAG_PASS_DTMF | CONFFLAG_SLA_STATION);
- ast_answer(trunk_ref->chan);
+ answer_trunk_chan(trunk_ref->chan);
conf = build_conf(conf_name->str, "", "", 0, 0, 1, trunk_ref->chan);
if (conf) {
conf_run(trunk_ref->chan, conf, conf_flags.flags, NULL);
@@ -4256,7 +4276,7 @@ static void sla_handle_dial_state_event(void)
/* Track the channel that answered this trunk */
s_trunk_ref->chan = ast_dial_answered(ringing_station->station->dial);
/* Actually answer the trunk */
- ast_answer(ringing_trunk->trunk->chan);
+ answer_trunk_chan(ringing_trunk->trunk->chan);
sla_change_trunk_state(ringing_trunk->trunk, SLA_TRUNK_STATE_UP, ALL_TRUNK_REFS, NULL);
/* Now, start a thread that will connect this station to the trunk. The rest of
* the code here sets up the thread and ensures that it is able to save the arguments
@@ -5069,7 +5089,7 @@ static int sla_station_exec(struct ast_channel *chan, void *data)
ast_mutex_unlock(&sla.lock);
if (ringing_trunk) {
- ast_answer(ringing_trunk->trunk->chan);
+ answer_trunk_chan(ringing_trunk->trunk->chan);
sla_change_trunk_state(ringing_trunk->trunk, SLA_TRUNK_STATE_UP, ALL_TRUNK_REFS, NULL);
free(ringing_trunk);
@@ -5268,7 +5288,7 @@ static int sla_trunk_exec(struct ast_channel *chan, void *data)
return 0;
}
ast_set_flag(&conf_flags,
- CONFFLAG_QUIET | CONFFLAG_MARKEDEXIT | CONFFLAG_MARKEDUSER | CONFFLAG_PASS_DTMF);
+ CONFFLAG_QUIET | CONFFLAG_MARKEDEXIT | CONFFLAG_MARKEDUSER | CONFFLAG_PASS_DTMF | CONFFLAG_NO_AUDIO_UNTIL_UP);
if (ast_test_flag(&opt_flags, SLA_TRUNK_OPT_MOH)) {
ast_indicate(chan, -1);