Skip to content
Snippets Groups Projects
Commit 6a34f551 authored by Kevin P. Fleming's avatar Kevin P. Fleming
Browse files

re-add 'listen' volume control

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6522 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent 35d9febc
No related branches found
No related tags found
No related merge requests found
......@@ -135,6 +135,11 @@ static struct ast_conference {
struct ast_conference *next;
} *confs;
struct volume {
int desired; /* Desired volume adjustment */
int actual; /* Actual volume adjustment (for channels that can't adjust) */
};
struct ast_conf_user {
int user_no; /* User Number */
struct ast_conf_user *prevuser; /* Pointer to the previous user */
......@@ -147,8 +152,8 @@ struct ast_conf_user {
char usrvalue[50]; /* Custom User Value */
char namerecloc[AST_MAX_EXTENSION]; /* Name Recorded file Location */
time_t jointime; /* Time the user joined the conference */
int desired_talk_volume; /* Desired talk volume adjustment */
int actual_talk_volume; /* Actual talk volume adjustment (for channels that can't adjust) */
struct volume talk;
struct volume listen;
};
#define ADMINFLAG_MUTED (1 << 1) /* User is muted */
......@@ -290,46 +295,74 @@ static int set_talk_volume(struct ast_conf_user *user, int volume)
return ast_channel_setoption(user->chan, AST_OPTION_RXGAIN, &gain_adjust, sizeof(gain_adjust), 0);
}
static void tweak_talk_volume(struct ast_conf_user *user, enum volume_action action)
static int set_listen_volume(struct ast_conf_user *user, int volume)
{
signed char gain_adjust;
/* attempt to make the adjustment in the channel driver;
if successful, don't adjust in the frame reading routine
*/
gain_adjust = gain_map[volume + 5];
return ast_channel_setoption(user->chan, AST_OPTION_TXGAIN, &gain_adjust, sizeof(gain_adjust), 0);
}
static void tweak_volume(struct volume *vol, enum volume_action action)
{
switch (action) {
case VOL_UP:
switch (user->desired_talk_volume) {
switch (vol->desired) {
case 5:
break;
case 0:
user->desired_talk_volume = 2;
vol->desired = 2;
break;
case -2:
user->desired_talk_volume = 0;
vol->desired = 0;
break;
default:
user->desired_talk_volume++;
vol->desired++;
break;
}
break;
case VOL_DOWN:
switch (user->desired_talk_volume) {
switch (vol->desired) {
case -5:
break;
case 2:
user->desired_talk_volume = 0;
vol->desired = 0;
break;
case 0:
user->desired_talk_volume = -2;
vol->desired = -2;
break;
default:
user->desired_talk_volume--;
vol->desired--;
break;
}
}
}
static void tweak_talk_volume(struct ast_conf_user *user, enum volume_action action)
{
tweak_volume(&user->talk, action);
/* attempt to make the adjustment in the channel driver;
if successful, don't adjust in the frame reading routine
*/
if (!set_talk_volume(user, user->desired_talk_volume))
user->actual_talk_volume = 0;
if (!set_talk_volume(user, user->talk.desired))
user->talk.actual = 0;
else
user->actual_talk_volume = user->desired_talk_volume;
user->talk.actual = user->talk.desired;
}
static void tweak_listen_volume(struct ast_conf_user *user, enum volume_action action)
{
tweak_volume(&user->listen, action);
/* attempt to make the adjustment in the channel driver;
if successful, don't adjust in the frame reading routine
*/
if (!set_listen_volume(user, user->listen.desired))
user->listen.actual = 0;
else
user->listen.actual = user->listen.desired;
}
static void adjust_volume(struct ast_frame *f, int vol)
......@@ -346,7 +379,6 @@ static void adjust_volume(struct ast_frame *f, int vol)
}
}
static void conf_play(struct ast_channel *chan, struct ast_conference *conf, int sound)
{
unsigned char *data;
......@@ -1037,8 +1069,8 @@ zapretry:
/* 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->desired_talk_volume && !user->actual_talk_volume)
set_talk_volume(user, user->desired_talk_volume);
if (!menu_active && menu_was_active && user->listen.desired && !user->listen.actual)
set_talk_volume(user, user->listen.desired);
menu_was_active = menu_active;
......@@ -1187,8 +1219,8 @@ zapretry:
if (!f)
break;
if ((f->frametype == AST_FRAME_VOICE) && (f->subclass == AST_FORMAT_SLINEAR)) {
if (user->actual_talk_volume) {
adjust_volume(f, user->actual_talk_volume);
if (user->talk.actual) {
adjust_volume(f, user->talk.actual);
}
if (confflags & CONFFLAG_MONITORTALKER) {
int totalsilence;
......@@ -1244,7 +1276,7 @@ zapretry:
/* if we are entering the menu, and the user has a channel-driver
volume adjustment, clear it
*/
if (!menu_active && user->desired_talk_volume && !user->actual_talk_volume)
if (!menu_active && user->talk.desired && !user->talk.actual)
set_talk_volume(user, 0);
if (musiconhold) {
......@@ -1263,69 +1295,77 @@ zapretry:
dtmf = f->subclass;
if (dtmf) {
switch(dtmf) {
case '1': /* Un/Mute */
menu_active = 0;
if (ztc.confmode & ZT_CONF_TALKER) {
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;
} else {
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 (ztc.confmode & ZT_CONF_TALKER) {
if (!ast_streamfile(chan, "conf-unmuted", chan->language))
ast_waitstream(chan, "");
} else {
if (!ast_streamfile(chan, "conf-muted", chan->language))
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", chan->language))
ast_waitstream(chan, "");
} else {
conf->locked = 1;
if (!ast_streamfile(chan, "conf-lockednow", chan->language))
ast_waitstream(chan, "");
}
break;
case '3': /* Eject last user */
menu_active = 0;
usr = conf->lastuser;
if ((usr->chan->name == chan->name)||(usr->userflags & CONFFLAG_ADMIN)) {
if(!ast_streamfile(chan, "conf-errormenu", chan->language))
ast_waitstream(chan, "");
} else
usr->adminflags |= ADMINFLAG_KICKME;
ast_stopstream(chan);
break;
case '9':
tweak_talk_volume(user, VOL_UP);
} else {
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 (ztc.confmode & ZT_CONF_TALKER) {
if (!ast_streamfile(chan, "conf-unmuted", chan->language))
ast_waitstream(chan, "");
} else {
if (!ast_streamfile(chan, "conf-muted", chan->language))
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", chan->language))
ast_waitstream(chan, "");
} else {
conf->locked = 1;
if (!ast_streamfile(chan, "conf-lockednow", chan->language))
ast_waitstream(chan, "");
}
break;
case '3': /* Eject last user */
menu_active = 0;
usr = conf->lastuser;
if ((usr->chan->name == chan->name)||(usr->userflags & CONFFLAG_ADMIN)) {
if(!ast_streamfile(chan, "conf-errormenu", chan->language))
ast_waitstream(chan, "");
} else
usr->adminflags |= ADMINFLAG_KICKME;
ast_stopstream(chan);
break;
case '8':
menu_active = 0;
break;
case '4':
tweak_listen_volume(user, VOL_DOWN);
break;
case '7':
tweak_talk_volume(user, VOL_DOWN);
break;
case '6':
tweak_listen_volume(user, VOL_UP);
break;
default:
menu_active = 0;
/* Play an error message! */
if (!ast_streamfile(chan, "conf-errormenu", chan->language))
ast_waitstream(chan, "");
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;
/* Play an error message! */
if (!ast_streamfile(chan, "conf-errormenu", chan->language))
ast_waitstream(chan, "");
break;
}
}
} else {
......@@ -1363,24 +1403,32 @@ zapretry:
ast_waitstream(chan, "");
}
break;
case '9':
tweak_talk_volume(user, VOL_UP);
case '4':
tweak_listen_volume(user, VOL_DOWN);
break;
case '8':
menu_active = 0;
case '6':
tweak_listen_volume(user, VOL_UP);
break;
case '7':
tweak_talk_volume(user, VOL_DOWN);
break;
default:
menu_active = 0;
/* Play an error message! */
if (!ast_streamfile(chan, "conf-errormenu", chan->language))
ast_waitstream(chan, "");
break;
case '8':
menu_active = 0;
break;
case '9':
tweak_talk_volume(user, VOL_UP);
break;
default:
menu_active = 0;
/* Play an error message! */
if (!ast_streamfile(chan, "conf-errormenu", chan->language))
ast_waitstream(chan, "");
break;
}
}
}
......@@ -1409,6 +1457,8 @@ zapretry:
fr.samples = res/2;
fr.data = buf;
fr.offset = AST_FRIENDLY_OFFSET;
if (user->listen.actual)
adjust_volume(&fr, user->listen.actual);
if (ast_write(chan, &fr) < 0) {
ast_log(LOG_WARNING, "Unable to write frame to channel: %s\n", strerror(errno));
/* break; */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment