aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-12-09 20:57:35 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-12-09 20:57:35 +0000
commit87af640ccf9f1cfa1747bdf2b0b40a64c897d2c2 (patch)
treea2979364be8f4e6a3b7cdd577eec963b189d3303 /apps
parent3ec826a4d4c1891daf1f08e42257b6d512b70283 (diff)
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.4@162286 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-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 9b6edb2f4..8838e3549 100644
--- a/apps/app_meetme.c
+++ b/apps/app_meetme.c
@@ -165,6 +165,8 @@ enum {
CONFFLAG_SLA_STATION = (1 << 26),
/*! This is a SLA trunk. (Only for use by the SLA applications.) */
CONFFLAG_SLA_TRUNK = (1 << 27),
+ /*! Do not write any audio to this channel until the state is up. */
+ CONFFLAG_NO_AUDIO_UNTIL_UP = (1 << 28),
};
enum {
@@ -1482,6 +1484,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;
@@ -1700,7 +1711,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);
@@ -2346,7 +2360,7 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
}
if (conf->transframe[index]) {
if (conf->transframe[index]->frametype != AST_FRAME_NULL) {
- if (ast_write(chan, conf->transframe[index]))
+ if (can_write(chan, confflags) && ast_write(chan, conf->transframe[index]))
ast_log(LOG_WARNING, "Unable to write frame to channel %s\n", chan->name);
}
} else {
@@ -2358,7 +2372,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);
}
}
@@ -3395,6 +3409,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;
@@ -3417,7 +3437,7 @@ static void *run_station(void *data)
snprintf(conf_name, sizeof(conf_name), "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, "", "", 0, 0, 1);
if (conf) {
conf_run(trunk_ref->chan, conf, conf_flags.flags, NULL);
@@ -3590,7 +3610,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
@@ -4348,7 +4368,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);
@@ -4499,7 +4519,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);
ast_indicate(chan, AST_CONTROL_RINGING);
conf_run(chan, conf, conf_flags.flags, NULL);
dispose_conf(conf);