diff --git a/conf/vanilla/autoload_configs/conference.conf.xml b/conf/vanilla/autoload_configs/conference.conf.xml index ccde59f7f1..9dfb75b22d 100644 --- a/conf/vanilla/autoload_configs/conference.conf.xml +++ b/conf/vanilla/autoload_configs/conference.conf.xml @@ -185,6 +185,7 @@ + diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index b4cc3e829d..73237bc7b8 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -594,6 +594,7 @@ typedef struct conference_obj { struct conf_fps video_fps; int playing_video_file; int recording_members; + uint32_t video_floor_packets; } conference_obj_t; /* Relationship with another member */ @@ -682,6 +683,7 @@ struct conference_member { switch_frame_buffer_t *fb; switch_image_t *avatar_png_img; switch_image_t *video_mute_img; + uint32_t floor_packets; int blanks; int managed_kps; int blackouts; @@ -4531,6 +4533,7 @@ static void conference_set_floor_holder(conference_obj_t *conference, conference if (old_member) { old_id = old_member->id; member_update_status_field(old_member); + old_member->floor_packets = 0; } switch_set_flag(conference, CFLAG_FLOOR_CHANGE); @@ -6330,6 +6333,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v check_agc_levels(member); clear_avg(member); member->score_iir = 0; + member->floor_packets = 0; if (test_eflag(member->conference, EFLAG_STOP_TALKING) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { @@ -6369,7 +6373,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v if (member->volume_in_level) { switch_change_sln_volume(read_frame->data, (read_frame->datalen / 2) * member->conference->channels, member->volume_in_level); } - + if (member->agc_volume_in_level) { switch_change_sln_volume_granular(read_frame->data, (read_frame->datalen / 2) * member->conference->channels, member->agc_volume_in_level); } @@ -6428,10 +6432,6 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v member->score_iir = SCORE_MAX_IIR; } - if (member == member->conference->floor_holder && member->id != member->conference->video_floor_holder) { - conference_set_video_floor_holder(member->conference, member, SWITCH_FALSE); - } - if (noise_gate_check(member)) { uint32_t diff = member->score - member->energy_level; if (hangover_hits) { @@ -6442,6 +6442,10 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v member->nt_tally = 0; } + if (member == member->conference->floor_holder) { + member->floor_packets++; + } + if (diff >= diff_level || ++hangunder_hits >= hangunder) { hangover_hits = hangunder_hits = 0; @@ -6504,6 +6508,13 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v member->last_score = member->score; + + if (member == member->conference->floor_holder) { + if (member->id != member->conference->video_floor_holder && + (member->floor_packets > member->conference->video_floor_packets || member->energy_level == 0)) { + conference_set_video_floor_holder(member->conference, member, SWITCH_FALSE); + } + } } loops++; @@ -12573,7 +12584,7 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c switch_codec_implementation_t read_impl = { 0 }; switch_channel_t *channel = NULL; const char *force_rate = NULL, *force_interval = NULL, *force_channels = NULL, *presence_id = NULL; - uint32_t force_rate_i = 0, force_interval_i = 0, force_channels_i = 0; + uint32_t force_rate_i = 0, force_interval_i = 0, force_channels_i = 0, video_auto_floor_msec = 0; /* Validate the conference name */ if (zstr(name)) { @@ -12790,6 +12801,13 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c } else if (switch_true(val)) { comfort_noise_level = 1400; } + } else if (!strcasecmp(var, "video-auto-floor-msec") && !zstr(val)) { + int tmp; + tmp = atoi(val); + + if (tmp > 0) { + video_auto_floor_msec = tmp; + } } else if (!strcasecmp(var, "sound-prefix") && !zstr(val)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "override sound-prefix with: %s\n", val); sound_prefix = val; @@ -13170,6 +13188,10 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c conference->ivr_dtmf_timeout = ivr_dtmf_timeout; conference->ivr_input_timeout = ivr_input_timeout; + if (video_auto_floor_msec) { + conference->video_floor_packets = video_auto_floor_msec / conference->interval; + } + conference->eflags = 0xFFFFFFFF; if (!zstr(suppress_events)) {