From deca70c2708342e3d3644923afc5bf5126f77d4c Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 23 Jan 2015 22:36:07 -0600 Subject: [PATCH] FS-7513: adjust floor change code --- .../mod_conference/mod_conference.c | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 2f965f58c7..454fe3cd24 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -2203,12 +2203,21 @@ static switch_status_t member_parse_position(conference_member_t *member, const } #endif -static void find_video_floor(conference_obj_t *conference, uint32_t member_id, switch_bool_t entering) +static void find_video_floor(conference_member_t *member, switch_bool_t entering) { conference_member_t *imember; + conference_obj_t *conference = member->conference; + + if (!entering) { + if (member->id == conference->video_floor_holder) { + conference_set_video_floor_holder(conference, NULL, 1); + } else if (member->id == conference->last_video_floor_holder) { + conference->last_video_floor_holder = 0; + } + } switch_mutex_lock(conference->member_mutex); - for (imember = conference->members; imember && !conference->video_floor_holder && !conference->last_video_floor_holder; imember = imember->next) { + for (imember = conference->members; imember; imember = imember->next) { switch_channel_t *ichannel; if (!(imember->session)) { @@ -2221,21 +2230,23 @@ static void find_video_floor(conference_obj_t *conference, uint32_t member_id, s continue; } - if (imember->id == member_id && !entering) { + if (!entering && imember->id == member->id) { continue; } - if (!conference->video_floor_holder && imember->id != conference->video_floor_holder) { - conference->video_floor_holder = imember->id; + if (!conference->video_floor_holder) { + conference_set_video_floor_holder(conference, imember, 0); continue; } - if (!conference->last_video_floor_holder && imember->id != conference->last_video_floor_holder) { + if (!conference->last_video_floor_holder) { conference->last_video_floor_holder = imember->id; + switch_core_session_request_video_refresh(imember->session); continue; } } + switch_mutex_unlock(conference->member_mutex); } @@ -2473,9 +2484,9 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe switch_mutex_unlock(conference->mutex); status = SWITCH_STATUS_SUCCESS; - if (!member->conference->video_floor_holder) { - find_video_floor(member->conference, member->id, SWITCH_TRUE); - } + + find_video_floor(member, SWITCH_TRUE); + if (switch_test_flag(member, MFLAG_JOIN_VID_FLOOR)) { conference_set_video_floor_holder(conference, member, SWITCH_TRUE); @@ -2512,6 +2523,8 @@ static void conference_set_video_floor_holder(conference_obj_t *conference, conf conference->last_video_floor_holder = conference->video_floor_holder; if (conference->last_video_floor_holder && (imember = conference_member_get(conference, conference->last_video_floor_holder))) { + switch_core_session_request_video_refresh(imember->session); + if (switch_test_flag(imember, MFLAG_VIDEO_BRIDGE)) { switch_set_flag(conference, CFLAG_VID_FLOOR_LOCK); } @@ -2820,14 +2833,6 @@ static switch_status_t conference_del_member(conference_obj_t *conference, confe switch_core_speech_close(&member->lsh, &flags); } - if (member == member->conference->floor_holder) { - conference_set_floor_holder(member->conference, NULL); - } - - if (member->id == member->conference->last_video_floor_holder) { - member->conference->last_video_floor_holder = 0; - } - if (member->id == member->conference->video_floor_holder) { if (member->conference->last_video_floor_holder) { member->conference->video_floor_holder = member->conference->last_video_floor_holder; @@ -2836,9 +2841,7 @@ static switch_status_t conference_del_member(conference_obj_t *conference, confe member->conference->video_floor_holder = 0; } - if (!member->conference->video_floor_holder) { - find_video_floor(member->conference, member->id, SWITCH_FALSE); - } + find_video_floor(member, SWITCH_FALSE); member->conference = NULL;