diff --git a/apps/app_meetme.c b/apps/app_meetme.c index e4bf7fd30a..924e0e1bac 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -161,6 +161,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 { @@ -1587,6 +1589,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; @@ -1913,7 +1924,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); @@ -2692,7 +2706,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 { @@ -2704,7 +2718,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); } } @@ -4005,6 +4019,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; @@ -4027,7 +4047,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, trunk_ref->chan); if (conf) { conf_run(trunk_ref->chan, conf, conf_flags.flags, NULL); @@ -4198,7 +4218,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 @@ -5011,7 +5031,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); @@ -5210,7 +5230,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);