/*! * \brief Performs common setup for a bridge playback operation * with both new controls and when existing controls are found. * * \param args_media medias to play * \param args_media_count number of media items in \c media * \param args_lang language string split from arguments * \param args_offset_ms milliseconds offset split from arguments * \param args_playback_id string to use for playback split from * arguments (null valid) * \param response ARI response being built * \param bridge Bridge the playback is being peformed on * \param control Control being used for the playback channel * \param json contents of the response to ARI * \param playback_url stores playback URL for use with response * * \retval -1 operation failed * \retval operation was successful */ static int ari_bridges_play_helper(const char **args_media, size_t args_media_count, const char *args_lang, int args_offset_ms, int args_skipms, const char *args_playback_id, struct ast_ari_response *response, struct ast_bridge *bridge, struct stasis_app_control *control, struct ast_json **json, char **playback_url) { RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL, ao2_cleanup); RAII_VAR(struct stasis_app_playback *, playback, NULL, ao2_cleanup); const char *language; snapshot = stasis_app_control_get_snapshot(control); if (!snapshot) { ast_ari_response_error( response, 500, "Internal Error", "Failed to get control snapshot"); return -1; } language = S_OR(args_lang, snapshot->language); playback = stasis_app_control_play_uri(control, args_media, args_media_count, language, bridge->uniqueid, STASIS_PLAYBACK_TARGET_BRIDGE, args_skipms, args_offset_ms, args_playback_id); if (!playback) { ast_ari_response_alloc_failed(response); return -1; } if (ast_asprintf(playback_url, "/playbacks/%s", stasis_app_playback_get_id(playback)) == -1) { playback_url = NULL; ast_ari_response_alloc_failed(response); return -1; } *json = stasis_app_playback_to_json(playback); if (!*json) { ast_ari_response_alloc_failed(response); return -1; } return 0; }
static void ari_channels_handle_play( const char *args_channel_id, const char *args_media, const char *args_lang, int args_offsetms, int args_skipms, const char *args_playback_id, struct ast_ari_response *response) { RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup); RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL, ao2_cleanup); RAII_VAR(struct stasis_app_playback *, playback, NULL, ao2_cleanup); RAII_VAR(char *, playback_url, NULL, ast_free); struct ast_json *json; const char *language; ast_assert(response != NULL); control = find_control(response, args_channel_id); if (control == NULL) { /* Response filled in by find_control */ return; } snapshot = stasis_app_control_get_snapshot(control); if (!snapshot) { ast_ari_response_error( response, 404, "Not Found", "Channel not found"); return; } if (args_skipms < 0) { ast_ari_response_error( response, 400, "Bad Request", "skipms cannot be negative"); return; } if (args_offsetms < 0) { ast_ari_response_error( response, 400, "Bad Request", "offsetms cannot be negative"); return; } language = S_OR(args_lang, snapshot->language); playback = stasis_app_control_play_uri(control, args_media, language, args_channel_id, STASIS_PLAYBACK_TARGET_CHANNEL, args_skipms, args_offsetms, args_playback_id); if (!playback) { ast_ari_response_error( response, 500, "Internal Server Error", "Failed to queue media for playback"); return; } if (ast_asprintf(&playback_url, "/playback/%s", stasis_app_playback_get_id(playback)) == -1) { playback_url = NULL; ast_ari_response_error( response, 500, "Internal Server Error", "Out of memory"); return; } json = stasis_app_playback_to_json(playback); if (!json) { ast_ari_response_error( response, 500, "Internal Server Error", "Out of memory"); return; } ast_ari_response_created(response, playback_url, json); }