[asterisk-commits] jrose: branch 11 r379892 - in /branches/11: ./ apps/app_meetme.c sounds/Makefile

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Jan 22 13:07:45 CST 2013


Author: jrose
Date: Tue Jan 22 13:07:42 2013
New Revision: 379892

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=379892
Log:
app_meetme: Use new prompts for administrator menu

The old prompts for the administrator menu were inadequate. They didn't mention
that the menu had additional options through the 8 key and pressing the 8 key
wouldn't reveal what those options were. This patch fixes all of that while
also organizing code pertaining to each individual menu type which was
previously all stored in one gigantic function along with many of the basic
conference functions.

(closes issue AST-996)
Reported by: John Bigelow
Review: http://reviewboard.digium.internal/r/360/
........

Merged revisions 379885 from http://svn.asterisk.org/svn/asterisk/branches/1.8

Modified:
    branches/11/   (props changed)
    branches/11/apps/app_meetme.c
    branches/11/sounds/Makefile

Propchange: branches/11/
------------------------------------------------------------------------------
--- branch-1.8-merged (original)
+++ branch-1.8-merged Tue Jan 22 13:07:42 2013
@@ -1,1 +1,1 @@
-/branches/1.8:1-378147,378164,378356,378375,378427,378455-378456,378486,378514,378554,378591,378733,378776,378933,378967,379001,379145,379178,379226,379276,379310,379342,379392,379547,379608,379718,379825
+/branches/1.8:1-378147,378164,378356,378375,378427,378455-378456,378486,378514,378554,378591,378733,378776,378933,378967,379001,379145,379178,379226,379276,379310,379342,379392,379547,379608,379718,379825,379885

Modified: branches/11/apps/app_meetme.c
URL: http://svnview.digium.com/svn/asterisk/branches/11/apps/app_meetme.c?view=diff&rev=379892&r1=379891&r2=379892
==============================================================================
--- branches/11/apps/app_meetme.c (original)
+++ branches/11/apps/app_meetme.c Tue Jan 22 13:07:42 2013
@@ -2365,6 +2365,428 @@
 	return 0;
 }
 
