From a3e6beadd04dcfa6ac0f88aa3ab6723dd3c424d4 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 26 May 2010 09:51:14 -0500 Subject: [PATCH] FSCORE-591 --- src/mod/formats/mod_sndfile/mod_sndfile.c | 2 +- src/switch_ivr_async.c | 32 ++++++++++++++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/mod/formats/mod_sndfile/mod_sndfile.c b/src/mod/formats/mod_sndfile/mod_sndfile.c index c017ad9f06..26c5a5d91c 100644 --- a/src/mod/formats/mod_sndfile/mod_sndfile.c +++ b/src/mod/formats/mod_sndfile/mod_sndfile.c @@ -300,7 +300,7 @@ static switch_status_t sndfile_file_write(switch_file_handle_t *handle, void *da handle->sample_count += *len; - return SWITCH_STATUS_SUCCESS; + return sf_error(context->handle) == SF_ERR_NO_ERROR ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; } static switch_status_t sndfile_file_set_string(switch_file_handle_t *handle, switch_audio_col_t col, const char *string) diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index 96fd188ca3..1ad5c3a6fa 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -459,6 +459,7 @@ struct record_helper { switch_file_handle_t *fh; uint32_t packet_len; int min_sec; + switch_bool_t hangup_on_error; }; static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type) @@ -502,8 +503,13 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s while (switch_core_media_bug_read(bug, &frame, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS && !switch_test_flag((&frame), SFF_CNG)) { len = (switch_size_t) frame.datalen / 2; - if (len) - switch_core_file_write(rh->fh, data, &len); + + if (len && switch_core_file_write(rh->fh, data, &len) != SWITCH_STATUS_SUCCESS && rh->hangup_on_error) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Error writing %s\n", rh->file); + switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); + switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE); + return SWITCH_FALSE; + } } @@ -528,8 +534,12 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s while (switch_core_media_bug_read(bug, &frame, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS && !switch_test_flag((&frame), SFF_CNG)) { len = (switch_size_t) frame.datalen / 2; - if (len) - switch_core_file_write(rh->fh, data, &len); + if (len && switch_core_file_write(rh->fh, data, &len) != SWITCH_STATUS_SUCCESS && rh->hangup_on_error) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Error writing %s\n", rh->file); + switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); + switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE); + return SWITCH_FALSE; + } } } @@ -934,6 +944,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_record_session(switch_core_session_t switch_codec_implementation_t read_impl = { 0 }; struct record_helper *rh = NULL; int file_flags = SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT; + switch_bool_t hangup_on_error = SWITCH_FALSE; + + if ((p = switch_channel_get_variable(channel, "RECORD_HANGUP_ON_ERROR"))) { + hangup_on_error = switch_true(p); + } switch_core_session_get_read_impl(session, &read_impl); @@ -1028,8 +1043,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_record_session(switch_core_session_t if (switch_core_file_open(fh, file, channels, read_impl.actual_samples_per_second, file_flags, NULL) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Error opening %s\n", file); - switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); - switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE); + if (hangup_on_error) { + switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); + switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE); + } return SWITCH_STATUS_GENERR; } @@ -1087,7 +1104,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_record_session(switch_core_session_t } } - + rh->hangup_on_error = hangup_on_error; + if ((status = switch_core_media_bug_add(session, "session_record", file, record_callback, rh, to, flags, &bug)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Error adding media bug for file %s\n", file);