From a71bf235e79e91adc1ad469f4ed85e7f9ce2d702 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 16 Nov 2016 20:08:56 -0600 Subject: [PATCH] FS-9748: [Locking contention with mod_shout playing conference moh] --- .../mod_conference/mod_conference.c | 19 ++++++++++++++----- .../mod_conference/mod_conference.h | 1 + src/mod/formats/mod_shout/mod_shout.c | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index eae77037e0..d8e9984800 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -237,6 +237,7 @@ void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *ob uint32_t conference_energy = 0; int nomoh = 0; conference_member_t *floor_holder; + switch_status_t moh_status = SWITCH_STATUS_SUCCESS; /* Sync the conference to a single timing source */ if (switch_core_timer_next(&timer) != SWITCH_STATUS_SUCCESS) { @@ -324,13 +325,21 @@ void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *ob conference_member_set_floor_holder(conference, floor_holder); } - if (conference->perpetual_sound && !conference->async_fnode) { - conference_file_play(conference, conference->perpetual_sound, CONF_DEFAULT_LEADIN, NULL, 1); - } else if (conference->moh_sound && ((nomoh == 0 && conference->count == 1) - || conference_utils_test_flag(conference, CFLAG_WAIT_MOD)) && !conference->async_fnode && !conference->fnode) { - conference_file_play(conference, conference->moh_sound, CONF_DEFAULT_LEADIN, NULL, 1); + if (conference->moh_wait > 0) { + conference->moh_wait--; + } else { + if (conference->perpetual_sound && !conference->async_fnode) { + moh_status = conference_file_play(conference, conference->perpetual_sound, CONF_DEFAULT_LEADIN, NULL, 1); + } else if (conference->moh_sound && ((nomoh == 0 && conference->count == 1) + || conference_utils_test_flag(conference, CFLAG_WAIT_MOD)) && + !conference->async_fnode && !conference->fnode) { + moh_status = conference_file_play(conference, conference->moh_sound, CONF_DEFAULT_LEADIN, NULL, 1); + } } + if (!conference->moh_wait && moh_status != SWITCH_STATUS_SUCCESS) { + conference->moh_wait = 2000 / conference->interval; + } /* Find if no one talked for more than x number of second */ if (conference->terminate_on_silence && conference->count > 1) { diff --git a/src/mod/applications/mod_conference/mod_conference.h b/src/mod/applications/mod_conference/mod_conference.h index 42bba3574b..14d209c94b 100644 --- a/src/mod/applications/mod_conference/mod_conference.h +++ b/src/mod/applications/mod_conference/mod_conference.h @@ -681,6 +681,7 @@ typedef struct conference_obj { int scale_h264_canvas_height; int scale_h264_canvas_fps_divisor; char *scale_h264_canvas_bandwidth; + uint32_t moh_wait; } conference_obj_t; /* Relationship with another member */ diff --git a/src/mod/formats/mod_shout/mod_shout.c b/src/mod/formats/mod_shout/mod_shout.c index 8372a03b7f..f326116a5b 100644 --- a/src/mod/formats/mod_shout/mod_shout.c +++ b/src/mod/formats/mod_shout/mod_shout.c @@ -717,7 +717,7 @@ static switch_status_t shout_file_open(switch_file_handle_t *handle, const char if (handle->handler) { int sanity = 1000; - while(--sanity > 0 && !switch_buffer_inuse(context->audio_buffer)) { + while(--sanity > 0 && !switch_buffer_inuse(context->audio_buffer) && !context->eof && !context->err) { switch_yield(20000); }