mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-19 09:47:23 +00:00
hand pick 8734c9070db99be60ac251dab65a6d6440af2719 FS-10448: [mod_conference] Add Video Blind
This commit is contained in:
parent
2756c96f9d
commit
c7a1f28737
@ -349,6 +349,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_read_lock_unlock(switch_core_s
|
||||
SWITCH_DECLARE(void) switch_core_session_stop_media(switch_core_session_t *session);
|
||||
SWITCH_DECLARE(switch_media_flow_t) switch_core_session_media_flow(switch_core_session_t *session, switch_media_type_t type);
|
||||
SWITCH_DECLARE(switch_status_t) switch_core_media_get_vid_params(switch_core_session_t *session, switch_vid_params_t *vid_params);
|
||||
SWITCH_DECLARE(void) switch_core_session_write_blank_video(switch_core_session_t *session, uint32_t ms);
|
||||
SWITCH_DECLARE(switch_status_t) switch_core_media_lock_video_file(switch_core_session_t *session, switch_rw_t rw);
|
||||
SWITCH_DECLARE(switch_status_t) switch_core_media_unlock_video_file(switch_core_session_t *session, switch_rw_t rw);
|
||||
SWITCH_DECLARE(switch_status_t) switch_core_media_set_video_file(switch_core_session_t *session, switch_file_handle_t *fh, switch_rw_t rw);
|
||||
|
@ -71,6 +71,9 @@ api_command_t conference_api_sub_commands[] = {
|
||||
{"tvmute", (void_fn_t) & conference_api_sub_tvmute, CONF_API_SUB_MEMBER_TARGET, "tvmute", "<[member_id|all]|last|non_moderator> [<quiet>]"},
|
||||
{"vmute-snap", (void_fn_t) & conference_api_sub_conference_video_vmute_snap, CONF_API_SUB_MEMBER_TARGET, "vmute-snap", "<[member_id|all]|last|non_moderator>"},
|
||||
{"unvmute", (void_fn_t) & conference_api_sub_unvmute, CONF_API_SUB_MEMBER_TARGET, "unvmute", "<[member_id|all]|last|non_moderator> [<quiet>]"},
|
||||
{"vblind", (void_fn_t) & conference_api_sub_vblind, CONF_API_SUB_MEMBER_TARGET, "vblind", "<[member_id|all]|last|non_moderator> [<quiet>]"},
|
||||
{"tvblind", (void_fn_t) & conference_api_sub_tvblind, CONF_API_SUB_MEMBER_TARGET, "tvblind", "<[member_id|all]|last|non_moderator> [<quiet>]"},
|
||||
{"unvblind", (void_fn_t) & conference_api_sub_unvblind, CONF_API_SUB_MEMBER_TARGET, "unvblind", "<[member_id|all]|last|non_moderator> [<quiet>]"},
|
||||
{"deaf", (void_fn_t) & conference_api_sub_deaf, CONF_API_SUB_MEMBER_TARGET, "deaf", "<[member_id|all]|last|non_moderator>"},
|
||||
{"undeaf", (void_fn_t) & conference_api_sub_undeaf, CONF_API_SUB_MEMBER_TARGET, "undeaf", "<[member_id|all]|last|non_moderator>"},
|
||||
{"relate", (void_fn_t) & conference_api_sub_relate, CONF_API_SUB_ARGS_SPLIT, "relate", "<member_id>[,<member_id>] <other_member_id>[,<other_member_id>] [nospeak|nohear|clear]"},
|
||||
@ -556,6 +559,93 @@ switch_status_t conference_api_sub_unvmute(conference_member_t *member, switch_s
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
switch_status_t conference_api_sub_vblind(conference_member_t *member, switch_stream_handle_t *stream, void *data)
|
||||
{
|
||||
switch_event_t *event;
|
||||
|
||||
if (member == NULL)
|
||||
return SWITCH_STATUS_GENERR;
|
||||
|
||||
if (switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_SENDONLY) {
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
switch_core_session_write_blank_video(member->session, 50);
|
||||
conference_utils_member_clear_flag_locked(member, MFLAG_CAN_SEE);
|
||||
conference_video_reset_video_bitrate_counters(member);
|
||||
|
||||
if (!(data) || !strstr((char *) data, "quiet")) {
|
||||
conference_utils_member_set_flag(member, MFLAG_INDICATE_BLIND);
|
||||
}
|
||||
|
||||
if (stream != NULL) {
|
||||
stream->write_function(stream, "OK vblind %u\n", member->id);
|
||||
}
|
||||
|
||||
if (test_eflag(member->conference, EFLAG_BLIND_MEMBER) &&
|
||||
switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
|
||||
conference_member_add_event_data(member, event);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "vblind-member");
|
||||
switch_event_fire(&event);
|
||||
}
|
||||
|
||||
conference_member_update_status_field(member);
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
switch_status_t conference_api_sub_tvblind(conference_member_t *member, switch_stream_handle_t *stream, void *data)
|
||||
{
|
||||
|
||||
if (member == NULL)
|
||||
return SWITCH_STATUS_GENERR;
|
||||
|
||||
if (conference_utils_member_test_flag(member, MFLAG_CAN_SEE)) {
|
||||
return conference_api_sub_vblind(member, stream, data);
|
||||
}
|
||||
|
||||
return conference_api_sub_unvblind(member, stream, data);
|
||||
}
|
||||
|
||||
|
||||
switch_status_t conference_api_sub_unvblind(conference_member_t *member, switch_stream_handle_t *stream, void *data)
|
||||
{
|
||||
switch_event_t *event;
|
||||
|
||||
if (member == NULL)
|
||||
return SWITCH_STATUS_GENERR;
|
||||
|
||||
if (switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_SENDONLY) {
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
conference_utils_member_set_flag_locked(member, MFLAG_CAN_SEE);
|
||||
conference_video_reset_video_bitrate_counters(member);
|
||||
|
||||
switch_channel_set_flag(member->channel, CF_VIDEO_REFRESH_REQ);
|
||||
|
||||
if (!(data) || !strstr((char *) data, "quiet")) {
|
||||
conference_utils_member_set_flag(member, MFLAG_INDICATE_UNBLIND);
|
||||
}
|
||||
|
||||
if (stream != NULL) {
|
||||
stream->write_function(stream, "OK unvblind %u\n", member->id);
|
||||
}
|
||||
|
||||
if (test_eflag(member->conference, EFLAG_BLIND_MEMBER) &&
|
||||
switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
|
||||
conference_member_add_event_data(member, event);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "unvblind-member");
|
||||
switch_event_fire(&event);
|
||||
}
|
||||
|
||||
|
||||
conference_member_update_status_field(member);
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
switch_status_t conference_api_sub_deaf(conference_member_t *member, switch_stream_handle_t *stream, void *data)
|
||||
{
|
||||
switch_event_t *event;
|
||||
|
@ -1416,6 +1416,20 @@ void conference_loop_output(conference_member_t *member)
|
||||
conference_utils_member_clear_flag(member, MFLAG_INDICATE_UNDEAF);
|
||||
}
|
||||
|
||||
if (conference_utils_member_test_flag(member, MFLAG_INDICATE_BLIND)) {
|
||||
if (!zstr(member->conference->deaf_sound)) {
|
||||
conference_member_play_file(member, member->conference->deaf_sound, 0, SWITCH_TRUE);
|
||||
}
|
||||
conference_utils_member_clear_flag(member, MFLAG_INDICATE_BLIND);
|
||||
}
|
||||
|
||||
if (conference_utils_member_test_flag(member, MFLAG_INDICATE_UNBLIND)) {
|
||||
if (!zstr(member->conference->undeaf_sound)) {
|
||||
conference_member_play_file(member, member->conference->undeaf_sound, 0, SWITCH_TRUE);
|
||||
}
|
||||
conference_utils_member_clear_flag(member, MFLAG_INDICATE_UNBLIND);
|
||||
}
|
||||
|
||||
if (switch_core_session_private_event_count(member->session)) {
|
||||
switch_channel_set_app_flag(channel, CF_APP_TAGGED);
|
||||
switch_ivr_parse_all_events(member->session);
|
||||
|
@ -1348,6 +1348,7 @@ void conference_video_write_canvas_image_to_codec_group(conference_obj_t *confer
|
||||
}
|
||||
|
||||
if (switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_RECVONLY ||
|
||||
!conference_utils_member_test_flag(imember, MFLAG_CAN_SEE) ||
|
||||
switch_channel_test_flag(imember->channel, CF_VIDEO_WRITING) ||
|
||||
switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_INACTIVE) {
|
||||
switch_core_session_rwunlock(imember->session);
|
||||
@ -3256,6 +3257,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
|
||||
|
||||
if (switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_RECVONLY ||
|
||||
switch_channel_test_flag(imember->channel, CF_VIDEO_WRITING) ||
|
||||
!conference_utils_member_test_flag(imember, MFLAG_CAN_SEE) ||
|
||||
switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_INACTIVE) {
|
||||
switch_core_session_rwunlock(imember->session);
|
||||
continue;
|
||||
@ -3608,6 +3610,7 @@ void *SWITCH_THREAD_FUNC conference_video_super_muxing_thread_run(switch_thread_
|
||||
|
||||
if (switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_RECVONLY ||
|
||||
switch_channel_test_flag(imember->channel, CF_VIDEO_WRITING) ||
|
||||
!conference_utils_member_test_flag(imember, MFLAG_CAN_SEE) ||
|
||||
switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_INACTIVE) {
|
||||
switch_core_session_rwunlock(imember->session);
|
||||
continue;
|
||||
|
@ -1234,6 +1234,9 @@ void conference_xlist(conference_obj_t *conference, switch_xml_t x_conference, i
|
||||
x_tag = switch_xml_add_child_d(x_flags, "can_hear", count++);
|
||||
switch_xml_set_txt_d(x_tag, conference_utils_member_test_flag(member, MFLAG_CAN_HEAR) ? "true" : "false");
|
||||
|
||||
x_tag = switch_xml_add_child_d(x_flags, "can_see", count++);
|
||||
switch_xml_set_txt_d(x_tag, conference_utils_member_test_flag(member, MFLAG_CAN_SEE) ? "true" : "false");
|
||||
|
||||
x_tag = switch_xml_add_child_d(x_flags, "can_speak", count++);
|
||||
switch_xml_set_txt_d(x_tag, conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK) ? "true" : "false");
|
||||
|
||||
@ -2404,6 +2407,8 @@ conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_co
|
||||
char *join_only_sound = NULL;
|
||||
char *deaf_sound = NULL;
|
||||
char *undeaf_sound = NULL;
|
||||
char *blind_sound = NULL;
|
||||
char *unblind_sound = NULL;
|
||||
char *pin = NULL;
|
||||
char *mpin = NULL;
|
||||
char *pin_sound = NULL;
|
||||
@ -2650,6 +2655,10 @@ conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_co
|
||||
deaf_sound = val;
|
||||
} else if (!strcasecmp(var, "undeaf-sound") && !zstr(val)) {
|
||||
undeaf_sound = val;
|
||||
} else if (!strcasecmp(var, "blind-sound") && !zstr(val)) {
|
||||
blind_sound = val;
|
||||
} else if (!strcasecmp(var, "unblind-sound") && !zstr(val)) {
|
||||
unblind_sound = val;
|
||||
} else if (!strcasecmp(var, "member-flags") && !zstr(val)) {
|
||||
member_flags = val;
|
||||
} else if (!strcasecmp(var, "conference-flags") && !zstr(val)) {
|
||||
@ -3041,7 +3050,7 @@ conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_co
|
||||
conference->perpetual_sound = switch_core_strdup(conference->pool, perpetual_sound);
|
||||
}
|
||||
|
||||
conference->mflags[MFLAG_CAN_SPEAK] = conference->mflags[MFLAG_CAN_HEAR] = conference->mflags[MFLAG_CAN_BE_SEEN] = 1;
|
||||
conference->mflags[MFLAG_CAN_SPEAK] = conference->mflags[MFLAG_CAN_HEAR] = conference->mflags[MFLAG_CAN_BE_SEEN] = conference->mflags[MFLAG_CAN_SEE] = 1;
|
||||
|
||||
if (!zstr(moh_sound) && switch_is_moh(moh_sound)) {
|
||||
conference->moh_sound = switch_core_strdup(conference->pool, moh_sound);
|
||||
@ -3118,6 +3127,14 @@ conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_co
|
||||
conference->undeaf_sound = switch_core_strdup(conference->pool, undeaf_sound);
|
||||
}
|
||||
|
||||
if (!zstr(blind_sound)) {
|
||||
conference->blind_sound = switch_core_strdup(conference->pool, blind_sound);
|
||||
}
|
||||
|
||||
if (!zstr(unblind_sound)) {
|
||||
conference->unblind_sound = switch_core_strdup(conference->pool, unblind_sound);
|
||||
}
|
||||
|
||||
if (!zstr(pin)) {
|
||||
conference->pin = switch_core_strdup(conference->pool, pin);
|
||||
}
|
||||
|
@ -194,6 +194,8 @@ typedef enum {
|
||||
MFLAG_MOD,
|
||||
MFLAG_INDICATE_MUTE,
|
||||
MFLAG_INDICATE_UNMUTE,
|
||||
MFLAG_INDICATE_BLIND,
|
||||
MFLAG_INDICATE_UNBLIND,
|
||||
MFLAG_NOMOH,
|
||||
MFLAG_VIDEO_BRIDGE,
|
||||
MFLAG_INDICATE_MUTE_DETECT,
|
||||
@ -205,6 +207,7 @@ typedef enum {
|
||||
MFLAG_NO_POSITIONAL,
|
||||
MFLAG_JOIN_VID_FLOOR,
|
||||
MFLAG_RECEIVING_VIDEO,
|
||||
MFLAG_CAN_SEE,
|
||||
MFLAG_CAN_BE_SEEN,
|
||||
MFLAG_SECOND_SCREEN,
|
||||
MFLAG_SILENT,
|
||||
@ -344,7 +347,8 @@ typedef enum {
|
||||
EFLAG_RECORD = (1 << 27),
|
||||
EFLAG_HUP_MEMBER = (1 << 28),
|
||||
EFLAG_PLAY_FILE_DONE = (1 << 29),
|
||||
EFLAG_SET_POSITION_MEMBER = (1 << 30)
|
||||
EFLAG_SET_POSITION_MEMBER = (1 << 30),
|
||||
EFLAG_BLIND_MEMBER = (1 << 31)
|
||||
} event_type_t;
|
||||
|
||||
#ifdef OPENAL_POSITIONING
|
||||
@ -552,6 +556,8 @@ typedef struct conference_obj {
|
||||
char *unmuted_sound;
|
||||
char *deaf_sound;
|
||||
char *undeaf_sound;
|
||||
char *blind_sound;
|
||||
char *unblind_sound;
|
||||
char *locked_sound;
|
||||
char *is_locked_sound;
|
||||
char *is_unlocked_sound;
|
||||
@ -1073,6 +1079,9 @@ switch_status_t conference_api_sub_unmute(conference_member_t *member, switch_st
|
||||
switch_status_t conference_api_sub_vmute(conference_member_t *member, switch_stream_handle_t *stream, void *data);
|
||||
switch_status_t conference_api_sub_tvmute(conference_member_t *member, switch_stream_handle_t *stream, void *data);
|
||||
switch_status_t conference_api_sub_unvmute(conference_member_t *member, switch_stream_handle_t *stream, void *data);
|
||||
switch_status_t conference_api_sub_vblind(conference_member_t *member, switch_stream_handle_t *stream, void *data);
|
||||
switch_status_t conference_api_sub_tvblind(conference_member_t *member, switch_stream_handle_t *stream, void *data);
|
||||
switch_status_t conference_api_sub_unvblind(conference_member_t *member, switch_stream_handle_t *stream, void *data);
|
||||
switch_status_t conference_api_sub_deaf(conference_member_t *member, switch_stream_handle_t *stream, void *data);
|
||||
switch_status_t conference_api_sub_undeaf(conference_member_t *member, switch_stream_handle_t *stream, void *data);
|
||||
switch_status_t conference_api_sub_floor(conference_member_t *member, switch_stream_handle_t *stream, void *data);
|
||||
|
Loading…
x
Reference in New Issue
Block a user