]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FSCORE-591
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 26 May 2010 14:51:14 +0000 (09:51 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 26 May 2010 14:51:26 +0000 (09:51 -0500)
src/mod/formats/mod_sndfile/mod_sndfile.c
src/switch_ivr_async.c

index c017ad9f06f6ebb40f4f732babc8885dae428217..26c5a5d91c32891cbc0f4835763b8f759a09880b 100644 (file)
@@ -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)
index 96fd188ca3e2611e57d16ea4ed3f2161f4eaa009..1ad5c3a6fa86cc9d688f2fc37c641c119a71ad0d 100644 (file)
@@ -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);