diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-03-01 23:42:53 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-03-01 23:42:53 +0000 |
commit | d5cab4c713b3a877c53f618a8edc79b2ccc28090 (patch) | |
tree | 9a5f3a4dc47b736677e913ca02e55b3b3697403e /apps | |
parent | 4334ea36f17413e3718a204ef514e559e498bb9e (diff) |
Merge changes from svn/asterisk/team/russell/sla_updates
* Originally, I put in the documentation that only Zap interfaces would be
supported on the trunk side. However, after a discussion with Qwell, we came
up with a way to make IP trunks work as well, using some things already in
Asterisk. So, here it is, this now officially supports IP trunks.
* Update the SLA documentation to reflect how to setup IP trunks.
* Add a section in sla.txt that describes how to set up an SLA system with
voicemail.
* Simplify the way DTMF passthrough is handled in MeetMe.
* Fix a bug that exposed itself when using a Local channel on the trunk side
in SLA. The station's channel needs to be passed to the dial API when
dialing the trunk.
* Change a WARNING message to DEBUG in channel.h. This message is of no use
to users.
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@57364 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_meetme.c | 41 |
1 files changed, 16 insertions, 25 deletions
diff --git a/apps/app_meetme.c b/apps/app_meetme.c index 2df944c48..99c2636eb 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -353,7 +353,6 @@ struct ast_conf_user { time_t jointime; /*!< Time the user joined the conference */ struct volume talk; struct volume listen; - AST_LIST_HEAD_NOLOCK(, ast_frame) frame_q; AST_LIST_ENTRY(ast_conf_user) list; }; @@ -1240,17 +1239,15 @@ static int conf_free(struct ast_conference *conf) } static void conf_queue_dtmf(const struct ast_conference *conf, - const struct ast_conf_user *sender, const struct ast_frame *_f) + const struct ast_conf_user *sender, struct ast_frame *f) { - struct ast_frame *f; struct ast_conf_user *user; AST_LIST_TRAVERSE(&conf->userlist, user, list) { if (user == sender) continue; - if (!(f = ast_frdup(_f))) - return; - AST_LIST_INSERT_TAIL(&user->frame_q, f, frame_list); + if (ast_write(user->chan, f) < 0) + ast_log(LOG_WARNING, "Error writing frame to channel %s\n", user->chan->name); } } @@ -1869,14 +1866,6 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c f = ast_read(c); if (!f) break; - if (!AST_LIST_EMPTY(&user->frame_q)) { - struct ast_frame *f; - f = AST_LIST_REMOVE_HEAD(&user->frame_q, frame_list); - if (ast_write(chan, f) < 0) { - ast_log(LOG_WARNING, "Error writing frame to channel!\n"); - } - ast_frfree(f); - } if ((f->frametype == AST_FRAME_VOICE) && (f->subclass == AST_FORMAT_SLINEAR)) { if (user->talk.actual) ast_frame_adjust_volume(f, user->talk.actual); @@ -3931,7 +3920,7 @@ static void *sla_thread(void *data) } struct dial_trunk_args { - struct sla_trunk *trunk; + struct sla_trunk_ref *trunk_ref; struct sla_station *station; ast_mutex_t *cond_lock; ast_cond_t *cond; @@ -3946,7 +3935,7 @@ static void *dial_trunk(void *data) char conf_name[MAX_CONFNUM]; struct ast_conference *conf; struct ast_flags conf_flags = { 0 }; - struct sla_trunk *trunk = args->trunk; + struct sla_trunk_ref *trunk_ref = args->trunk_ref; if (!(dial = ast_dial_create())) { ast_mutex_lock(args->cond_lock); @@ -3955,7 +3944,7 @@ static void *dial_trunk(void *data) return NULL; } - tech_data = ast_strdupa(trunk->device); + tech_data = ast_strdupa(trunk_ref->trunk->device); tech = strsep(&tech_data, "/"); if (ast_dial_append(dial, tech, tech_data) == -1) { ast_mutex_lock(args->cond_lock); @@ -3965,7 +3954,7 @@ static void *dial_trunk(void *data) return NULL; } - dial_res = ast_dial_run(dial, NULL, 1); + dial_res = ast_dial_run(dial, trunk_ref->chan, 1); if (dial_res != AST_DIAL_RESULT_TRYING) { ast_mutex_lock(args->cond_lock); ast_cond_signal(args->cond); @@ -3978,7 +3967,7 @@ static void *dial_trunk(void *data) unsigned int done = 0; switch ((dial_res = ast_dial_state(dial))) { case AST_DIAL_RESULT_ANSWERED: - trunk->chan = ast_dial_answered(dial); + trunk_ref->trunk->chan = ast_dial_answered(dial); case AST_DIAL_RESULT_HANGUP: case AST_DIAL_RESULT_INVALID: case AST_DIAL_RESULT_FAILED: @@ -3995,7 +3984,7 @@ static void *dial_trunk(void *data) break; } - if (!trunk->chan) { + if (!trunk_ref->trunk->chan) { ast_mutex_lock(args->cond_lock); ast_cond_signal(args->cond); ast_mutex_unlock(args->cond_lock); @@ -4004,7 +3993,7 @@ static void *dial_trunk(void *data) return NULL; } - snprintf(conf_name, sizeof(conf_name), "SLA_%s", trunk->name); + snprintf(conf_name, sizeof(conf_name), "SLA_%s", trunk_ref->trunk->name); ast_set_flag(&conf_flags, CONFFLAG_QUIET | CONFFLAG_MARKEDEXIT | CONFFLAG_MARKEDUSER | CONFFLAG_PASS_DTMF | CONFFLAG_SLA_TRUNK); @@ -4015,12 +4004,12 @@ static void *dial_trunk(void *data) ast_mutex_unlock(args->cond_lock); if (conf) { - conf_run(trunk->chan, conf, conf_flags.flags, NULL); + conf_run(trunk_ref->trunk->chan, conf, conf_flags.flags, NULL); dispose_conf(conf); conf = NULL; } - trunk->chan = NULL; + trunk_ref->trunk->chan = NULL; ast_dial_join(dial); ast_dial_destroy(dial); @@ -4095,13 +4084,15 @@ static int sla_station_exec(struct ast_channel *chan, void *data) return 0; } + trunk_ref->chan = chan; + if (!trunk_ref->trunk->chan) { ast_mutex_t cond_lock; ast_cond_t cond; pthread_t dont_care; pthread_attr_t attr; struct dial_trunk_args args = { - .trunk = trunk_ref->trunk, + .trunk_ref = trunk_ref, .station = station, .cond_lock = &cond_lock, .cond = &cond, @@ -4127,6 +4118,7 @@ static int sla_station_exec(struct ast_channel *chan, void *data) ast_log(LOG_DEBUG, "Trunk didn't get created. chan: %lx\n", (long) trunk_ref->trunk->chan); pbx_builtin_setvar_helper(chan, "SLASTATION_STATUS", "CONGESTION"); sla_change_trunk_state(trunk_ref->trunk, SLA_TRUNK_STATE_IDLE, ALL_TRUNK_REFS); + trunk_ref->chan = NULL; return 0; } } @@ -4135,7 +4127,6 @@ static int sla_station_exec(struct ast_channel *chan, 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); - trunk_ref->chan = chan; ast_answer(chan); conf = build_conf(conf_name, "", "", 0, 0, 1); if (conf) { |