diff options
author | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-07-27 20:11:42 +0000 |
---|---|---|
committer | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-07-27 20:11:42 +0000 |
commit | d85d8869235e74d3988f33db2995257c4ea26b3c (patch) | |
tree | 8669a10bb93bed1a94c67c9e6cd6d466843376f6 | |
parent | fd394359e29f28d0c417db9e3cac12f6b1cfda1b (diff) |
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/trunk@209197 f38db490-d61c-443f-a65b-d21fe96a405b
-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 8647316d2..67154fde6 100644 --- a/res/res_musiconhold.c +++ b/res/res_musiconhold.c @@ -1166,7 +1166,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 @@ -1181,28 +1183,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, SENTINEL); + } } - 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, SENTINEL); + } } - 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, SENTINEL); + } } - /* 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, SENTINEL); - } - if (!var && !ast_strlen_zero(mclass)) - var = ast_load_realtime("musiconhold", "name", mclass, SENTINEL); - if (!var && !ast_strlen_zero(interpclass)) - var = ast_load_realtime("musiconhold", "name", interpclass, SENTINEL); - if (!var) + if (!mohclass && !var) { + mohclass = get_mohbyname("default", 1); + if (!mohclass && realtime_possible) { var = ast_load_realtime("musiconhold", "name", "default", SENTINEL); - 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")) @@ -1333,16 +1344,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; } |