From 2923086dafb971d603c27a0fd9eea235d4b88f52 Mon Sep 17 00:00:00 2001
From: Jeff Peeler <jpeeler@digium.com>
Date: Fri, 11 Dec 2009 23:17:09 +0000
Subject: [PATCH] Merged revisions 234379 via svnmerge from
 https://origsvn.digium.com/svn/asterisk/branches/1.4

........
  r234379 | jpeeler | 2009-12-11 16:37:21 -0600 (Fri, 11 Dec 2009) | 11 lines

  Fix talking detection status after conference user is muted.

  This patch ensures that when a conference user is muted that the accompanying
  AMI Meetme talking off event is sent. Also, the meetme list output is updated
  to show the muted user as unmonitored.

  (closes issue #16247)
  Reported by: dimas
  Patches:
        v3-16247.patch uploaded by dimas (license 88)
........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@234380 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 apps/app_meetme.c | 57 ++++++++++++++++++++++++++++++-----------------
 1 file changed, 37 insertions(+), 20 deletions(-)

diff --git a/apps/app_meetme.c b/apps/app_meetme.c
index 4dde2ba59e..09ec408e47 100644
--- a/apps/app_meetme.c
+++ b/apps/app_meetme.c
@@ -2051,6 +2051,35 @@ static int can_write(struct ast_channel *chan, struct ast_flags64 *confflags)
 	return (chan->_state == AST_STATE_UP);
 }
 
+static void send_talking_event(struct ast_channel *chan, struct ast_conference *conf, struct ast_conf_user *user, int talking)
+{
+	ast_manager_event(chan, EVENT_FLAG_CALL, "MeetmeTalking",
+	      "Channel: %s\r\n"
+	      "Uniqueid: %s\r\n"
+	      "Meetme: %s\r\n"
+	      "Usernum: %d\r\n"
+	      "Status: %s\r\n",
+	      chan->name, chan->uniqueid, conf->confno, user->user_no, talking ? "on" : "off");
+}
+
+static void set_user_talking(struct ast_channel *chan, struct ast_conference *conf, struct ast_conf_user *user, int talking, int monitor)
+{
+	int last_talking = user->talking;
+	if (last_talking == talking)
+		return;
+
+	user->talking = talking;
+
+	if (monitor) {
+		/* Check if talking state changed. Take care of -1 which means unmonitored */
+		int was_talking = (last_talking > 0);
+		int now_talking = (talking > 0);
+		if (was_talking != now_talking) {
+			send_talking_event(chan, conf, user, now_talking);
+		}
+	}
+}
+
 static int conf_run(struct ast_channel *chan, struct ast_conference *conf, struct ast_flags64 *confflags, char *optargs[])
 {
 	struct ast_conf_user *user = NULL;
@@ -2865,6 +2894,11 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, struc
 					break;
 				}
 
+				/* Indicate user is not talking anymore - change him to unmonitored state */
+				if (ast_test_flag64(confflags,  (CONFFLAG_MONITORTALKER | CONFFLAG_OPTIMIZETALKER))) {
+					set_user_talking(chan, conf, user, -1, ast_test_flag64(confflags, CONFFLAG_MONITORTALKER));
+				}
+
 				ast_manager_event(chan, EVENT_FLAG_CALL, "MeetmeMute",
 						"Channel: %s\r\n"
 						"Uniqueid: %s\r\n"
@@ -2975,28 +3009,11 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, struc
 
 						res = ast_dsp_silence(dsp, f, &totalsilence);
 						if (!user->talking && totalsilence < MEETME_DELAYDETECTTALK) {
-							user->talking = 1;
-							if (ast_test_flag64(confflags, CONFFLAG_MONITORTALKER)) {
-								ast_manager_event(chan, EVENT_FLAG_CALL, "MeetmeTalking",
-								      "Channel: %s\r\n"
-								      "Uniqueid: %s\r\n"
-								      "Meetme: %s\r\n"
-								      "Usernum: %d\r\n"
-								      "Status: on\r\n",
-								      chan->name, chan->uniqueid, conf->confno, user->user_no);
-							}
+							set_user_talking(chan, conf, user, 1, ast_test_flag64(confflags, CONFFLAG_MONITORTALKER));
 						}
+
 						if (user->talking && totalsilence > MEETME_DELAYDETECTENDTALK) {
-							user->talking = 0;
-							if (ast_test_flag64(confflags, CONFFLAG_MONITORTALKER)) {
-								ast_manager_event(chan, EVENT_FLAG_CALL, "MeetmeTalking",
-								      "Channel: %s\r\n"
-								      "Uniqueid: %s\r\n"
-								      "Meetme: %s\r\n"
-								      "Usernum: %d\r\n"
-								      "Status: off\r\n",
-								      chan->name, chan->uniqueid, conf->confno, user->user_no);
-							}
+							set_user_talking(chan, conf, user, 0, ast_test_flag64(confflags, CONFFLAG_MONITORTALKER));
 						}
 					}
 					if (using_pseudo) {
-- 
GitLab