char *stream_name;
char *modname;
switch_mm_t mm;
+ switch_mutex_t *flag_mutex;
};
/*! \brief Abstract interface to an asr module */
\param obj the object to set the flags on
\param flag the or'd list of flags to set
*/
-#define switch_set_flag_locked(obj, flag) assert(obj->flag_mutex != NULL);\
-switch_mutex_lock(obj->flag_mutex);\
+#define switch_set_flag_locked(obj, flag) assert((obj)->flag_mutex != NULL); \
+switch_mutex_lock((obj)->flag_mutex); \
(obj)->flags |= (flag);\
-switch_mutex_unlock(obj->flag_mutex);
+switch_mutex_unlock((obj)->flag_mutex);
/*!
\brief Clear a flag on an arbitrary object
\param obj the object to test
\param flag the or'd list of flags to clear
*/
-#define switch_clear_flag_locked(obj, flag) switch_mutex_lock(obj->flag_mutex); (obj)->flags &= ~(flag); switch_mutex_unlock(obj->flag_mutex);
+#define switch_clear_flag_locked(obj, flag) switch_mutex_lock((obj)->flag_mutex); (obj)->flags &= ~(flag); switch_mutex_unlock((obj)->flag_mutex);
/*!
\brief Clear a flag on an arbitrary object while locked
status = switch_ivr_play_file(session, &fh, file, &args);
switch_assert(!(fh.flags & SWITCH_FILE_OPEN));
-
switch (status) {
case SWITCH_STATUS_SUCCESS:
case SWITCH_STATUS_BREAK:
if (switch_test_flag((&context->fh), SWITCH_FILE_NATIVE)) {
- switch_set_flag(handle, SWITCH_FILE_NATIVE);
+ switch_set_flag_locked(handle, SWITCH_FILE_NATIVE);
} else {
- switch_clear_flag(handle, SWITCH_FILE_NATIVE);
+ switch_clear_flag_locked(handle, SWITCH_FILE_NATIVE);
}
handle->max_samples = 0;
if (switch_test_flag(fh, SWITCH_FILE_NATIVE)) {
- switch_set_flag(handle, SWITCH_FILE_NATIVE);
+ switch_set_flag_locked(handle, SWITCH_FILE_NATIVE);
} else {
- switch_clear_flag(handle, SWITCH_FILE_NATIVE);
+ switch_clear_flag_locked(handle, SWITCH_FILE_NATIVE);
}
}
return status;
handle->flags |= SWITCH_FILE_NOMUX;
if (switch_test_flag((&context->fh), SWITCH_FILE_NATIVE)) {
- switch_set_flag(handle, SWITCH_FILE_NATIVE);
+ switch_set_flag_locked(handle, SWITCH_FILE_NATIVE);
} else {
- switch_clear_flag(handle, SWITCH_FILE_NATIVE);
+ switch_clear_flag_locked(handle, SWITCH_FILE_NATIVE);
}
return SWITCH_STATUS_SUCCESS;
handle->flags |= SWITCH_FILE_NOMUX;
if (switch_test_flag((&context->fh), SWITCH_FILE_NATIVE)) {
- switch_set_flag(handle, SWITCH_FILE_NATIVE);
+ switch_set_flag_locked(handle, SWITCH_FILE_NATIVE);
} else {
- switch_clear_flag(handle, SWITCH_FILE_NATIVE);
+ switch_clear_flag_locked(handle, SWITCH_FILE_NATIVE);
}
return status;
if (dtmf->digit == *cc->profile->pause_key) {
if (switch_test_flag(fh, SWITCH_FILE_PAUSE)) {
- switch_clear_flag(fh, SWITCH_FILE_PAUSE);
+ switch_clear_flag_locked(fh, SWITCH_FILE_PAUSE);
} else {
- switch_set_flag(fh, SWITCH_FILE_PAUSE);
+ switch_set_flag_locked(fh, SWITCH_FILE_PAUSE);
}
return SWITCH_STATUS_SUCCESS;
}
handle->interval = context->fh.interval;
if (switch_test_flag((&context->fh), SWITCH_FILE_NATIVE)) {
- switch_set_flag(handle, SWITCH_FILE_NATIVE);
+ switch_set_flag_locked(handle, SWITCH_FILE_NATIVE);
} else {
- switch_clear_flag(handle, SWITCH_FILE_NATIVE);
+ switch_clear_flag_locked(handle, SWITCH_FILE_NATIVE);
}
return SWITCH_STATUS_SUCCESS;
handle->interval = context->fh.interval;
if (switch_test_flag((&context->fh), SWITCH_FILE_NATIVE)) {
- switch_set_flag(handle, SWITCH_FILE_NATIVE);
+ switch_set_flag_locked(handle, SWITCH_FILE_NATIVE);
} else {
- switch_clear_flag(handle, SWITCH_FILE_NATIVE);
+ switch_clear_flag_locked(handle, SWITCH_FILE_NATIVE);
}
if (handle->params && switch_true(switch_event_get_header(handle->params, "pause"))) {
- switch_set_flag(handle, SWITCH_FILE_PAUSE);
+ switch_set_flag_locked(handle, SWITCH_FILE_PAUSE);
}
if (handle->seekable && start_offset_ms) {
if (switch_test_flag(fh, SWITCH_FILE_SEEK)) {
/* file position has changed flush the buffer */
switch_buffer_zero(fh->audio_buffer);
- switch_clear_flag(fh, SWITCH_FILE_SEEK);
+ switch_clear_flag_locked(fh, SWITCH_FILE_SEEK);
}
/* generate speed frames */
return SWITCH_STATUS_FALSE;
} else if (!strcasecmp(cmd, "pause")) {
- switch_set_flag(fhp, SWITCH_FILE_PAUSE);
+ switch_set_flag_locked(fhp, SWITCH_FILE_PAUSE);
return SWITCH_STATUS_SUCCESS;
} else if (!strcasecmp(cmd, "resume")) {
- switch_clear_flag(fhp, SWITCH_FILE_PAUSE);
+ switch_clear_flag_locked(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);
+ switch_set_flag_locked(fhp, SWITCH_FILE_DONE);
return SWITCH_STATUS_SUCCESS;
} else if (!strcasecmp(cmd, "truncate")) {
switch_core_file_truncate(fhp, 0);
if (!cp->ready) {
continue;
}
-
- switch_mutex_lock(cp->audio_mutex);
+ switch_mutex_lock(cp->audio_mutex);
+
if (switch_test_flag(cp->handle, SWITCH_FILE_OPEN)) {
- if (source->has_video) {
- switch_set_flag(cp->handle, SWITCH_FILE_FLAG_VIDEO);
+ if (source->has_video && !switch_test_flag(cp->handle, SWITCH_FILE_FLAG_VIDEO)) {
+ switch_set_flag_locked(cp->handle, SWITCH_FILE_FLAG_VIDEO);
} else {
- switch_clear_flag(cp->handle, SWITCH_FILE_FLAG_VIDEO);
+ if (switch_test_flag(cp->handle, SWITCH_FILE_FLAG_VIDEO)) {
+ switch_clear_flag_locked(cp->handle, SWITCH_FILE_FLAG_VIDEO);
+ }
}
if (switch_test_flag(cp->handle, SWITCH_FILE_CALLBACK)) {
if (!switch_core_has_video() ||
(switch_test_flag(handle, SWITCH_FILE_FLAG_VIDEO) && !source->has_video && !source->blank_img && !source->cover_art && !source->banner_txt)) {
- switch_clear_flag(handle, SWITCH_FILE_FLAG_VIDEO);
+ switch_clear_flag_locked(handle, SWITCH_FILE_FLAG_VIDEO);
}
context->source = source;
//pool = context->pool;
source = context->source;
- context->ready = 0;
switch_mutex_lock(source->mutex);
+ switch_clear_flag_locked(handle, SWITCH_FILE_OPEN);
+ context->ready = 0;
+
for (cp = source->context_list; cp; cp = cp->next) {
if (cp == context) {
if (last) {
handle->interval = context->fh.interval;
if (switch_test_flag((&context->fh), SWITCH_FILE_NATIVE)) {
- switch_set_flag(handle, SWITCH_FILE_NATIVE);
+ switch_set_flag_locked(handle, SWITCH_FILE_NATIVE);
} else {
- switch_clear_flag(handle, SWITCH_FILE_NATIVE);
+ switch_clear_flag_locked(handle, SWITCH_FILE_NATIVE);
}
return SWITCH_STATUS_SUCCESS;
return SWITCH_STATUS_FALSE;
} else if (!strcasecmp(ret, "pause")) {
if (switch_test_flag(fh, SWITCH_FILE_PAUSE)) {
- switch_clear_flag(fh, SWITCH_FILE_PAUSE);
+ switch_clear_flag_locked(fh, SWITCH_FILE_PAUSE);
} else {
- switch_set_flag(fh, SWITCH_FILE_PAUSE);
+ switch_set_flag_locked(fh, SWITCH_FILE_PAUSE);
}
return SWITCH_STATUS_SUCCESS;
} else if (!strcasecmp(ret, "truncate")) {
if (!strcasecmp(ret, "pause")) {
if (switch_test_flag(fh, SWITCH_FILE_PAUSE)) {
- switch_clear_flag(fh, SWITCH_FILE_PAUSE);
+ switch_clear_flag_locked(fh, SWITCH_FILE_PAUSE);
} else {
- switch_set_flag(fh, SWITCH_FILE_PAUSE);
+ switch_set_flag_locked(fh, SWITCH_FILE_PAUSE);
}
return SWITCH_STATUS_SUCCESS;
} else if (!strcasecmp(ret, "restart")) {
switch_set_flag(fh, SWITCH_FILE_FLAG_FREE_POOL);
}
+ switch_mutex_init(&fh->flag_mutex, SWITCH_MUTEX_NESTED, fh->memory_pool);
+
fh->mm.samplerate = 44100;
fh->mm.channels = 1;
fh->mm.keyint = 60;
fh->line = line;
if (switch_test_flag(fh, SWITCH_FILE_FLAG_VIDEO) && !fh->file_interface->file_read_video) {
- switch_clear_flag(fh, SWITCH_FILE_FLAG_VIDEO);
+ switch_clear_flag_locked(fh, SWITCH_FILE_FLAG_VIDEO);
}
if (spool_path) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "File has %d channels, muxing to %d channel%s will occur.\n", fh->real_channels, fh->channels, fh->channels == 1 ? "" : "s");
}
- switch_set_flag(fh, SWITCH_FILE_OPEN);
+ switch_set_flag_locked(fh, SWITCH_FILE_OPEN);
return status;
fail:
- switch_clear_flag(fh, SWITCH_FILE_OPEN);
+ switch_clear_flag_locked(fh, SWITCH_FILE_OPEN);
if (fh->params) {
switch_event_destroy(&fh->params);
}
if (switch_test_flag(fh, SWITCH_FILE_DONE)) {
- switch_clear_flag(fh, SWITCH_FILE_DONE);
+ switch_clear_flag_locked(fh, SWITCH_FILE_DONE);
*len = 0;
return SWITCH_STATUS_FALSE;
}
if (status != SWITCH_STATUS_SUCCESS || !rlen) {
- switch_set_flag(fh, SWITCH_FILE_BUFFER_DONE);
+ switch_set_flag_locked(fh, SWITCH_FILE_BUFFER_DONE);
} else {
fh->samples_in += rlen;
if (fh->real_channels != fh->channels && !switch_test_flag(fh, SWITCH_FILE_NOMUX)) {
*len = asis ? rlen : rlen / 2 / fh->channels;
if (*len == 0) {
- switch_set_flag(fh, SWITCH_FILE_DONE);
+ switch_set_flag_locked(fh, SWITCH_FILE_DONE);
goto top;
} else {
status = SWITCH_STATUS_SUCCESS;
}
if (status != SWITCH_STATUS_SUCCESS || !*len) {
- switch_set_flag(fh, SWITCH_FILE_DONE);
+ switch_set_flag_locked(fh, SWITCH_FILE_DONE);
goto top;
}
}
}
- switch_set_flag(fh, SWITCH_FILE_SEEK);
+ switch_set_flag_locked(fh, SWITCH_FILE_SEEK);
status = fh->file_interface->file_seek(fh, cur_pos, samples, whence);
fh->offset_pos = *cur_pos;
return SWITCH_STATUS_FALSE;
}
- if (fh->params) {
- switch_event_destroy(&fh->params);
- }
-
- fh->samples_in = 0;
- fh->max_samples = 0;
-
- if (fh->buffer) {
- switch_buffer_destroy(&fh->buffer);
- }
-
if (fh->pre_buffer) {
if (switch_test_flag(fh, SWITCH_FILE_FLAG_WRITE)) {
switch_size_t rlen, blen;
switch_buffer_destroy(&fh->pre_buffer);
}
- switch_clear_flag(fh, SWITCH_FILE_OPEN);
+ switch_clear_flag_locked(fh, SWITCH_FILE_OPEN);
status = fh->file_interface->file_close(fh);
+ if (fh->params) {
+ switch_event_destroy(&fh->params);
+ }
+
+ fh->samples_in = 0;
+ fh->max_samples = 0;
+
+ if (fh->buffer) {
+ switch_buffer_destroy(&fh->buffer);
+ }
+
switch_resample_destroy(&fh->resampler);
if (switch_test_flag(fh, SWITCH_FILE_FLAG_FREE_POOL)) {
}
UNPROTECT_INTERFACE(fh->file_interface);
+ fh->file_interface = NULL;
return status;
}
return SWITCH_STATUS_FALSE;
} else if (!strcasecmp(cmd, "pause")) {
if (switch_test_flag(fhp, SWITCH_FILE_PAUSE)) {
- switch_clear_flag(fhp, SWITCH_FILE_PAUSE);
+ switch_clear_flag_locked(fhp, SWITCH_FILE_PAUSE);
} else {
- switch_set_flag(fhp, SWITCH_FILE_PAUSE);
+ switch_set_flag_locked(fhp, SWITCH_FILE_PAUSE);
}
return SWITCH_STATUS_SUCCESS;
} else if (!strcasecmp(cmd, "stop")) {
- switch_set_flag(fhp, SWITCH_FILE_DONE);
+ switch_set_flag_locked(fhp, SWITCH_FILE_DONE);
return SWITCH_STATUS_FALSE;
} else if (!strcasecmp(cmd, "truncate")) {
switch_core_file_truncate(fhp, 0);
out_file = switch_core_session_sprintf(session, "%s-out.%s", file, ext);
rh->in_fh.pre_buffer_datalen = rh->out_fh.pre_buffer_datalen = fh->pre_buffer_datalen;
channels = 1;
- switch_set_flag(&rh->in_fh, SWITCH_FILE_NATIVE);
- switch_set_flag(&rh->out_fh, SWITCH_FILE_NATIVE);
+ switch_set_flag_locked(&rh->in_fh, SWITCH_FILE_NATIVE);
+ switch_set_flag_locked(&rh->out_fh, SWITCH_FILE_NATIVE);
if (switch_core_file_open(&rh->in_fh, in_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", in_file);
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);
+ switch_clear_flag_locked(fh, SWITCH_FILE_SEEK);
fh->samples = 0;
}
uint32_t pos = 0;
switch_core_file_seek(fh, &pos, 0, SEEK_SET);
switch_core_file_seek(fh, &pos, sample_start, SEEK_CUR);
- switch_clear_flag(fh, SWITCH_FILE_SEEK);
+ switch_clear_flag_locked(fh, SWITCH_FILE_SEEK);
}
if (switch_core_file_get_string(fh, SWITCH_AUDIO_COL_STR_TITLE, &p) == SWITCH_STATUS_SUCCESS) {
if (!switch_test_flag(fh, SWITCH_FILE_NATIVE)) {
olen /= 2;
}
- switch_set_flag(fh, SWITCH_FILE_BREAK_ON_CHANGE);
+ switch_set_flag_locked(fh, SWITCH_FILE_BREAK_ON_CHANGE);
if ((rstatus = switch_core_file_read(fh, abuf, &olen)) == SWITCH_STATUS_BREAK) {
continue;
if (switch_test_flag(fh, SWITCH_FILE_SEEK)) {
/* file position has changed flush the buffer */
switch_buffer_zero(fh->audio_buffer);
- switch_clear_flag(fh, SWITCH_FILE_SEEK);
+ switch_clear_flag_locked(fh, SWITCH_FILE_SEEK);
}
if (args && (args->read_frame_callback)) {
int ok = 1;
- switch_set_flag(fh, SWITCH_FILE_CALLBACK);
+ switch_set_flag_locked(fh, SWITCH_FILE_CALLBACK);
if ((status = args->read_frame_callback(session, read_frame, args->user_data)) != SWITCH_STATUS_SUCCESS) {
ok = 0;
}
- switch_clear_flag(fh, SWITCH_FILE_CALLBACK);
+ switch_clear_flag_locked(fh, SWITCH_FILE_CALLBACK);
if (!ok) {
break;
}