diff --git a/doc/CHANGES-staging/res_stasis_playback.txt b/doc/CHANGES-staging/res_stasis_playback.txt new file mode 100644 index 0000000000000000000000000000000000000000..cd5fa1102a9fe0ce812172ac57492c1bf5dbc2e4 --- /dev/null +++ b/doc/CHANGES-staging/res_stasis_playback.txt @@ -0,0 +1,9 @@ +Subject: PlaybackFinished has a new error state + +The PlaybackFinished event now has a new state "failed" +that is used when the sound file was not played due to an error. +Before the state on PlaybackFinished was always "done". + +In case of multiple sound files to be played, +the PlaybackFinished is sent only once in the end of the list, +even in case of error. diff --git a/include/asterisk/stasis_app_playback.h b/include/asterisk/stasis_app_playback.h index 0038fd6d0810bbead8249570d16e6ae523ae49fd..ab49b09ab7d80af896369df89fb2cb6deb571137 100644 --- a/include/asterisk/stasis_app_playback.h +++ b/include/asterisk/stasis_app_playback.h @@ -45,6 +45,8 @@ enum stasis_app_playback_state { STASIS_PLAYBACK_STATE_CONTINUING, /*! The media has stopped playing */ STASIS_PLAYBACK_STATE_COMPLETE, + /*! The media has stopped because of an error playing the file */ + STASIS_PLAYBACK_STATE_FAILED, /*! The playback was canceled. */ STASIS_PLAYBACK_STATE_CANCELED, /*! The playback was stopped. */ diff --git a/res/res_stasis_playback.c b/res/res_stasis_playback.c index d60a49a519c2e7718a15e2ed482811db2ba21df2..2013bb717a0a6841c6a5c6278ef39983cc479fb8 100644 --- a/res/res_stasis_playback.c +++ b/res/res_stasis_playback.c @@ -107,6 +107,8 @@ static struct ast_json *playback_to_json(struct stasis_message *message, type = "PlaybackContinuing"; } else if (!strcmp(state, "done")) { type = "PlaybackFinished"; + } else if (!strcmp(state, "failed")) { + type = "PlaybackFinished"; } else { return NULL; } @@ -202,6 +204,8 @@ static const char *state_to_string(enum stasis_app_playback_state state) return "paused"; case STASIS_PLAYBACK_STATE_CONTINUING: return "continuing"; + case STASIS_PLAYBACK_STATE_FAILED: + return "failed"; case STASIS_PLAYBACK_STATE_STOPPED: case STASIS_PLAYBACK_STATE_COMPLETE: case STASIS_PLAYBACK_STATE_CANCELED: @@ -275,7 +279,11 @@ static void playback_final_update(struct stasis_app_playback *playback, } else { ast_log(LOG_WARNING, "%s: Playback failed for %s\n", uniqueid, playback->media); - playback->state = STASIS_PLAYBACK_STATE_STOPPED; + if (playback->media_index == AST_VECTOR_SIZE(&playback->medias) - 1) { + playback->state = STASIS_PLAYBACK_STATE_FAILED; + } else { + playback->state = STASIS_PLAYBACK_STATE_CONTINUING; + } } } @@ -701,6 +709,7 @@ playback_opreation_cb operations[STASIS_PLAYBACK_STATE_MAX][STASIS_PLAYBACK_MEDI [STASIS_PLAYBACK_STATE_PAUSED][STASIS_PLAYBACK_UNPAUSE] = playback_unpause, [STASIS_PLAYBACK_STATE_COMPLETE][STASIS_PLAYBACK_STOP] = playback_noop, + [STASIS_PLAYBACK_STATE_FAILED][STASIS_PLAYBACK_STOP] = playback_noop, [STASIS_PLAYBACK_STATE_CANCELED][STASIS_PLAYBACK_STOP] = playback_noop, [STASIS_PLAYBACK_STATE_STOPPED][STASIS_PLAYBACK_STOP] = playback_noop, }; diff --git a/rest-api/api-docs/playbacks.json b/rest-api/api-docs/playbacks.json index a78dcae7103ae90f958a2fa0d7e91796f300a901..793986fcca79555c225584c82280e13a962b01be 100644 --- a/rest-api/api-docs/playbacks.json +++ b/rest-api/api-docs/playbacks.json @@ -154,7 +154,8 @@ "queued", "playing", "continuing", - "done" + "done", + "failed" ] } }