Index: apps/app_meetme.c =================================================================== RCS file: /usr/cvsroot/asterisk/apps/app_meetme.c,v retrieving revision 1.91 diff -u -r1.91 app_meetme.c --- apps/app_meetme.c 21 Mar 2005 03:23:05 -0000 1.91 +++ apps/app_meetme.c 28 Mar 2005 06:22:22 -0000 @@ -191,12 +191,13 @@ #define CONFFLAG_EMPTYNOPIN (1 << 20) #define CONFFLAG_ALWAYSPROMPT (1 << 21) #define CONFFLAG_ANNOUNCEUSERCOUNT (1 << 22) /* If set, when user joins the conference, they will be told the number of users that are already in */ - +#define CONFFLAG_MONITORTALKERMUTED (1 << 23) /* If set, user will be muted when not speaking, (NEED MONITORTALKER FLAG) */ AST_DECLARE_OPTIONS(meetme_opts,{ ['a'] = { CONFFLAG_ADMIN }, ['c'] = { CONFFLAG_ANNOUNCEUSERCOUNT }, ['T'] = { CONFFLAG_MONITORTALKER }, + ['o'] = { CONFFLAG_MONITORTALKERMUTED }, ['i'] = { CONFFLAG_INTROUSER }, ['m'] = { CONFFLAG_MONITOR }, ['p'] = { CONFFLAG_POUNDEXIT }, @@ -593,6 +594,7 @@ int menu_active = 0; int using_pseudo = 0; int duration=20; + int lastmonitor=-1; struct ast_dsp *dsp=NULL; struct ast_app *app; @@ -1038,10 +1040,11 @@ int totalsilence; if (user->talking == -1) user->talking = 0; - + lastmonitor = 0; res = ast_dsp_silence(dsp, f, &totalsilence); if (!user->talking && totalsilence < MEETME_DELAYDETECTTALK) { user->talking = 1; + lastmonitor = 1; manager_event(EVENT_FLAG_CALL, "MeetmeTalking", "Channel: %s\r\n" "Uniqueid: %s\r\n" @@ -1051,6 +1054,7 @@ } if (user->talking && totalsilence > MEETME_DELAYDETECTENDTALK) { user->talking = 0; + lastmonitor = 1; manager_event(EVENT_FLAG_CALL, "MeetmeStopTalking", "Channel: %s\r\n" "Uniqueid: %s\r\n" @@ -1058,6 +1062,23 @@ "Usernum: %i\r\n", chan->name, chan->uniqueid, conf->confno, user->user_no); } + if (confflags & CONFFLAG_MONITORTALKERMUTED && lastmonitor == 1) { + if (user->talking == 0) { // Stop talking + ztc.confmode = ZT_CONF_CONF | ZT_CONF_LISTENER; + confflags |= CONFFLAG_MONITOR ^ CONFFLAG_TALKER; + } + if (user->talking == 1) { // Start talking + ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER; + confflags ^= CONFFLAG_MONITOR | CONFFLAG_TALKER; + } + + if (ioctl(fd, ZT_SETCONF, &ztc)) { + ast_log(LOG_WARNING, "Error setting conference - Un/Mute \n"); + ret = -1; + break; + } + } + } if (using_pseudo) { /* Carefully write */ @@ -1106,8 +1127,8 @@ case '1': /* Un/Mute */ menu_active = 0; if (ztc.confmode & ZT_CONF_TALKER) { - ztc.confmode = ZT_CONF_CONF | ZT_CONF_LISTENER; - confflags |= CONFFLAG_MONITOR ^ CONFFLAG_TALKER; + ztc.confmode = ZT_CONF_CONF | ZT_CONF_LISTENER; + confflags |= CONFFLAG_MONITOR ^ CONFFLAG_TALKER; } else { ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER; confflags ^= CONFFLAG_MONITOR | CONFFLAG_TALKER; @@ -1171,8 +1192,8 @@ case '1': /* Un/Mute */ menu_active = 0; if (ztc.confmode & ZT_CONF_TALKER) { - ztc.confmode = ZT_CONF_CONF | ZT_CONF_LISTENER; - confflags |= CONFFLAG_MONITOR ^ CONFFLAG_TALKER; + ztc.confmode = ZT_CONF_CONF | ZT_CONF_LISTENER; + confflags |= CONFFLAG_MONITOR ^ CONFFLAG_TALKER; } else if (!(user->adminflags & ADMINFLAG_MUTED)) { ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER; confflags ^= CONFFLAG_MONITOR | CONFFLAG_TALKER;