]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-11276: dedicated video layers can no longer become audio floor holder
authorChad Phillips <chad@apartmentlines.com>
Thu, 26 Jul 2018 01:43:05 +0000 (20:43 -0500)
committerChad Phillips <chad@apartmentlines.com>
Thu, 26 Jul 2018 01:43:05 +0000 (20:43 -0500)
In mod_conference 1.6.x, all conference users could get the audio floor
regardless of the kind of video layer they were placed in.

In 1.8.x, the concept of a 'dedicated video layer' was introduced, such that
video layout slots with a reservation ID or a role ID are marked with the
'MFLAG_DED_VID_LAYER' member flag when a member is in the slot, and such
marked layers are prevented from becoming the conference audio/video floor
holder.

This makes sense for the video floor in all circumstances, and the audio floor
in most circumstances.

However, there are some circumstances where allowing users in these dedicated
video layers to become the conference audio floor holder is preferred, such as
when all slots in the layout have reservation IDs, and the audio floor events
are used to manage users in those slots manually.

This adds a conference profile flag, 'ded-vid-layer-audio-floor, which, when
enabled, allows conference members in dedicated video layers to become the
conference audio floor holder.

src/mod/applications/mod_conference/conference_api.c
src/mod/applications/mod_conference/conference_member.c
src/mod/applications/mod_conference/conference_utils.c
src/mod/applications/mod_conference/mod_conference.c
src/mod/applications/mod_conference/mod_conference.h

index 0ca6b08de0ba6e44bee56a4c951e8c5cac7b80e4..1e4d536dceb8d45224ecffdc7a89d7fbefab479a 100644 (file)
@@ -2306,7 +2306,7 @@ switch_status_t conference_api_sub_floor(conference_member_t *member, switch_str
        if (member == NULL)
                return SWITCH_STATUS_GENERR;
 
-       if (conference_utils_member_test_flag(member, MFLAG_DED_VID_LAYER)) {
+       if (conference_utils_member_test_flag(member, MFLAG_DED_VID_LAYER) && !conference_utils_test_flag(member->conference, CFLAG_DED_VID_LAYER_AUDIO_FLOOR)) {
                if (stream != NULL) {
                        stream->write_function(stream, "-ERR cannot set floor on a member in an active video role\n");
                }
index d72fcf5153f38c804e6d0ffc22ff8464c4cb31e5..152dfb8aa594492be59dab5caf6021802d81330e 100644 (file)
@@ -1081,7 +1081,7 @@ void conference_member_set_floor_holder(conference_obj_t *conference, conference
                member = lmember = conference_member_get(conference, id);
        }
 
-       if (member && conference_utils_member_test_flag(member, MFLAG_DED_VID_LAYER)) {
+       if (member && conference_utils_member_test_flag(member, MFLAG_DED_VID_LAYER) && !conference_utils_test_flag(conference, CFLAG_DED_VID_LAYER_AUDIO_FLOOR)) {
                goto end;
        }
        
index c1932ead7477a73bd78699c6f205d23cc62703e2..22de5ce6c3c8586ed7ec6e02060d128d41911716 100644 (file)
@@ -214,6 +214,8 @@ void conference_utils_set_cflags(const char *flags, conference_flag_t *f)
                                f[CFLAG_MANAGE_INBOUND_VIDEO_BITRATE] = 1;
                        } else if (!strcasecmp(argv[i], "video-muxing-personal-canvas")) {
                                f[CFLAG_PERSONAL_CANVAS] = 1;
+                       } else if (!strcasecmp(argv[i], "ded-vid-layer-audio-floor")) {
+                               f[CFLAG_DED_VID_LAYER_AUDIO_FLOOR] = 1;
                        }
                }
 
index 6efb7c72dff0ff96fb5f924978cd42452bda2454..1218020567044d61c679a2eec6074ce9dbe9ff51 100644 (file)
@@ -312,7 +312,7 @@ void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *ob
                                        //(!conference_utils_test_flag(conference, CFLAG_VID_FLOOR) || switch_channel_test_flag(channel, CF_VIDEO))) {
 
                
-                                       if (!conference_utils_member_test_flag(imember, MFLAG_DED_VID_LAYER)) {
+                                       if (!conference_utils_member_test_flag(imember, MFLAG_DED_VID_LAYER) || conference_utils_test_flag(conference, CFLAG_DED_VID_LAYER_AUDIO_FLOOR)) {
                                                conference_member_set_floor_holder(conference, imember, 0);
                                                floor_holder = conference->floor_holder;
                                        }
index a11015321e44bb7ec8b3b757c50b962c9f5a8b14..bb887536e1f3663abf6b3097e558aa6f23cdc011 100644 (file)
@@ -261,6 +261,7 @@ typedef enum {
        CFLAG_REFRESH_LAYOUT,
        CFLAG_VIDEO_MUTE_EXIT_CANVAS,
        CFLAG_NO_MOH,
+       CFLAG_DED_VID_LAYER_AUDIO_FLOOR,
        /////////////////////////////////
        CFLAG_MAX
 } conference_flag_t;