diff options
author | Richard Mudgett <rmudgett@digium.com> | 2014-08-25 16:13:45 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2014-08-25 16:13:45 +0000 |
commit | d6ea6f5848fb238657c1f272f44ea84ba3446cdb (patch) | |
tree | 41406b4b8007fc36d6cb13812f056ca3da8b52f8 /res | |
parent | 42fe12700927757d6df8151b2ecc938e825eb1e9 (diff) |
res_musiconhold: Fix MOH restarting where it left off from the last hold.
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
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@421979 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res')
-rw-r--r-- | res/res_musiconhold.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c index 2ae56825f..00a2fa2c0 100644 --- a/res/res_musiconhold.c +++ b/res/res_musiconhold.c @@ -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); |