Index: apps/app_meetme.c =================================================================== --- apps/app_meetme.c (revision 232802) +++ apps/app_meetme.c (working copy) @@ -692,6 +692,7 @@ enum recording_state recording:2; /*!< recording status */ unsigned int isdynamic:1; /*!< Created on the fly? */ unsigned int locked:1; /*!< Is the conference locked? */ + unsigned int gmuted:1; /*!< Is the conference globally muted? (all non-admins) */ pthread_t recordthread; /*!< thread for recording */ ast_mutex_t recordthreadlock; /*!< control threads trying to start recordthread */ pthread_attr_t attr; /*!< thread attribute */ @@ -2062,6 +2063,7 @@ int ret = -1; int x; int menu_active = 0; + int menu8_active = 0; int talkreq_manager = 0; int using_pseudo = 0; int duration = 20; @@ -2281,6 +2283,7 @@ user->chan = chan; user->userflags = confflags; user->adminflags = (confflags & CONFFLAG_STARTMUTED) ? ADMINFLAG_SELFMUTED : 0; + user->adminflags |= (conf->gmuted) ? ADMINFLAG_MUTED : 0; user->talking = -1; ast_mutex_unlock(&conf->playlock); @@ -3008,7 +3011,159 @@ if (musiconhold) { ast_moh_stop(chan); } - if ((confflags & CONFFLAG_ADMIN)) { + if (menu8_active) { + /* *8 Submenu */ + dtmf = f->subclass.integer; + if (dtmf) { + int keepplaying; + int playednamerec; + switch(dtmf) { + case '1': /* *81 Roll call */ + keepplaying = 1; + playednamerec = 0; + if (conf->users == 1) { + if (keepplaying && !ast_streamfile(chan, "conf-onlyperson", chan->language)) { + 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", chan->language)) { + res = ast_waitstream(chan, AST_DIGIT_ANY); + ast_stopstream(chan); + if (res > 0) + keepplaying=0; + } + } else { + if (keepplaying && !ast_streamfile(chan, "conf-thereare", chan->language)) { + 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, chan->language, (char *) NULL); + if (res > 0) + keepplaying=0; + } + if ( keepplaying && !ast_streamfile(chan, "conf-otherinparty", chan->language)) { + res = ast_waitstream(chan, AST_DIGIT_ANY); + ast_stopstream(chan); + if (res > 0) + keepplaying=0; + } + } + AST_LIST_TRAVERSE(&conf->userlist, usr, list) { + if (ast_fileexists(usr->namerecloc, NULL, NULL)) { + if (keepplaying && !ast_streamfile(chan, usr->namerecloc, chan->language)) { + res = ast_waitstream(chan, AST_DIGIT_ANY); + ast_stopstream(chan); + if (res > 0) + keepplaying=0; + } + playednamerec=1; + } + } + if ( keepplaying && playednamerec && !ast_streamfile(chan, "conf-roll-call-complete", chan->language)) { + 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", chan->language)) + ast_waitstream(chan, ""); + } else { + AST_LIST_TRAVERSE(&conf->userlist, usr, list) { + if (!(usr->userflags & CONFFLAG_ADMIN)) + usr->adminflags |= ADMINFLAG_KICKME; + } + } + ast_stopstream(chan); + break; + case '3': /* *83 (Admin) mute/unmute all non-admins */ + if(conf->gmuted) { + conf->gmuted = 0; + AST_LIST_TRAVERSE(&conf->userlist, usr, list) { + if (!(usr->userflags & CONFFLAG_ADMIN)) + usr->adminflags &= ~ADMINFLAG_MUTED; + } + if (!ast_streamfile(chan, "conf-now-unmuted", chan->language)) + ast_waitstream(chan, ""); + } else { + conf->gmuted = 1; + AST_LIST_TRAVERSE(&conf->userlist, usr, list) { + if (!(usr->userflags & CONFFLAG_ADMIN)) + usr->adminflags |= ADMINFLAG_MUTED; + } + if (!ast_streamfile(chan, "conf-now-muted", chan->language)) + ast_waitstream(chan, ""); + } + ast_stopstream(chan); + break; + case '4': /* *84 Record conference */ + if (conf->recording != MEETME_RECORD_ACTIVE) { + 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, chan->uniqueid); + 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) && (confflags & CONFFLAG_RECORDCONF) && ((conf->lchan = ast_request("DAHDI", AST_FORMAT_SLINEAR, chan, "pseudo", NULL)))) { + ast_set_read_format(conf->lchan, AST_FORMAT_SLINEAR); + ast_set_write_format(conf->lchan, AST_FORMAT_SLINEAR); + dahdic.chan = 0; + dahdic.confno = conf->dahdiconf; + dahdic.confmode = DAHDI_CONF_CONFANN | DAHDI_CONF_CONFANNMON; + if (ioctl(conf->lchan->fds[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", chan->language)) + ast_waitstream(chan, ""); + + } + + ast_stopstream(chan); + break; + default: + if (!ast_streamfile(chan, "conf-errormenu", chan->language)) + ast_waitstream(chan, ""); + ast_stopstream(chan); + break; + } + } + + menu8_active = 0; + menu_active = 0; + } else if ((confflags & CONFFLAG_ADMIN)) { /* Admin menu */ if (!menu_active) { menu_active = 1; @@ -3096,7 +3251,7 @@ tweak_talk_volume(user, VOL_DOWN); break; case '8': - menu_active = 0; + menu8_active = 1; break; case '9': tweak_talk_volume(user, VOL_UP); @@ -3185,7 +3340,7 @@ } } } - if (musiconhold) { + if (musiconhold && !menu_active) { conf_start_moh(chan, optargs[OPT_ARG_MOH_CLASS]); }