From: Olle Johansson Date: Thu, 15 Sep 2011 12:46:38 +0000 (+0000) Subject: Meetme: Introducing a new option "k" to kill a conference if there's only a single... X-Git-Tag: 10.0.0-beta2~50 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9795ec3ef0fe26bfba001f7d95412fbee4cd49be;p=thirdparty%2Fasterisk.git 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 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@336042 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/CHANGES b/CHANGES index fb9ed204c9..331415bc8b 100644 --- a/CHANGES +++ b/CHANGES @@ -201,6 +201,8 @@ Applications ------------ * 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 ----------------- diff --git a/CREDITS b/CREDITS index a9e968799a..b93044d0de 100644 --- a/CREDITS +++ b/CREDITS @@ -23,6 +23,8 @@ John Todd, TalkPlus, Inc. and JR Richardson, Ntegrated Solutions. - for funding 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 meetme, res_mutestream, RTCP, manager and tonezones + === WISHLIST CONTRIBUTERS === Jeremy McNamara - SpeeX support Nick Seraphin - RDNIS support diff --git a/apps/app_meetme.c b/apps/app_meetme.c index b4fa0972c0..b9b46cda93 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -124,6 +124,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") + @@ -542,6 +545,7 @@ enum { 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 @@ enum { #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_OPTIONS(meetme_opts, BEGIN_OPTIONS 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 ), @@ -2192,6 +2199,17 @@ static void set_user_talking(struct ast_channel *chan, struct ast_conference *co } } +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) { struct ast_conf_user *user = obj; @@ -3171,7 +3189,13 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, struc "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 @@ bailoutandtrynormal: 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);