SWITCH_FILE_CALLBACK = (1 << 12),
SWITCH_FILE_DONE = (1 << 13),
SWITCH_FILE_BUFFER_DONE = (1 << 14),
- SWITCH_FILE_WRITE_APPEND = (1 << 15)
+ SWITCH_FILE_WRITE_APPEND = (1 << 15),
+ SWITCH_FILE_WRITE_OVER = (1 << 16)
} switch_file_flag_enum_t;
typedef uint32_t switch_file_flag_t;
if (switch_test_flag(handle, SWITCH_FILE_FLAG_WRITE)) {
flags |= SWITCH_FOPEN_WRITE | SWITCH_FOPEN_CREATE;
- if (switch_test_flag(handle, SWITCH_FILE_WRITE_APPEND)) {
+ if (switch_test_flag(handle, SWITCH_FILE_WRITE_APPEND) || switch_test_flag(handle, SWITCH_FILE_WRITE_OVER)) {
flags |= SWITCH_FOPEN_READ;
} else {
flags |= SWITCH_FOPEN_TRUNCATE;
}
if (switch_test_flag(handle, SWITCH_FILE_FLAG_WRITE)) {
- if (switch_test_flag(handle, SWITCH_FILE_WRITE_APPEND)) {
+ if (switch_test_flag(handle, SWITCH_FILE_WRITE_APPEND) || switch_test_flag(handle, SWITCH_FILE_WRITE_OVER)) {
mode += SFM_RDWR;
} else {
mode += SFM_WRITE;
if (switch_test_flag(handle, SWITCH_FILE_WRITE_APPEND)) {
handle->pos = sf_seek(context->handle, 0, SEEK_END);
+ } else if (switch_test_flag(handle, SWITCH_FILE_WRITE_OVER)) {
+ handle->pos = sf_seek(context->handle, 0, SEEK_SET);
} else {
sf_count_t frames = 0;
sf_command(context->handle, SFC_FILE_TRUNCATE, &frames, sizeof(frames));
SWITCH_DECLARE(switch_status_t) switch_core_file_seek(switch_file_handle_t *fh, unsigned int *cur_pos, int64_t samples, int whence)
{
- size_t bytes = 0;
switch_status_t status;
-
+ int ok = 1;
+
switch_assert(fh != NULL);
switch_assert(fh->file_interface != NULL);
- if (!switch_test_flag(fh, SWITCH_FILE_OPEN) || !switch_test_flag(fh, SWITCH_FILE_FLAG_READ)) {
- return SWITCH_STATUS_FALSE;
+ if (!switch_test_flag(fh, SWITCH_FILE_OPEN) || !fh->file_interface->file_seek) {
+ ok = 0;
+ } else if (switch_test_flag(fh, SWITCH_FILE_FLAG_WRITE)) {
+ if (!(switch_test_flag(fh, SWITCH_FILE_WRITE_APPEND) || switch_test_flag(fh, SWITCH_FILE_WRITE_OVER))) {
+ ok = 0;
+ }
+ } else if (!switch_test_flag(fh, SWITCH_FILE_FLAG_READ)) {
+ ok = 0;
}
-
- if (!fh->file_interface->file_seek) {
+
+ if (!ok) {
return SWITCH_STATUS_FALSE;
}
-
+
if (fh->buffer) {
- bytes += switch_buffer_inuse(fh->buffer);
switch_buffer_zero(fh->buffer);
}
if (fh->pre_buffer) {
- bytes += switch_buffer_inuse(fh->pre_buffer);
switch_buffer_zero(fh->pre_buffer);
}
if (whence == SWITCH_SEEK_CUR) {
- samples -= bytes / sizeof(int16_t);
+ unsigned int cur = 0;
+
+ if (switch_test_flag(fh, SWITCH_FILE_FLAG_WRITE)) {
+ fh->file_interface->file_seek(fh, &cur, fh->samples_out, SEEK_SET);
+ } else {
+ fh->file_interface->file_seek(fh, &cur, fh->offset_pos, SEEK_SET);
+ }
}
switch_set_flag(fh, SWITCH_FILE_SEEK);
status = fh->file_interface->file_seek(fh, cur_pos, samples, whence);
+
if (samples) {
fh->offset_pos = *cur_pos;
+
+ if (switch_test_flag(fh, SWITCH_FILE_FLAG_WRITE)) {
+ fh->samples_out = *cur_pos;
+ }
}
+
+
return status;
}
time_t start = 0;
uint32_t org_silence_hits = 0;
int asis = 0;
+ int32_t sample_start = 0;
int waste_resources = 0, fill_cng = 0;
switch_codec_implementation_t read_impl = { 0 };
switch_frame_t write_frame = { 0 };
fh->channels = read_impl.number_of_channels;
fh->native_rate = read_impl.actual_samples_per_second;
+ if (fh->samples > 0) {
+ sample_start = fh->samples;
+ fh->samples = 0;
+ }
+
if ((vval = switch_channel_get_variable(channel, "record_sample_rate"))) {
int tmp = 0;
file_flags |= SWITCH_FILE_WRITE_APPEND;
}
+ if (switch_test_flag(fh, SWITCH_FILE_WRITE_OVER) || ((p = switch_channel_get_variable(channel, "RECORD_WRITE_OVER")) && switch_true(p))) {
+ file_flags |= SWITCH_FILE_WRITE_OVER;
+ }
+
if (!fh->prefix) {
fh->prefix = prefix;
}
return SWITCH_STATUS_GENERR;
}
+ if (sample_start > 0) {
+ uint32_t pos = 0;
+ switch_core_file_seek(fh, &pos, sample_start, SEEK_SET);
+ switch_clear_flag(fh, SWITCH_FILE_SEEK);
+ fh->samples = 0;
+ }
+
+
if (switch_test_flag(fh, SWITCH_FILE_NATIVE)) {
asis = 1;
}