+enum menu_modes {
+	MENU_DISABLED = 0,
+	MENU_NORMAL,
+	MENU_ADMIN,
+	MENU_ADMIN_EXTENDED,
+};
+
+/*! \internal
+ * \brief Processes menu options for the standard menu (accessible through the 's' option for app_meetme)
+ *
+ * \param menu_mode a pointer to the currently active menu_mode.
+ * \param dtmf a pointer to the dtmf value currently being processed against the menu.
+ * \param conf the active conference for which the user has called the menu from.
+ * \param confflags flags used by conf for various options
+ * \param chan ast_channel belonging to the user who called the menu
+ * \param user which meetme conference user invoked the menu
+ */
+static void meetme_menu_normal(enum menu_modes *menu_mode, int *dtmf, struct ast_conference *conf, struct ast_flags64 *confflags, struct ast_channel *chan, struct ast_conf_user *user)
+{
+	switch (*dtmf) {
+	case '1': /* Un/Mute */
+		*menu_mode = MENU_DISABLED;
+
+		/* user can only toggle the self-muted state */
+		user->adminflags ^= ADMINFLAG_SELFMUTED;
+
+		/* they can't override the admin mute state */
+		if (ast_test_flag64(confflags, CONFFLAG_MONITOR) || (user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED))) {
+			if (!ast_streamfile(chan, "conf-muted", ast_channel_language(chan))) {
+				ast_waitstream(chan, "");
+			}
+		} else {
+			if (!ast_streamfile(chan, "conf-unmuted", ast_channel_language(chan))) {
+				ast_waitstream(chan, "");
+			}
+		}
+		break;
+
+	case '2':
+		*menu_mode = MENU_DISABLED;
+		if (user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) {
+			user->adminflags |= ADMINFLAG_T_REQUEST;
+		}
+
+		if (user->adminflags & ADMINFLAG_T_REQUEST) {
+			if (!ast_streamfile(chan, "beep", ast_channel_language(chan))) {
+				ast_waitstream(chan, "");
+			}
+		}
+		break;
+
+	case '4':
+		tweak_listen_volume(user, VOL_DOWN);
+		break;
+	case '5':
+		/* Extend RT conference */
+		if (rt_schedule) {
+			rt_extend_conf(conf->confno);
+		}
+		*menu_mode = MENU_DISABLED;
+		break;
+
+	case '6':
+		tweak_listen_volume(user, VOL_UP);
+		break;
+
+	case '7':
+		tweak_talk_volume(user, VOL_DOWN);
+		break;
+
+	case '8':
+		*menu_mode = MENU_DISABLED;
+		break;
+
+	case '9':
+		tweak_talk_volume(user, VOL_UP);
+		break;
+
+	default:
+		*menu_mode = MENU_DISABLED;
+		if (!ast_streamfile(chan, "conf-errormenu", ast_channel_language(chan))) {
+			ast_waitstream(chan, "");
+		}
+		break;
+	}
+}
+
+/*! \internal
+ * \brief Processes menu options for the adminstrator menu (accessible through the 's' option for app_meetme)
+ *
+ * \param menu_mode a pointer to the currently active menu_mode.
+ * \param dtmf a pointer to the dtmf value currently being processed against the menu.
+ * \param conf the active conference for which the user has called the menu from.
+ * \param confflags flags used by conf for various options
+ * \param chan ast_channel belonging to the user who called the menu
+ * \param user which meetme conference user invoked the menu
+ */
+static void meetme_menu_admin(enum menu_modes *menu_mode, int *dtmf, struct ast_conference *conf, struct ast_flags64 *confflags, struct ast_channel *chan, struct ast_conf_user *user)
+{
+	switch(*dtmf) {
+	case '1': /* Un/Mute */
+		*menu_mode = MENU_DISABLED;
+		/* for admin, change both admin and use flags */
+		if (user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) {
+			user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED);
+		} else {
+			user->adminflags |= (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED);
+		}
+
+		if (ast_test_flag64(confflags, CONFFLAG_MONITOR) || (user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED))) {
+			if (!ast_streamfile(chan, "conf-muted", ast_channel_language(chan))) {
+				ast_waitstream(chan, "");
+			}
+		} else {
+			if (!ast_streamfile(chan, "conf-unmuted", ast_channel_language(chan))) {
+				ast_waitstream(chan, "");
+			}
+		}
+		break;
+
+	case '2': /* Un/Lock the Conference */
+		*menu_mode = MENU_DISABLED;
+		if (conf->locked) {
+			conf->locked = 0;
+			if (!ast_streamfile(chan, "conf-unlockednow", ast_channel_language(chan))) {
+				ast_waitstream(chan, "");
+			}
+		} else {
+			conf->locked = 1;
+			if (!ast_streamfile(chan, "conf-lockednow", ast_channel_language(chan))) {
+				ast_waitstream(chan, "");
+			}
+		}
+		break;
+
+	case '3': /* Eject last user */
+	{
+		struct ast_conf_user *usr = NULL;
+		int max_no = 0;
+		ao2_callback(conf->usercontainer, OBJ_NODATA, user_max_cmp, &max_no);
+		*menu_mode = MENU_DISABLED;
+		usr = ao2_find(conf->usercontainer, &max_no, 0);
+		if ((ast_channel_name(usr->chan) == ast_channel_name(chan)) || ast_test_flag64(&usr->userflags, CONFFLAG_ADMIN)) {
+			if (!ast_streamfile(chan, "conf-errormenu", ast_channel_language(chan))) {
+				ast_waitstream(chan, "");
+			}
+		} else {
+			usr->adminflags |= ADMINFLAG_KICKME;
+		}
+		ao2_ref(usr, -1);
+		ast_stopstream(chan);
+		break;
+	}
+
+	case '4':
+		tweak_listen_volume(user, VOL_DOWN);
+		break;
+
+	case '5':
+		/* Extend RT conference */
+		if (rt_schedule) {
+			if (!rt_extend_conf(conf->confno)) {
+				if (!ast_streamfile(chan, "conf-extended", ast_channel_language(chan))) {
+					ast_waitstream(chan, "");
+				}
+			} else {
+				if (!ast_streamfile(chan, "conf-nonextended", ast_channel_language(chan))) {
+					ast_waitstream(chan, "");
+				}
+			}
+			ast_stopstream(chan);
+		}
+		*menu_mode = MENU_DISABLED;
+		break;
+
+	case '6':
+		tweak_listen_volume(user, VOL_UP);
+		break;
+
+	case '7':
+		tweak_talk_volume(user, VOL_DOWN);
+		break;
+
+	case '8':
+		if (!ast_streamfile(chan, "conf-adminmenu-menu8", ast_channel_language(chan))) {
+			/* If the user provides DTMF while playing the sound, we want to drop right into the extended menu function with new DTMF once we get out of here. */
+			*dtmf = ast_waitstream(chan, AST_DIGIT_ANY);
+			ast_stopstream(chan);
+		}
+		*menu_mode = MENU_ADMIN_EXTENDED;
+		break;
+
+	case '9':
+		tweak_talk_volume(user, VOL_UP);
+		break;
+	default:
+		menu_mode = MENU_DISABLED;
+		/* Play an error message! */
+		if (!ast_streamfile(chan, "conf-errormenu", ast_channel_language(chan))) {
+			ast_waitstream(chan, "");
+		}
+		break;
+	}
+
+}
+
+/*! \internal
+ * \brief Processes menu options for the extended administrator menu (accessible through option 8 on the administrator menu)
+ *
+ * \param menu_mode a pointer to the currently active menu_mode.
+ * \param dtmf a pointer to the dtmf value currently being processed against the menu.
+ * \param conf the active conference for which the user has called the menu from.
+ * \param confflags flags used by conf for various options
+ * \param chan ast_channel belonging to the user who called the menu
+ * \param user which meetme conference user invoked the menu
+ * \param recordingtmp character buffer which may hold the name of the conference recording file
+ * \param dahdic dahdi configuration info used by the main conference loop
+ */
+static void meetme_menu_admin_extended(enum menu_modes *menu_mode, int *dtmf, struct ast_conference *conf, struct ast_flags64 *confflags, struct ast_channel *chan, struct ast_conf_user *user, char *recordingtmp, struct dahdi_confinfo *dahdic, struct ast_format_cap *cap_slin)
+{
+	int keepplaying;
+	int playednamerec;
+	int res;
+	struct ao2_iterator user_iter;
+	struct ast_conf_user *usr = NULL;
+
+	switch(*dtmf) {
+	case '1': /* *81 Roll call */
+		keepplaying = 1;
+		playednamerec = 0;
+		if (conf->users == 1) {
+			if (keepplaying && !ast_streamfile(chan, "conf-onlyperson", ast_channel_language(chan))) {
+				res = ast_waitstream(chan, AST_DIGIT_ANY);
+				ast_stopstream(chan);
+				if (res > 0) {
+					keepplaying = 0;
+				}
+			}
+		} else if (conf->users == 2) {
+			if (keepplaying && !ast_streamfile(chan, "conf-onlyone", ast_channel_language(chan))) {
+				res = ast_waitstream(chan, AST_DIGIT_ANY);
+				ast_stopstream(chan);
+				if (res > 0) {
+					keepplaying = 0;
+				}
+			}
+		} else {
+			if (keepplaying && !ast_streamfile(chan, "conf-thereare", ast_channel_language(chan))) {
+				res = ast_waitstream(chan, AST_DIGIT_ANY);
+				ast_stopstream(chan);
+				if (res > 0) {
+					keepplaying = 0;
+				}
+			}
+			if (keepplaying) {
+				res = ast_say_number(chan, conf->users - 1, AST_DIGIT_ANY, ast_channel_language(chan), (char *) NULL);
+				ast_stopstream(chan);
+				if (res > 0) {
+					keepplaying = 0;
+				}
+			}
+			if (keepplaying && !ast_streamfile(chan, "conf-otherinparty", ast_channel_language(chan))) {
+				res = ast_waitstream(chan, AST_DIGIT_ANY);
+				ast_stopstream(chan);
+				if (res > 0) {
+					keepplaying = 0;
+				}
+			}
+		}
+		user_iter = ao2_iterator_init(conf->usercontainer, 0);
+		while((usr = ao2_iterator_next(&user_iter))) {
+			if (ast_fileexists(usr->namerecloc, NULL, NULL)) {
+				if (keepplaying && !ast_streamfile(chan, usr->namerecloc, ast_channel_language(chan))) {
+					res = ast_waitstream(chan, AST_DIGIT_ANY);
+					ast_stopstream(chan);
+					if (res > 0) {
+						keepplaying = 0;
+					}
+				}
+				playednamerec = 1;
+			}
+			ao2_ref(usr, -1);
+		}
+		ao2_iterator_destroy(&user_iter);
+		if (keepplaying && playednamerec && !ast_streamfile(chan, "conf-roll-callcomplete", ast_channel_language(chan))) {
+			res = ast_waitstream(chan, AST_DIGIT_ANY);
+			ast_stopstream(chan);
+			if (res > 0) {
+				keepplaying = 0;
+			}
+		}
+
+		*menu_mode = MENU_DISABLED;
+		break;
+
+	case '2': /* *82 Eject all non-admins */
+		if (conf->users == 1) {
+			if(!ast_streamfile(chan, "conf-errormenu", ast_channel_language(chan))) {
+				ast_waitstream(chan, "");
+			}
+		} else {
+			ao2_callback(conf->usercontainer, OBJ_NODATA, user_set_kickme_cb, &conf);
+		}
+		ast_stopstream(chan);
+		*menu_mode = MENU_DISABLED;
+		break;
+
+	case '3': /* *83 (Admin) mute/unmute all non-admins */
+		if(conf->gmuted) {
+			conf->gmuted = 0;
+			ao2_callback(conf->usercontainer, OBJ_NODATA, user_set_unmuted_cb, &conf);
+			if (!ast_streamfile(chan, "conf-now-unmuted", ast_channel_language(chan))) {
+				ast_waitstream(chan, "");
+			}
+		} else {
+			conf->gmuted = 1;
+			ao2_callback(conf->usercontainer, OBJ_NODATA, user_set_muted_cb, &conf);
+			if (!ast_streamfile(chan, "conf-now-muted", ast_channel_language(chan))) {
+				ast_waitstream(chan, "");
+			}
+		}
+		ast_stopstream(chan);
+		*menu_mode = MENU_DISABLED;
+		break;
+
+	case '4': /* *84 Record conference */
+		if (conf->recording != MEETME_RECORD_ACTIVE) {
+			ast_set_flag64(confflags, CONFFLAG_RECORDCONF);
+			if (!conf->recordingfilename) {
+				const char *var;
+				ast_channel_lock(chan);
+				if ((var = pbx_builtin_getvar_helper(chan, "MEETME_RECORDINGFILE"))) {
+					conf->recordingfilename = ast_strdup(var);
+				}
+				if ((var = pbx_builtin_getvar_helper(chan, "MEETME_RECORDINGFORMAT"))) {
+					conf->recordingformat = ast_strdup(var);
+				}
+				ast_channel_unlock(chan);
+				if (!conf->recordingfilename) {
+					snprintf(recordingtmp, sizeof(recordingtmp), "meetme-conf-rec-%s-%s", conf->confno, ast_channel_uniqueid(chan));
+					conf->recordingfilename = ast_strdup(recordingtmp);
+				}
+				if (!conf->recordingformat) {
+					conf->recordingformat = ast_strdup("wav");
+				}
+				ast_verb(4, "Starting recording of MeetMe Conference %s into file %s.%s.\n",
+				conf->confno, conf->recordingfilename, conf->recordingformat);
+			}
+
+			ast_mutex_lock(&conf->recordthreadlock);
+			if ((conf->recordthread == AST_PTHREADT_NULL) && ast_test_flag64(confflags, CONFFLAG_RECORDCONF) && ((conf->lchan = ast_request("DAHDI", cap_slin, chan, "pseudo", NULL)))) {
+				ast_set_read_format_by_id(conf->lchan, AST_FORMAT_SLINEAR);
+				ast_set_write_format_by_id(conf->lchan, AST_FORMAT_SLINEAR);
+				dahdic->chan = 0;
+				dahdic->confno = conf->dahdiconf;
+				dahdic->confmode = DAHDI_CONF_CONFANN | DAHDI_CONF_CONFANNMON;
+				if (ioctl(ast_channel_fd(conf->lchan, 0), DAHDI_SETCONF, dahdic)) {
+					ast_log(LOG_WARNING, "Error starting listen channel\n");
+					ast_hangup(conf->lchan);
+					conf->lchan = NULL;
+				} else {
+					ast_pthread_create_detached_background(&conf->recordthread, NULL, recordthread, conf);
+				}
+			}
+			ast_mutex_unlock(&conf->recordthreadlock);
+			if (!ast_streamfile(chan, "conf-now-recording", ast_channel_language(chan))) {
+				ast_waitstream(chan, "");
+			}
+		}
+
+		ast_stopstream(chan);
+		*menu_mode = MENU_DISABLED;
+		break;
+
+	case '8': /* *88 Exit the menu and return to the conference... without an error message */
+		ast_stopstream(chan);
+		*menu_mode = MENU_DISABLED;
+		break;
+
+	default:
+		if (!ast_streamfile(chan, "conf-errormenu", ast_channel_language(chan))) {
+			ast_waitstream(chan, "");
+		}
+		ast_stopstream(chan);
+		*menu_mode = MENU_DISABLED;
+		break;
+	}
+}
+
+/*! \internal
+ * \brief Processes menu options for the various menu types (accessible through the 's' option for app_meetme)
+ *
+ * \param menu_mode a pointer to the currently active menu_mode.
+ * \param dtmf a pointer to the dtmf value currently being processed against the menu.
+ * \param conf the active conference for which the user has called the menu from.
+ * \param confflags flags used by conf for various options
+ * \param chan ast_channel belonging to the user who called the menu
+ * \param user which meetme conference user invoked the menu
+ * \param recordingtmp character buffer which may hold the name of the conference recording file
+ * \param dahdic dahdi configuration info used by the main conference loop
+ */
+
+static void meetme_menu(enum menu_modes *menu_mode, int *dtmf, struct ast_conference *conf, struct ast_flags64 *confflags, struct ast_channel *chan, struct ast_conf_user *user, char *recordingtmp, struct dahdi_confinfo *dahdic, struct ast_format_cap *cap_slin)
+{
+	switch (*menu_mode) {
+	case MENU_DISABLED:
+		break;
+	case MENU_NORMAL:
+		meetme_menu_normal(menu_mode, dtmf, conf, confflags, chan, user);
+		break;
+	case MENU_ADMIN:
+		meetme_menu_admin(menu_mode, dtmf, conf, confflags, chan, user);
+		/* Admin Menu is capable of branching into another menu, in which case it will reset dtmf and change the menu mode. */
+		if (*menu_mode != MENU_ADMIN_EXTENDED || (*dtmf <= 0)) {
+			break;
+		}
+	case MENU_ADMIN_EXTENDED:
+		meetme_menu_admin_extended(menu_mode, dtmf, conf, confflags, chan, user, recordingtmp, dahdic, cap_slin);
+		break;
+	}
+}
+
 static int conf_run(struct ast_channel *chan, struct ast_conference *conf, struct ast_flags64 *confflags, char *optargs[])
 {
 	struct ast_conf_user *user = NULL;
@@ -2385,8 +2807,7 @@
 	int currentmarked = 0;
 	int ret = -1;
 	int x;
-	int menu_active = 0;
-	int menu8_active = 0;
+	enum menu_modes menu_mode = MENU_DISABLED;
 	int talkreq_manager = 0;
 	int using_pseudo = 0;
 	int duration = 20;
@@ -2402,7 +2823,7 @@
 	char exitcontext[AST_MAX_CONTEXT] = "";
 	char recordingtmp[AST_MAX_EXTENSION] = "";
 	char members[10] = "";
-	int dtmf, opt_waitmarked_timeout = 0;
+	int dtmf = 0, opt_waitmarked_timeout = 0;
 	time_t timeout = 0;
 	struct dahdi_bufferinfo bi;
 	char __buf[CONF_SIZE + AST_FRIENDLY_OFFSET];
@@ -2984,7 +3405,8 @@
 			/*  Set CONFMUTE mode on DAHDI channel to mute DTMF tones when the menu is enabled */
 			x = 1;
 			ast_channel_setoption(chan, AST_OPTION_TONE_VERIFY, &x, sizeof(char), 0);
-		}	
+		}
+
 		for (;;) {
 			int menu_was_active = 0;
 
@@ -3147,11 +3569,11 @@
 			/* if we have just exited from the menu, and the user had a channel-driver
 			   volume adjustment, restore it
 			*/
-			if (!menu_active && menu_was_active && user->listen.desired && !user->listen.actual) {
+			if (!menu_mode && menu_was_active && user->listen.desired && !user->listen.actual) {
 				set_talk_volume(user, user->listen.desired);
 			}
 
-			menu_was_active = menu_active;
+			menu_was_active = menu_mode;
 
 			currentmarked = conf->markedusers;
 			if (!ast_test_flag64(confflags, CONFFLAG_QUIET) &&
@@ -3461,7 +3883,7 @@
 							careful_write(fd, f->data.ptr, f->datalen, 0);
 						}
 					}
-				} else if (((f->frametype == AST_FRAME_DTMF) && (f->subclass.integer == '*') && ast_test_flag64(confflags, CONFFLAG_STARMENU)) || ((f->frametype == AST_FRAME_DTMF) && menu_active)) {
+				} else if (((f->frametype == AST_FRAME_DTMF) && (f->subclass.integer == '*') && ast_test_flag64(confflags, CONFFLAG_STARMENU)) || ((f->frametype == AST_FRAME_DTMF) && menu_mode)) {
 					if (ast_test_flag64(confflags, CONFFLAG_PASS_DTMF)) {
 						conf_queue_dtmf(conf, user, f);
 					}
@@ -3475,345 +3897,37 @@
 					/* if we are entering the menu, and the user has a channel-driver
 					   volume adjustment, clear it
 					*/
-					if (!menu_active && user->talk.desired && !user->talk.actual) {
+					if (!menu_mode && user->talk.desired && !user->talk.actual) {
 						set_talk_volume(user, 0);
 					}
 
 					if (musiconhold) {
 						ast_moh_stop(chan);
-					}
-					if (menu8_active) {
-						/* *8 Submenu */
-						dtmf = f->subclass.integer;
-						if (dtmf > 0) {
-							int keepplaying;
-							int playednamerec;
-							struct ao2_iterator user_iter;
-							struct ast_conf_user *usr = NULL;
-							switch(dtmf) {
-							case '1': /* *81 Roll call */
-								keepplaying = 1;
-								playednamerec = 0;
-								if (conf->users == 1) {
-									if (keepplaying && !ast_streamfile(chan, "conf-onlyperson", ast_channel_language(chan))) {
-										res = ast_waitstream(chan, AST_DIGIT_ANY);
-										ast_stopstream(chan);
-										if (res > 0)
-											keepplaying = 0;
-									}
-								} else if (conf->users == 2) {
-									if (keepplaying && !ast_streamfile(chan, "conf-onlyone", ast_channel_language(chan))) {
-										res = ast_waitstream(chan, AST_DIGIT_ANY);
-										ast_stopstream(chan);
-										if (res > 0)
-											keepplaying = 0;
-									}
-								} else {
-									if (keepplaying && !ast_streamfile(chan, "conf-thereare", ast_channel_language(chan))) {
-										res = ast_waitstream(chan, AST_DIGIT_ANY);
-										ast_stopstream(chan);
-										if (res > 0)
-											keepplaying = 0;
-									}
-									if (keepplaying) {
-										res = ast_say_number(chan, conf->users - 1, AST_DIGIT_ANY, ast_channel_language(chan), (char *) NULL);
-										if (res > 0)
-											keepplaying = 0;
-									}
-									if (keepplaying && !ast_streamfile(chan, "conf-otherinparty", ast_channel_language(chan))) {
-										res = ast_waitstream(chan, AST_DIGIT_ANY);
-										ast_stopstream(chan);
-										if (res > 0)
-											keepplaying = 0;
-									}
-								}
-								user_iter = ao2_iterator_init(conf->usercontainer, 0);
-								while((usr = ao2_iterator_next(&user_iter))) {
-									if (ast_fileexists(usr->namerecloc, NULL, NULL)) {
-										if (keepplaying && !ast_streamfile(chan, usr->namerecloc, ast_channel_language(chan))) {
-											res = ast_waitstream(chan, AST_DIGIT_ANY);
-											ast_stopstream(chan);
-											if (res > 0)
-												keepplaying = 0;
-										}
-										playednamerec = 1;
-									}
-									ao2_ref(usr, -1);
-								}
-								ao2_iterator_destroy(&user_iter);
-								if (keepplaying && playednamerec && !ast_streamfile(chan, "conf-roll-callcomplete", ast_channel_language(chan))) {
-									res = ast_waitstream(chan, AST_DIGIT_ANY);
-									ast_stopstream(chan);
-									if (res > 0)
-										keepplaying = 0;
-								}
-								break;
-							case '2': /* *82 Eject all non-admins */
-								if (conf->users == 1) {
-									if(!ast_streamfile(chan, "conf-errormenu", ast_channel_language(chan)))
-										ast_waitstream(chan, "");
-								} else {
-									ao2_callback(conf->usercontainer, OBJ_NODATA, user_set_kickme_cb, &conf);
-								}
-								ast_stopstream(chan);
-								break;
-							case '3': /* *83 (Admin) mute/unmute all non-admins */
-								if(conf->gmuted) {
-									conf->gmuted = 0;
-									ao2_callback(conf->usercontainer, OBJ_NODATA, user_set_unmuted_cb, &conf);
-									if (!ast_streamfile(chan, "conf-now-unmuted", ast_channel_language(chan)))
-										ast_waitstream(chan, "");
-								} else {
-									conf->gmuted = 1;
-									ao2_callback(conf->usercontainer, OBJ_NODATA, user_set_muted_cb, &conf);
-									if (!ast_streamfile(chan, "conf-now-muted", ast_channel_language(chan)))
-										ast_waitstream(chan, "");
-								}
-								ast_stopstream(chan);
-								break;
-							case '4': /* *84 Record conference */
-								if (conf->recording != MEETME_RECORD_ACTIVE) {
-									ast_set_flag64(confflags, CONFFLAG_RECORDCONF);
-
-									if (!conf->recordingfilename) {
-										const char *var;
-										ast_channel_lock(chan);
-										if ((var = pbx_builtin_getvar_helper(chan, "MEETME_RECORDINGFILE"))) {
-											conf->recordingfilename = ast_strdup(var);
-										}
-										if ((var = pbx_builtin_getvar_helper(chan, "MEETME_RECORDINGFORMAT"))) {
-											conf->recordingformat = ast_strdup(var);
-										}
-										ast_channel_unlock(chan);
-										if (!conf->recordingfilename) {
-											snprintf(recordingtmp, sizeof(recordingtmp), "meetme-conf-rec-%s-%s", conf->confno, ast_channel_uniqueid(chan));
-											conf->recordingfilename = ast_strdup(recordingtmp);
-										}
-										if (!conf->recordingformat) {
-											conf->recordingformat = ast_strdup("wav");
-										}
-										ast_verb(4, "Starting recording of MeetMe Conference %s into file %s.%s.\n",
-				    							conf->confno, conf->recordingfilename, conf->recordingformat);
-									}
-
-									ast_mutex_lock(&conf->recordthreadlock);
-									if ((conf->recordthread == AST_PTHREADT_NULL) && ast_test_flag64(confflags, CONFFLAG_RECORDCONF) && ((conf->lchan = ast_request("DAHDI", cap_slin, chan, "pseudo", NULL)))) {
-										ast_set_read_format_by_id(conf->lchan, AST_FORMAT_SLINEAR);
-										ast_set_write_format_by_id(conf->lchan, AST_FORMAT_SLINEAR);
-										dahdic.chan = 0;
-										dahdic.confno = conf->dahdiconf;
-										dahdic.confmode = DAHDI_CONF_CONFANN | DAHDI_CONF_CONFANNMON;
-										if (ioctl(ast_channel_fd(conf->lchan, 0), DAHDI_SETCONF, &dahdic)) {
-											ast_log(LOG_WARNING, "Error starting listen channel\n");
-											ast_hangup(conf->lchan);
-											conf->lchan = NULL;
-										} else {
-											ast_pthread_create_detached_background(&conf->recordthread, NULL, recordthread, conf);
-										}
-									}
-									ast_mutex_unlock(&conf->recordthreadlock);
-
-									if (!ast_streamfile(chan, "conf-now-recording", ast_channel_language(chan)))
-										ast_waitstream(chan, "");
-
-								}
-
-								ast_stopstream(chan);
-								break;
-							default:
-								if (!ast_streamfile(chan, "conf-errormenu", ast_channel_language(chan)))
-									ast_waitstream(chan, "");
-								ast_stopstream(chan);
-								break;
-							}
+					} else if (!menu_mode) {
+						char *menu_to_play;
+						if (ast_test_flag64(confflags, CONFFLAG_ADMIN)) {
+							menu_mode = MENU_ADMIN;
+							menu_to_play = "conf-adminmenu-18";
+						} else {
+							menu_mode = MENU_NORMAL;
+							menu_to_play = "conf-usermenu-162";
 						}
 
-						menu8_active = 0;
-						menu_active = 0;
-					} else if (ast_test_flag64(confflags, CONFFLAG_ADMIN)) {
-						/* Admin menu */
-						if (!menu_active) {
-							menu_active = 1;
-							/* Record this sound! */
-							if (!ast_streamfile(chan, "conf-adminmenu-162", ast_channel_language(chan))) {
-								dtmf = ast_waitstream(chan, AST_DIGIT_ANY);
-								ast_stopstream(chan);
-							} else {
-								dtmf = 0;
-							}
+						if (!ast_streamfile(chan, menu_to_play, ast_channel_language(chan))) {
+							dtmf = ast_waitstream(chan, AST_DIGIT_ANY);
+							ast_stopstream(chan);
 						} else {
-							dtmf = f->subclass.integer;
-						}
-						if (dtmf > 0) {
-							switch(dtmf) {
-							case '1': /* Un/Mute */
-								menu_active = 0;
-
-								/* for admin, change both admin and use flags */
-								if (user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) {
-									user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED);
-								} else {
-									user->adminflags |= (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED);
-								}
-
-								if (ast_test_flag64(confflags, CONFFLAG_MONITOR) || (user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED))) {
-									if (!ast_streamfile(chan, "conf-muted", ast_channel_language(chan))) {
-										ast_waitstream(chan, "");
-									}
-								} else {
-									if (!ast_streamfile(chan, "conf-unmuted", ast_channel_language(chan))) {
-										ast_waitstream(chan, "");
-									}
-								}
-								break;
-							case '2': /* Un/Lock the Conference */
-								menu_active = 0;
-								if (conf->locked) {
-									conf->locked = 0;
-									if (!ast_streamfile(chan, "conf-unlockednow", ast_channel_language(chan))) {
-										ast_waitstream(chan, "");
-									}
-								} else {
-									conf->locked = 1;
-									if (!ast_streamfile(chan, "conf-lockednow", ast_channel_language(chan))) {
-										ast_waitstream(chan, "");
-									}
-								}
-								break;
-							case '3': /* Eject last user */
-							{
-								struct ast_conf_user *usr = NULL;
-								int max_no = 0;
-								ao2_callback(conf->usercontainer, OBJ_NODATA, user_max_cmp, &max_no);
-								menu_active = 0;
-								usr = ao2_find(conf->usercontainer, &max_no, 0);
-								if ((ast_channel_name(usr->chan) == ast_channel_name(chan)) || ast_test_flag64(&usr->userflags, CONFFLAG_ADMIN)) {
-									if (!ast_streamfile(chan, "conf-errormenu", ast_channel_language(chan))) {
-										ast_waitstream(chan, "");
-									}
-								} else {
-									usr->adminflags |= ADMINFLAG_KICKME;
-								}
-								ao2_ref(usr, -1);
-								ast_stopstream(chan);
-								break;	
-							}
-							case '4':
-								tweak_listen_volume(user, VOL_DOWN);
-								break;
-							case '5':
-								/* Extend RT conference */
-								if (rt_schedule) {
-									if (!rt_extend_conf(conf->confno)) {
-										if (!ast_streamfile(chan, "conf-extended", ast_channel_language(chan))) {
-											ast_waitstream(chan, "");
-										}
-									} else {
-										if (!ast_streamfile(chan, "conf-nonextended", ast_channel_language(chan))) {
-											ast_waitstream(chan, "");
-										}
-									}
-									ast_stopstream(chan);
-								}
-								menu_active = 0;
-								break;
-							case '6':
-								tweak_listen_volume(user, VOL_UP);
-								break;
-							case '7':
-								tweak_talk_volume(user, VOL_DOWN);
-								break;
-							case '8':
-								menu8_active = 1;
-								break;
-							case '9':
-								tweak_talk_volume(user, VOL_UP);
-								break;
-							default:
-								menu_active = 0;
-								/* Play an error message! */
-								if (!ast_streamfile(chan, "conf-errormenu", ast_channel_language(chan))) {
-									ast_waitstream(chan, "");
-								}
-								break;
-							}
+							dtmf = 0;
 						}
 					} else {
-						/* User menu */
-						if (!menu_active) {
-							menu_active = 1;
-							if (!ast_streamfile(chan, "conf-usermenu-162", ast_channel_language(chan))) {
-								dtmf = ast_waitstream(chan, AST_DIGIT_ANY);
-								ast_stopstream(chan);
-							} else {
-								dtmf = 0;
-							}
-						} else {
-							dtmf = f->subclass.integer;
-						}
-						if (dtmf > 0) {
-							switch (dtmf) {
-							case '1': /* Un/Mute */
-								menu_active = 0;
-
-								/* user can only toggle the self-muted state */
-								user->adminflags ^= ADMINFLAG_SELFMUTED;
-
-								/* they can't override the admin mute state */
-								if (ast_test_flag64(confflags, CONFFLAG_MONITOR) || (user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED))) {
-									if (!ast_streamfile(chan, "conf-muted", ast_channel_language(chan))) {
-										ast_waitstream(chan, "");
-									}
-								} else {
-									if (!ast_streamfile(chan, "conf-unmuted", ast_channel_language(chan))) {
-										ast_waitstream(chan, "");
-									}
-								}
-								break;
-							case '2':
-								menu_active = 0;
-								if (user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) {
-									user->adminflags |= ADMINFLAG_T_REQUEST;
-								}
-									
-								if (user->adminflags & ADMINFLAG_T_REQUEST) {
-									if (!ast_streamfile(chan, "beep", ast_channel_language(chan))) {
-										ast_waitstream(chan, "");
-									}
-								}
-								break;
-							case '4':
-								tweak_listen_volume(user, VOL_DOWN);
-								break;
-							case '5':
-								/* Extend RT conference */
-								if (rt_schedule) {
-									rt_extend_conf(conf->confno);
-								}
-								menu_active = 0;
-								break;
-							case '6':
-								tweak_listen_volume(user, VOL_UP);
-								break;
-							case '7':
-								tweak_talk_volume(user, VOL_DOWN);
-								break;
-							case '8':
-								menu_active = 0;
-								break;
-							case '9':
-								tweak_talk_volume(user, VOL_UP);
-								break;
-							default:
-								menu_active = 0;
-								if (!ast_streamfile(chan, "conf-errormenu", ast_channel_language(chan))) {
-									ast_waitstream(chan, "");
-								}
-								break;
-							}
-						}
+						dtmf = f->subclass.integer;
 					}
-					if (musiconhold && !menu_active) {
+
+					if (dtmf > 0) {
+						meetme_menu(&menu_mode, &dtmf, conf, confflags, chan, user, recordingtmp, &dahdic, cap_slin);
+					}
+
+					if (musiconhold && !menu_mode) {
 						conf_start_moh(chan, optargs[OPT_ARG_MOH_CLASS]);
 					}
 

Modified: branches/11/sounds/Makefile
URL: http://svnview.digium.com/svn/asterisk/branches/11/sounds/Makefile?view=diff&rev=379892&r1=379891&r2=379892
==============================================================================
--- branches/11/sounds/Makefile (original)
+++ branches/11/sounds/Makefile Tue Jan 22 13:07:42 2013
@@ -19,8 +19,8 @@
 SOUNDS_DIR:=$(DESTDIR)$(ASTDATADIR)/sounds
 SOUNDS_CACHE_DIR?=
 MOH_DIR:=$(DESTDIR)$(ASTDATADIR)/moh
-CORE_SOUNDS_VERSION:=1.4.22
-EXTRA_SOUNDS_VERSION:=1.4.12
+CORE_SOUNDS_VERSION:=1.4.23
+EXTRA_SOUNDS_VERSION:=1.4.13
 MOH_VERSION:=2.03
 SOUNDS_URL:=http://downloads.asterisk.org/pub/telephony/sounds/releases
 MCS:=$(subst -EN-,-en-,$(MENUSELECT_CORE_SOUNDS))




More information about the asterisk-commits mailing list