From 03e87faac125dca0acd5a15fdb3d7cd6a084e8f9 Mon Sep 17 00:00:00 2001
From: Luis Azedo <luis@2600hz.com>
Date: Thu, 15 Sep 2016 14:12:59 +0000
Subject: [PATCH] FS-9518 [mod_conference] allow deaf only command in
 caller-controls

---
 .../mod_conference/conference_loop.c          | 37 ++++++++++++++++++-
 .../mod_conference/mod_conference.h           |  3 ++
 2 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/src/mod/applications/mod_conference/conference_loop.c b/src/mod/applications/mod_conference/conference_loop.c
index 32d452b14f..798af88621 100644
--- a/src/mod/applications/mod_conference/conference_loop.c
+++ b/src/mod/applications/mod_conference/conference_loop.c
@@ -67,7 +67,10 @@ struct _mapping control_mappings[] = {
 	{"execute_application", conference_loop_exec_app},
 	{"floor", conference_loop_floor_toggle},
 	{"vid-floor", conference_loop_vid_floor_toggle},
-	{"vid-floor-force", conference_loop_vid_floor_force}
+	{"vid-floor-force", conference_loop_vid_floor_force},
+	{"deaf", conference_loop_deaf_toggle},
+	{"deaf on", conference_loop_deaf_on},
+	{"deaf off", conference_loop_deaf_off}
 };
 
 int conference_loop_mapping_len()
@@ -228,6 +231,38 @@ void conference_loop_lock_toggle(conference_member_t *member, caller_control_act
 
 }
 
+void conference_loop_deaf_toggle(conference_member_t *member, caller_control_action_t *action)
+{
+	if (member == NULL)
+		return;
+
+	if (conference_utils_member_test_flag(member, MFLAG_CAN_HEAR)) {
+		conference_api_sub_deaf(member, NULL, NULL);
+	} else {
+		conference_api_sub_undeaf(member, NULL, NULL);
+	}
+}
+
+void conference_loop_deaf_on(conference_member_t *member, caller_control_action_t *action)
+{
+	if (member == NULL)
+		return;
+
+	if (conference_utils_member_test_flag(member, MFLAG_CAN_HEAR)) {
+		conference_api_sub_deaf(member, NULL, NULL);
+	}
+}
+
+void conference_loop_deaf_off(conference_member_t *member, caller_control_action_t *action)
+{
+	if (member == NULL)
+		return;
+
+	if (!conference_utils_member_test_flag(member, MFLAG_CAN_HEAR)) {
+		conference_api_sub_undeaf(member, NULL, NULL);
+	}
+}
+
 void conference_loop_deafmute_toggle(conference_member_t *member, caller_control_action_t *action)
 {
 	if (member == NULL)
diff --git a/src/mod/applications/mod_conference/mod_conference.h b/src/mod/applications/mod_conference/mod_conference.h
index b5a9bfa1ac..c812bc1160 100644
--- a/src/mod/applications/mod_conference/mod_conference.h
+++ b/src/mod/applications/mod_conference/mod_conference.h
@@ -1151,6 +1151,9 @@ void conference_loop_mute_off(conference_member_t *member, caller_control_action
 void conference_loop_event(conference_member_t *member, caller_control_action_t *action);
 void conference_loop_transfer(conference_member_t *member, caller_control_action_t *action);
 void conference_loop_exec_app(conference_member_t *member, caller_control_action_t *action);
+void conference_loop_deaf_toggle(conference_member_t *member, caller_control_action_t *action);
+void conference_loop_deaf_on(conference_member_t *member, caller_control_action_t *action);
+void conference_loop_deaf_off(conference_member_t *member, caller_control_action_t *action);