diff options
author | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-07-27 20:16:28 +0000 |
---|---|---|
committer | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-07-27 20:16:28 +0000 |
commit | e2995898602c0cfa4f10712834ba7ec6c1bfc546 (patch) | |
tree | 789bb5fbe26fcf0d9f0b9cb1818f787da29f208a /res | |
parent | 52f9723e5df303f5eb4fed24ff5b81a2effd22f6 (diff) |
Merged revisions 209197 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
........
r209197 | mmichelson | 2009-07-27 15:11:42 -0500 (Mon, 27 Jul 2009) | 9 lines
Honor channel's music class when using realtime music on hold.
(closes issue #15051)
Reported by: alexh
Patches:
15051.patch uploaded by mmichelson (license 60)
Tested by: alexh
........
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@209198 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rw-r--r-- | res/res_musiconhold.c | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c index 5b332f6d0..b83180f87 100644 --- a/res/res_musiconhold.c +++ b/res/res_musiconhold.c @@ -1155,7 +1155,9 @@ static int local_ast_moh_start(struct ast_channel *chan, const char *mclass, con { struct mohclass *mohclass = NULL; struct moh_files_state *state = chan->music_state; + struct ast_variable *var = NULL; int res; + int realtime_possible = ast_check_realtime("musiconhold"); /* The following is the order of preference for which class to use: * 1) The channels explicitly set musicclass, which should *only* be @@ -1170,28 +1172,37 @@ static int local_ast_moh_start(struct ast_channel *chan, const char *mclass, con */ if (!ast_strlen_zero(chan->musicclass)) { mohclass = get_mohbyname(chan->musicclass, 1); + if (!mohclass && realtime_possible) { + var = ast_load_realtime("musiconhold", "name", chan->musicclass, NULL); + } } - if (!mohclass && !ast_strlen_zero(mclass)) { + if (!mohclass && !var && !ast_strlen_zero(mclass)) { mohclass = get_mohbyname(mclass, 1); + if (!mohclass && realtime_possible) { + var = ast_load_realtime("musiconhold", "name", mclass, NULL); + } } - if (!mohclass && !ast_strlen_zero(interpclass)) { + if (!mohclass && !var && !ast_strlen_zero(interpclass)) { mohclass = get_mohbyname(interpclass, 1); + if (!mohclass && realtime_possible) { + var = ast_load_realtime("musiconhold", "name", interpclass, NULL); + } } - /* If no moh class found in memory, then check RT */ - if (!mohclass && ast_check_realtime("musiconhold")) { - struct ast_variable *var = NULL, *tmp = NULL; - - if (!ast_strlen_zero(chan->musicclass)) { - var = ast_load_realtime("musiconhold", "name", chan->musicclass, NULL); - } - if (!var && !ast_strlen_zero(mclass)) - var = ast_load_realtime("musiconhold", "name", mclass, NULL); - if (!var && !ast_strlen_zero(interpclass)) - var = ast_load_realtime("musiconhold", "name", interpclass, NULL); - if (!var) + if (!mohclass && !var) { + mohclass = get_mohbyname("default", 1); + if (!mohclass && realtime_possible) { var = ast_load_realtime("musiconhold", "name", "default", NULL); - if (var && (mohclass = moh_class_malloc())) { + } + } + + /* If no moh class found in memory, then check RT. Note that the logic used + * above guarantees that if var is non-NULL, then mohclass must be NULL. + */ + if (var) { + struct ast_variable *tmp = NULL; + + if ((mohclass = moh_class_malloc())) { mohclass->realtime = 1; for (tmp = var; tmp; tmp = tmp->next) { if (!strcasecmp(tmp->name, "name")) @@ -1321,16 +1332,12 @@ static int local_ast_moh_start(struct ast_channel *chan, const char *mclass, con return -1; } } - } else if (var) { + } else { ast_variables_destroy(var); } } if (!mohclass) { - mohclass = get_mohbyname("default", 1); - } - - if (!mohclass) { return -1; } |