diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index b7f4b644cb..44cd7f51eb 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -1160,12 +1160,19 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s case SWITCH_ABC_TYPE_TAP_NATIVE_READ: { rh->rready = 1; + + nframe = switch_core_media_bug_get_native_read_frame(bug); + len = nframe->datalen; - if (rh->rready && rh->wready) { + if (!rh->wready) { + unsigned char fill_data[SWITCH_RECOMMENDED_BUFFER_SIZE] = {0}; + switch_size_t fill_len = len; + + switch_core_gen_encoded_silence(fill_data, &rh->read_impl, len); + switch_core_file_write(&rh->out_fh, fill_data, &fill_len); + } else { switch_time_t now = switch_micro_time_now(); switch_time_t diff; - nframe = switch_core_media_bug_get_native_read_frame(bug); - len = nframe->datalen; if (rh->last_read_time && rh->last_read_time < now) { diff = ((now - rh->last_read_time) + 3000 ) / rh->read_impl.microseconds_per_packet; @@ -1181,17 +1188,23 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s } } } - - switch_core_file_write(&rh->in_fh, mask ? null_data : nframe->data, &len); - rh->last_read_time = now; } + + switch_core_file_write(&rh->in_fh, mask ? null_data : nframe->data, &len); + rh->last_read_time = now; + } break; case SWITCH_ABC_TYPE_TAP_NATIVE_WRITE: { rh->wready = 1; - if (rh->rready && rh->wready) { + if (!rh->rready) { + unsigned char fill_data[SWITCH_RECOMMENDED_BUFFER_SIZE] = {0}; + switch_size_t fill_len = len; + switch_core_gen_encoded_silence(fill_data, &rh->read_impl, len); + switch_core_file_write(&rh->in_fh, fill_data, &fill_len); + } else { switch_time_t now = switch_micro_time_now(); switch_time_t diff; @@ -1213,10 +1226,11 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s } } } - - switch_core_file_write(&rh->out_fh, mask ? null_data : nframe->data, &len); - rh->last_write_time = now; } + + switch_core_file_write(&rh->out_fh, mask ? null_data : nframe->data, &len); + rh->last_write_time = now; + } break; case SWITCH_ABC_TYPE_CLOSE: