diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c index 70f846976b968d3eef75b154044bf00009ffabbe..1b44b3dfd8463ed601fb38d48c66635e660b8634 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)