From 2923086dafb971d603c27a0fd9eea235d4b88f52 Mon Sep 17 00:00:00 2001 From: Jeff Peeler Date: Fri, 11 Dec 2009 23:17:09 +0000 Subject: 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(-) (limited to 'apps') diff --git a/apps/app_meetme.c b/apps/app_meetme.c index 4dde2ba59..09ec408e4 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) { -- cgit v1.2.3