mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
musiconhold: Add preferchannelclass=no option to prefer app class.
The new option 'preferchannelclass' is added to musiconhold.conf. If yes (the default) the CHANNEL(musicclass) is preferred when choosing the hold music. If it is no, the class suggested by the application that calls the MoH (e.g. the Queue() app) gets preferred (new behaviour). This way you set a different hold-music from the Queue-music by setting both the CHANNEL(musicclass) and the queue-context musicclass. ASTERISK-24276 #close Reported by: Kristian Høgh Patches: app_override_channel_moh.patch uploaded by Kristian Høgh (License #6639) Review: https://reviewboard.asterisk.org/r/4010/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@423893 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -151,8 +151,9 @@ struct moh_files_state {
|
||||
#define MOH_RANDSTART (MOH_RANDOMIZE | MOH_SORTALPHA) /*!< Sorted but start at random position */
|
||||
#define MOH_SORTMODE (3 << 3)
|
||||
|
||||
#define MOH_CACHERTCLASSES (1 << 5) /*!< Should we use a separate instance of MOH for each user or not */
|
||||
#define MOH_ANNOUNCEMENT (1 << 6) /*!< Do we play announcement files between songs on this channel? */
|
||||
#define MOH_CACHERTCLASSES (1 << 5) /*!< Should we use a separate instance of MOH for each user or not */
|
||||
#define MOH_ANNOUNCEMENT (1 << 6) /*!< Do we play announcement files between songs on this channel? */
|
||||
#define MOH_PREFERCHANNELCLASS (1 << 7) /*!< Should queue moh override channel moh */
|
||||
|
||||
/* Custom astobj2 flag */
|
||||
#define MOH_NOTDELETED (1 << 30) /*!< Find only records that aren't deleted? */
|
||||
@@ -1396,42 +1397,42 @@ static int local_ast_moh_start(struct ast_channel *chan, const char *mclass, con
|
||||
struct moh_files_state *state = ast_channel_music_state(chan);
|
||||
struct ast_variable *var = NULL;
|
||||
int res = 0;
|
||||
int i;
|
||||
int realtime_possible = ast_check_realtime("musiconhold");
|
||||
const char *classes[] = {NULL, NULL, interpclass, "default"};
|
||||
|
||||
if (ast_test_flag(global_flags, MOH_PREFERCHANNELCLASS)) {
|
||||
classes[0] = ast_channel_musicclass(chan);
|
||||
classes[1] = mclass;
|
||||
} else {
|
||||
classes[0] = mclass;
|
||||
classes[1] = ast_channel_musicclass(chan);
|
||||
}
|
||||
|
||||
/* The following is the order of preference for which class to use:
|
||||
* 1) The channels explicitly set musicclass, which should *only* be
|
||||
* set by a call to Set(CHANNEL(musicclass)=whatever) in the dialplan.
|
||||
* Unless preferchannelclass in musiconhold.conf is false
|
||||
* 2) The mclass argument. If a channel is calling ast_moh_start() as the
|
||||
* result of receiving a HOLD control frame, this should be the
|
||||
* payload that came with the frame.
|
||||
* 3) The interpclass argument. This would be from the mohinterpret
|
||||
* 3) The channels explicitly set musicclass, which should *only* be
|
||||
* set by a call to Set(CHANNEL(musicclass)=whatever) in the dialplan.
|
||||
* 4) The interpclass argument. This would be from the mohinterpret
|
||||
* option from channel drivers. This is the same as the old musicclass
|
||||
* option.
|
||||
* 4) The default class.
|
||||
* 5) The default class.
|
||||
*/
|
||||
if (!ast_strlen_zero(ast_channel_musicclass(chan))) {
|
||||
mohclass = get_mohbyname(ast_channel_musicclass(chan), 1, 0);
|
||||
if (!mohclass && realtime_possible) {
|
||||
var = ast_load_realtime("musiconhold", "name", ast_channel_musicclass(chan), SENTINEL);
|
||||
}
|
||||
}
|
||||
if (!mohclass && !var && !ast_strlen_zero(mclass)) {
|
||||
mohclass = get_mohbyname(mclass, 1, 0);
|
||||
if (!mohclass && realtime_possible) {
|
||||
var = ast_load_realtime("musiconhold", "name", mclass, SENTINEL);
|
||||
}
|
||||
}
|
||||
if (!mohclass && !var && !ast_strlen_zero(interpclass)) {
|
||||
mohclass = get_mohbyname(interpclass, 1, 0);
|
||||
if (!mohclass && realtime_possible) {
|
||||
var = ast_load_realtime("musiconhold", "name", interpclass, SENTINEL);
|
||||
}
|
||||
}
|
||||
|
||||
if (!mohclass && !var) {
|
||||
mohclass = get_mohbyname("default", 1, 0);
|
||||
if (!mohclass && realtime_possible) {
|
||||
var = ast_load_realtime("musiconhold", "name", "default", SENTINEL);
|
||||
for (i = 0; i < ARRAY_LEN(classes); ++i) {
|
||||
if (!ast_strlen_zero(classes[i])) {
|
||||
mohclass = get_mohbyname(classes[i], 1, 0);
|
||||
if (!mohclass && realtime_possible) {
|
||||
var = ast_load_realtime("musiconhold", "name", classes[i], SENTINEL);
|
||||
}
|
||||
if (mohclass || var) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1732,6 +1733,7 @@ static int load_moh_classes(int reload)
|
||||
}
|
||||
|
||||
ast_clear_flag(global_flags, AST_FLAGS_ALL);
|
||||
ast_set2_flag(global_flags, 1, MOH_PREFERCHANNELCLASS);
|
||||
|
||||
cat = ast_category_browse(cfg, NULL);
|
||||
for (; cat; cat = ast_category_browse(cfg, cat)) {
|
||||
@@ -1740,6 +1742,8 @@ static int load_moh_classes(int reload)
|
||||
for (var = ast_variable_browse(cfg, cat); var; var = var->next) {
|
||||
if (!strcasecmp(var->name, "cachertclasses")) {
|
||||
ast_set2_flag(global_flags, ast_true(var->value), MOH_CACHERTCLASSES);
|
||||
} else if (!strcasecmp(var->name, "preferchannelclass")) {
|
||||
ast_set2_flag(global_flags, ast_true(var->value), MOH_PREFERCHANNELCLASS);
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "Unknown option '%s' in [general] section of musiconhold.conf\n", var->name);
|
||||
}
|
||||
|
Reference in New Issue
Block a user