[asterisk-commits] kmoore: branch 1.8 r416439 - /branches/1.8/res/res_musiconhold.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Jun 17 11:20:30 CDT 2014


Author: kmoore
Date: Tue Jun 17 11:20:22 2014
New Revision: 416439

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=416439
Log:
MoH: Don't restart stream on repeated start calls

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/

Modified:
    branches/1.8/res/res_musiconhold.c

Modified: branches/1.8/res/res_musiconhold.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/res/res_musiconhold.c?view=diff&rev=416439&r1=416438&r2=416439
==============================================================================
--- branches/1.8/res/res_musiconhold.c (original)
+++ branches/1.8/res/res_musiconhold.c Tue Jun 17 11:20:22 2014
@@ -1320,7 +1320,7 @@
 	struct mohclass *mohclass = NULL;
 	struct moh_files_state *state = chan->music_state;
 	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:
@@ -1518,10 +1518,12 @@
 
 	ast_set_flag(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");




More information about the asterisk-commits mailing list