[asterisk-commits] oej: trunk r336043 - in /trunk: ./ CHANGES CREDITS apps/app_meetme.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Sep 15 07:50:47 CDT 2011


Author: oej
Date: Thu Sep 15 07:50:40 2011
New Revision: 336043

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=336043
Log:
Merged revisions 336042 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/10

........
  r336042 | oej | 2011-09-15 14:46:38 +0200 (Tor, 15 Sep 2011) | 12 lines
  
  Meetme: Introducing a new option "k" to kill a conference if there's only a single member left.
  
  When using Meetme as a modular call bridge from third party applications, it's handy to make
  it behave like a normal call bridge. When the second to last person exists, the last person
  will be kicked out of the conference when this option is enabled.
  
  (closes issue ASTERISK-18234)
  
  Review: https://reviewboard.asterisk.org/r/1376/
  
  Patch by oej, sponsored by ClearIT, Solna, Sweden
........

Modified:
    trunk/   (props changed)
    trunk/CHANGES
    trunk/CREDITS
    trunk/apps/app_meetme.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-10-merged' - no diff available.

Modified: trunk/CHANGES
URL: http://svnview.digium.com/svn/asterisk/trunk/CHANGES?view=diff&rev=336043&r1=336042&r2=336043
==============================================================================
--- trunk/CHANGES (original)
+++ trunk/CHANGES Thu Sep 15 07:50:40 2011
@@ -230,6 +230,8 @@
 ------------
  * Added 'v' option to MeetMe to play voicemail greetings when a user joins/leaves
    a MeetMe conference
+ * Added 'k' option to MeetMe to automatically kill the conference when there's only
+   one participant left (much like a normal call bridge)
 
 Asterisk Database
 -----------------

Modified: trunk/CREDITS
URL: http://svnview.digium.com/svn/asterisk/trunk/CREDITS?view=diff&rev=336043&r1=336042&r2=336043
==============================================================================
--- trunk/CREDITS (original)
+++ trunk/CREDITS Thu Sep 15 07:50:40 2011
@@ -23,7 +23,7 @@
 Omnitor AB, Gunnar Hellström, for funding work with videocaps, T.140 RED,
 originate with video/text and many more contributions.
 
-ClearIT AB for work with RTCP, manager and tonezones
+ClearIT AB for work with meetme, res_mutestream, RTCP, manager and tonezones
 
 === WISHLIST CONTRIBUTERS ===
 Jeremy McNamara - SpeeX support

Modified: trunk/apps/app_meetme.c
URL: http://svnview.digium.com/svn/asterisk/trunk/apps/app_meetme.c?view=diff&rev=336043&r1=336042&r2=336043
==============================================================================
--- trunk/apps/app_meetme.c (original)
+++ trunk/apps/app_meetme.c Thu Sep 15 07:50:40 2011
@@ -123,6 +123,9 @@
 					</option>
 					<option name="I">
 						<para>Announce user join/leave without review.</para>
+					</option>
+					<option name="k">
+						<para>Close the conference if there's only one active participant left at exit.</para>
 					</option>
 					<option name="l">
 						<para>Set listen only mode (Listen only, no talking).</para>
@@ -542,6 +545,7 @@
 	ADMINFLAG_KICKME =    (1 << 3),  /*!< User has been kicked */
 	/*! User has requested to speak */
 	ADMINFLAG_T_REQUEST = (1 << 4),
+	ADMINFLAG_HANGUP = (1 << 5),	/*!< User will be leaving the conference */
 };
 
 #define MEETME_DELAYDETECTTALK     300
@@ -633,6 +637,8 @@
 #define CONFFLAG_NO_AUDIO_UNTIL_UP  (1ULL << 31)
 #define CONFFLAG_INTROMSG           (1ULL << 32) /*!< If set play an intro announcement at start of conference */
 #define CONFFLAG_INTROUSER_VMREC    (1ULL << 33)
+/*! If there's only one person left in a conference when someone leaves, kill the conference */
+#define CONFFLAG_KILL_LAST_MAN_STANDING ((uint64_t)1 << 34)
 
 enum {
 	OPT_ARG_WAITMARKED = 0,
@@ -660,6 +666,7 @@
 	AST_APP_OPTION_ARG('v', CONFFLAG_INTROUSER_VMREC , OPT_ARG_INTROUSER_VMREC),
 	AST_APP_OPTION('i', CONFFLAG_INTROUSER ),
 	AST_APP_OPTION('I', CONFFLAG_INTROUSERNOREVIEW ),
+	AST_APP_OPTION('k', CONFFLAG_KILL_LAST_MAN_STANDING ),
 	AST_APP_OPTION_ARG('M', CONFFLAG_MOH, OPT_ARG_MOH_CLASS ),
 	AST_APP_OPTION('m', CONFFLAG_STARTMUTED ),
 	AST_APP_OPTION('o', CONFFLAG_OPTIMIZETALKER ),
@@ -2190,6 +2197,17 @@
 			send_talking_event(chan, conf, user, now_talking);
 		}
 	}
+}
+
+static int user_set_hangup_cb(void *obj, void *check_admin_arg, int flags)
+{
+	struct ast_conf_user *user = obj;
+	/* actual pointer contents of check_admin_arg is irrelevant */
+
+	if (!check_admin_arg || (check_admin_arg && !ast_test_flag64(&user->userflags, CONFFLAG_ADMIN))) {
+		user->adminflags |= ADMINFLAG_HANGUP;
+	}
+	return 0;
 }
 
 static int user_set_kickme_cb(void *obj, void *check_admin_arg, int flags)
@@ -3171,7 +3189,13 @@
 							      "Status: off\r\n",
 							     chan->name, chan->uniqueid, conf->confno, user->user_no);
 			}
-			
+
+			/* If user have been hung up, exit the conference */
+			if (user->adminflags & ADMINFLAG_HANGUP) {
+				ret = 0;
+				break;
+			}
+
 			/* If I have been kicked, exit the conference */
 			if (user->adminflags & ADMINFLAG_KICKME) {
 				/* You have been kicked. */
@@ -3859,6 +3883,11 @@
 			ast_devstate_changed(AST_DEVICE_NOT_INUSE, "meetme:%s", conf->confno);
 		}
 
+ 		/* This flag is meant to kill a conference with only one participant remaining.  */
+		if (conf->users == 1 && ast_test_flag64(confflags, CONFFLAG_KILL_LAST_MAN_STANDING)) {
+ 			ao2_callback(conf->usercontainer, 0, user_set_hangup_cb, NULL);
+ 		}
+
 		/* Return the number of seconds the user was in the conf */
 		snprintf(meetmesecs, sizeof(meetmesecs), "%d", (int) (time(NULL) - user->jointime));
 		pbx_builtin_setvar_helper(chan, "MEETMESECS", meetmesecs);




More information about the asterisk-commits mailing list