]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
MoH: Don't restart stream on repeated start calls
authorKinsey Moore <kmoore@digium.com>
Tue, 17 Jun 2014 16:21:00 +0000 (16:21 +0000)
committerKinsey Moore <kmoore@digium.com>
Tue, 17 Jun 2014 16:21:00 +0000 (16:21 +0000)
Currently, music on hold will stop and then start again from the
beginning if ast_moh_start() is called multiple times. This can happen
if a call is put on hold repeatedly (the channel receives multiple
HOLD control frames) and can be triggered from ARI by starting MoH on a
channel multiple times. This is fairly jarring/annoying to users.

This change prevents MoH from being restarted if the requested music
class is the same as the one currently playing.

This includes an extra check to prevent the errors previously
experienced in the testsuite and has 100+ test runs behind it.

Review: https://reviewboard.asterisk.org/r/3615/
........

Merged revisions 416439 from http://svn.asterisk.org/svn/asterisk/branches/1.8

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@416440 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_musiconhold.c

index bbc7a162d819b118c29b6071067dd4a9034820c5..3a22ec19d41a6d48dac3e3d2be7e5589a3ff2122 100644 (file)
@@ -1360,7 +1360,7 @@ static int local_ast_moh_start(struct ast_channel *chan, const char *mclass, con
        struct mohclass *mohclass = NULL;
        struct moh_files_state *state = ast_channel_music_state(chan);
        struct ast_variable *var = NULL;
-       int res;
+       int res = 0;
        int realtime_possible = ast_check_realtime("musiconhold");
 
        /* The following is the order of preference for which class to use:
@@ -1558,10 +1558,12 @@ static int local_ast_moh_start(struct ast_channel *chan, const char *mclass, con
 
        ast_set_flag(ast_channel_flags(chan), AST_FLAG_MOH);
 
-       if (mohclass->total_files) {
-               res = ast_activate_generator(chan, &moh_file_stream, mohclass);
-       } else {
-               res = ast_activate_generator(chan, &mohgen, mohclass);
+       if (!state || !state->class || strcmp(mohclass->name, state->class->name)) {
+               if (mohclass->total_files) {
+                       res = ast_activate_generator(chan, &moh_file_stream, mohclass);
+               } else {
+                       res = ast_activate_generator(chan, &mohgen, mohclass);
+               }
        }
 
        mohclass = mohclass_unref(mohclass, "unreffing local reference to mohclass in local_ast_moh_start");