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);
{"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]"},
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;
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);
}
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);
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;
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;
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");
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;
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)) {
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);
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);
}
MFLAG_MOD,
MFLAG_INDICATE_MUTE,
MFLAG_INDICATE_UNMUTE,
+ MFLAG_INDICATE_BLIND,
+ MFLAG_INDICATE_UNBLIND,
MFLAG_NOMOH,
MFLAG_VIDEO_BRIDGE,
MFLAG_INDICATE_MUTE_DETECT,
MFLAG_NO_POSITIONAL,
MFLAG_JOIN_VID_FLOOR,
MFLAG_RECEIVING_VIDEO,
+ MFLAG_CAN_SEE,
MFLAG_CAN_BE_SEEN,
MFLAG_SECOND_SCREEN,
MFLAG_SILENT,
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
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;
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);