diff --git a/src/mod/event_handlers/mod_rayo/rayo_output_component.c b/src/mod/event_handlers/mod_rayo/rayo_output_component.c index 932b3aed47..6d1f018b80 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_output_component.c +++ b/src/mod/event_handlers/mod_rayo/rayo_output_component.c @@ -1,6 +1,6 @@ /* * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2013-2015, Grasshopper + * Copyright (C) 2013-2016, Grasshopper * * Version: MPL 1.1 * @@ -245,15 +245,23 @@ static iks *start_mixer_output_component(struct rayo_actor *mixer, struct rayo_m static iks *stop_output_component(struct rayo_actor *component, struct rayo_message *msg, void *data) { iks *iq = msg->payload; + iks *result = NULL; switch_stream_handle_t stream = { 0 }; char *command = switch_mprintf("%s stop", RAYO_JID(component)); SWITCH_STANDARD_STREAM(stream); OUTPUT_COMPONENT(component)->stop = 1; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s stopping\n", RAYO_JID(component)); switch_api_execute("fileman", command, NULL, &stream); + if (!zstr((char *)stream.data) && !strncmp((char *)stream.data, "+OK", 3)) { + result = iks_new_iq_result(iq); + } else if (!zstr((char *)stream.data)) { + result = iks_new_error_detailed_printf(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR, "%s", (char *)stream.data); + } else { + result = iks_new_error(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR); + } switch_safe_free(stream.data); switch_safe_free(command); - return iks_new_iq_result(iq); + return result; } /** @@ -262,14 +270,22 @@ static iks *stop_output_component(struct rayo_actor *component, struct rayo_mess static iks *pause_output_component(struct rayo_actor *component, struct rayo_message *msg, void *data) { iks *iq = msg->payload; + iks *result = NULL; switch_stream_handle_t stream = { 0 }; char *command = switch_mprintf("%s pause", RAYO_JID(component)); SWITCH_STANDARD_STREAM(stream); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s pausing\n", RAYO_JID(component)); switch_api_execute("fileman", command, NULL, &stream); + if (!zstr((char *)stream.data) && !strncmp((char *)stream.data, "+OK", 3)) { + result = iks_new_iq_result(iq); + } else if (!zstr((char *)stream.data)) { + result = iks_new_error_detailed_printf(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR, "%s", (char *)stream.data); + } else { + result = iks_new_error(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR); + } switch_safe_free(stream.data); switch_safe_free(command); - return iks_new_iq_result(iq); + return result; } /** @@ -278,14 +294,22 @@ static iks *pause_output_component(struct rayo_actor *component, struct rayo_mes static iks *resume_output_component(struct rayo_actor *component, struct rayo_message *msg, void *data) { iks *iq = msg->payload; + iks *result = NULL; switch_stream_handle_t stream = { 0 }; char *command = switch_mprintf("%s resume", RAYO_JID(component)); SWITCH_STANDARD_STREAM(stream); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s resuming\n", RAYO_JID(component)); switch_api_execute("fileman", command, NULL, &stream); + if (!zstr((char *)stream.data) && !strncmp((char *)stream.data, "+OK", 3)) { + result = iks_new_iq_result(iq); + } else if (!zstr((char *)stream.data)) { + result = iks_new_error_detailed_printf(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR, "%s", (char *)stream.data); + } else { + result = iks_new_error(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR); + } switch_safe_free(stream.data); switch_safe_free(command); - return iks_new_iq_result(iq); + return result; } /** @@ -294,14 +318,22 @@ static iks *resume_output_component(struct rayo_actor *component, struct rayo_me static iks *speed_up_output_component(struct rayo_actor *component, struct rayo_message *msg, void *data) { iks *iq = msg->payload; + iks *result = NULL; switch_stream_handle_t stream = { 0 }; char *command = switch_mprintf("%s speed:+", RAYO_JID(component)); SWITCH_STANDARD_STREAM(stream); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s speeding up\n", RAYO_JID(component)); switch_api_execute("fileman", command, NULL, &stream); + if (!zstr((char *)stream.data) && !strncmp((char *)stream.data, "+OK", 3)) { + result = iks_new_iq_result(iq); + } else if (!zstr((char *)stream.data)) { + result = iks_new_error_detailed_printf(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR, "%s", (char *)stream.data); + } else { + result = iks_new_error(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR); + } switch_safe_free(stream.data); switch_safe_free(command); - return iks_new_iq_result(iq); + return result; } /** @@ -310,14 +342,22 @@ static iks *speed_up_output_component(struct rayo_actor *component, struct rayo_ static iks *speed_down_output_component(struct rayo_actor *component, struct rayo_message *msg, void *data) { iks *iq = msg->payload; + iks *result = NULL; switch_stream_handle_t stream = { 0 }; char *command = switch_mprintf("%s speed:-", RAYO_JID(component)); SWITCH_STANDARD_STREAM(stream); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s slowing down\n", RAYO_JID(component)); switch_api_execute("fileman", command, NULL, &stream); + if (!zstr((char *)stream.data) && !strncmp((char *)stream.data, "+OK", 3)) { + result = iks_new_iq_result(iq); + } else if (!zstr((char *)stream.data)) { + result = iks_new_error_detailed_printf(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR, "%s", (char *)stream.data); + } else { + result = iks_new_error(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR); + } switch_safe_free(stream.data); switch_safe_free(command); - return iks_new_iq_result(iq); + return result; } /** @@ -326,14 +366,22 @@ static iks *speed_down_output_component(struct rayo_actor *component, struct ray static iks *volume_up_output_component(struct rayo_actor *component, struct rayo_message *msg, void *data) { iks *iq = msg->payload; + iks *result = NULL; switch_stream_handle_t stream = { 0 }; char *command = switch_mprintf("%s volume:+", RAYO_JID(component)); SWITCH_STANDARD_STREAM(stream); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s increasing volume\n", RAYO_JID(component)); switch_api_execute("fileman", command, NULL, &stream); + if (!zstr((char *)stream.data) && !strncmp((char *)stream.data, "+OK", 3)) { + result = iks_new_iq_result(iq); + } else if (!zstr((char *)stream.data)) { + result = iks_new_error_detailed_printf(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR, "%s", (char *)stream.data); + } else { + result = iks_new_error(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR); + } switch_safe_free(stream.data); switch_safe_free(command); - return iks_new_iq_result(iq); + return result; } /** @@ -342,14 +390,22 @@ static iks *volume_up_output_component(struct rayo_actor *component, struct rayo static iks *volume_down_output_component(struct rayo_actor *component, struct rayo_message *msg, void *data) { iks *iq = msg->payload; + iks *result = NULL; switch_stream_handle_t stream = { 0 }; char *command = switch_mprintf("%s volume:-", RAYO_JID(component)); SWITCH_STANDARD_STREAM(stream); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s lowering volume\n", RAYO_JID(component)); switch_api_execute("fileman", command, NULL, &stream); + if (!zstr((char *)stream.data) && !strncmp((char *)stream.data, "+OK", 3)) { + result = iks_new_iq_result(iq); + } else if (!zstr((char *)stream.data)) { + result = iks_new_error_detailed_printf(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR, "%s", (char *)stream.data); + } else { + result = iks_new_error(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR); + } switch_safe_free(stream.data); switch_safe_free(command); - return iks_new_iq_result(iq); + return result; } /** @@ -361,6 +417,7 @@ static iks *seek_output_component(struct rayo_actor *component, struct rayo_mess iks *seek = iks_find(iq, "seek"); if (VALIDATE_RAYO_OUTPUT_SEEK(seek)) { + iks *result = NULL; int is_forward = !strcmp("forward", iks_find_attrib(seek, "direction")); int amount_ms = iks_find_int_attrib(seek, "amount"); char *command = switch_mprintf("%s seek:%s%i", RAYO_JID(component), @@ -369,11 +426,17 @@ static iks *seek_output_component(struct rayo_actor *component, struct rayo_mess SWITCH_STANDARD_STREAM(stream); switch_api_execute("fileman", command, NULL, &stream); - + if (!zstr((char *)stream.data) && !strncmp((char *)stream.data, "+OK", 3)) { + result = iks_new_iq_result(iq); + } else if (!zstr((char *)stream.data)) { + result = iks_new_error_detailed_printf(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR, "%s", (char *)stream.data); + } else { + result = iks_new_error(iq, STANZA_ERROR_INTERNAL_SERVER_ERROR); + } switch_safe_free(stream.data); switch_safe_free(command); - return iks_new_iq_result(iq); + return result; } return iks_new_error(iq, STANZA_ERROR_BAD_REQUEST); } @@ -693,6 +756,8 @@ struct fileman_file_context { const char *uuid; /** fileman control ID */ const char *id; + /** done flag */ + int done; }; /** @@ -861,7 +926,11 @@ static switch_status_t fileman_file_read(switch_file_handle_t *handle, void *dat int do_speed = 1; size_t read_bytes = 0; - if (switch_test_flag(handle, SWITCH_FILE_PAUSE)) { + if (context->done) { + /* done with this file */ + status = SWITCH_STATUS_FALSE; + goto done; + } else if (switch_test_flag(handle, SWITCH_FILE_PAUSE)) { //switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->uuid), SWITCH_LOG_DEBUG, "Read pause frame\n"); memset(context->abuf, 255, *len * 2); do_speed = 0; @@ -1105,8 +1174,10 @@ static switch_status_t fileman_process_cmd(const char *cmd, switch_file_handle_t switch_clear_flag(fhp, SWITCH_FILE_PAUSE); return SWITCH_STATUS_SUCCESS; } else if (!strcasecmp(cmd, "stop")) { + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->uuid), SWITCH_LOG_DEBUG, "Stopping file\n"); + context->done = 1; switch_set_flag(fhp, SWITCH_FILE_DONE); - return SWITCH_STATUS_FALSE; + return SWITCH_STATUS_SUCCESS; } else if (!strcasecmp(cmd, "truncate")) { switch_core_file_truncate(fhp, 0); } else if (!strcasecmp(cmd, "restart")) { @@ -1175,12 +1246,17 @@ SWITCH_STANDARD_API(fileman_api) switch_mutex_lock(fileman_globals.mutex); fh = (switch_file_handle_t *)switch_core_hash_find(fileman_globals.hash, id); if (fh) { - fileman_process_cmd(cmd, fh); + if (fileman_process_cmd(cmd, fh) == SWITCH_STATUS_SUCCESS) { + stream->write_function(stream, "+OK\n"); + } else { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "fileman API failed for file %s\n", zstr(fh->file_path) ? "" : fh->file_path); + stream->write_function(stream, "-ERR API call failed"); + } switch_mutex_unlock(fileman_globals.mutex); - stream->write_function(stream, "+OK\n"); } else { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "fileman API failed for ID %s\n", zstr(id) : "" : id); switch_mutex_unlock(fileman_globals.mutex); - stream->write_function(stream, "-ERR No file handle!\n"); + stream->write_function(stream, "-ERR file handle not found\n"); } goto done; }