res_musiconhold: Fix MOH restarting where it left off from the last hold.
authorRichard Mudgett <rmudgett@digium.com>
Mon, 25 Aug 2014 16:16:52 +0000 (16:16 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 25 Aug 2014 16:16:52 +0000 (16:16 +0000)
Restore code removed by https://reviewboard.asterisk.org/r/3536/ that
introduced a regression that prevents MOH from restarting were it left off
the last time.

ASTERISK-24019 #close
Reported by: Jason Richards
Patches:
      jira_asterisk_24019_v1.8.patch (license #5621) patch uploaded by rmudgett

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

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

Merged revisions 421977 from http://svn.asterisk.org/svn/asterisk/branches/11
........

Merged revisions 421978 from http://svn.asterisk.org/svn/asterisk/branches/12
........

Merged revisions 421979 from http://svn.asterisk.org/svn/asterisk/branches/13

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

res/res_musiconhold.c

index 2ae5682..00a2fa2 100644 (file)
@@ -138,6 +138,8 @@ struct moh_files_state {
        int sample_queue;
        int pos;
        int save_pos;
+       int save_total;
+       char name[MAX_MUSICCLASS];
        char save_pos_filename[PATH_MAX];
 };
 
@@ -474,11 +476,9 @@ static void *moh_files_alloc(struct ast_channel *chan, void *params)
                }
        }
 
-       /* class is reffed, so we can safely compare it against the (possibly
-        * recently unreffed) state->class. The unref was done after the ref
-        * of class, so we're sure that they won't point to the same memory
-        * by accident. */
-       if (state->class != class) {
+       /* Resume MOH from where we left off last time or start from scratch? */
+       if (state->save_total != class->total_files || strcmp(state->name, class->name) != 0) {
+               /* Start MOH from scratch. */
                memset(state, 0, sizeof(*state));
                if (ast_test_flag(class, MOH_RANDOMIZE) && class->total_files) {
                        state->pos = ast_random() % class->total_files;
@@ -489,6 +489,9 @@ static void *moh_files_alloc(struct ast_channel *chan, void *params)
        /* it's possible state is not a new allocation, don't leak old refs */
        ao2_replace(state->origwfmt, ast_channel_writeformat(chan));
        ao2_replace(state->mohwfmt, ast_channel_writeformat(chan));
+       /* For comparison on restart of MOH (see above) */
+       ast_copy_string(state->name, class->name, sizeof(state->name));
+       state->save_total = class->total_files;
 
        moh_post_start(chan, class->name);