aboutsummaryrefslogtreecommitdiffstats
path: root/res/res_musiconhold.c
diff options
context:
space:
mode:
Diffstat (limited to 'res/res_musiconhold.c')
-rw-r--r--res/res_musiconhold.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c
index 70f846976..1b44b3dfd 100644
--- a/res/res_musiconhold.c
+++ b/res/res_musiconhold.c
@@ -122,6 +122,7 @@ struct moh_files_state {
int sample_queue;
int pos;
int save_pos;
+ char *save_pos_filename;
};
#define MOH_QUIET (1 << 0)
@@ -248,8 +249,8 @@ static int ast_moh_files_next(struct ast_channel *chan)
return -1;
}
- /* If a specific file has been saved, use it */
- if (state->save_pos >= 0) {
+ /* If a specific file has been saved confirm it still exists and that it is still valid */
+ if (state->save_pos >= 0 && state->save_pos < state->class->total_files && state->class->filearray[state->save_pos] == state->save_pos_filename) {
state->pos = state->save_pos;
state->save_pos = -1;
} else if (ast_test_flag(state->class, MOH_RANDOMIZE)) {
@@ -259,11 +260,13 @@ static int ast_moh_files_next(struct ast_channel *chan)
if (ast_fileexists(state->class->filearray[state->pos], NULL, NULL) > 0)
break;
}
+ state->save_pos = -1;
state->samples = 0;
} else {
/* This is easy, just increment our position and make sure we don't exceed the total file count */
state->pos++;
state->pos %= state->class->total_files;
+ state->save_pos = -1;
state->samples = 0;
}
@@ -274,6 +277,9 @@ static int ast_moh_files_next(struct ast_channel *chan)
return -1;
}
+ /* Record the pointer to the filename for position resuming later */
+ state->save_pos_filename = state->class->filearray[state->pos];
+
ast_debug(1, "%s Opened file %d '%s'\n", chan->name, state->pos, state->class->filearray[state->pos]);
if (state->samples)