mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-29 18:19:30 +00:00
manage multiple subchannels per device
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2991 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
51
muted.c
51
muted.c
@@ -36,11 +36,16 @@ static int debug = 0;
|
||||
static int stepsize = 3;
|
||||
static int mixchan = SOUND_MIXER_VOLUME;
|
||||
|
||||
struct subchannel {
|
||||
char *name;
|
||||
struct subchannel *next;
|
||||
};
|
||||
|
||||
static struct channel {
|
||||
char *tech;
|
||||
char *location;
|
||||
struct channel *next;
|
||||
int offhook;
|
||||
struct subchannel *subs;
|
||||
} *channels;
|
||||
|
||||
static void add_channel(char *tech, char *location)
|
||||
@@ -370,7 +375,7 @@ static void check_mute(void)
|
||||
struct channel *chan;
|
||||
chan = channels;
|
||||
while(chan) {
|
||||
if (chan->offhook) {
|
||||
if (chan->subs) {
|
||||
offhook++;
|
||||
break;
|
||||
}
|
||||
@@ -382,12 +387,50 @@ static void check_mute(void)
|
||||
unmute();
|
||||
}
|
||||
|
||||
static void delete_sub(struct channel *chan, char *name)
|
||||
{
|
||||
struct subchannel *sub, *prev;
|
||||
prev = NULL;
|
||||
sub = chan->subs;
|
||||
while(sub) {
|
||||
if (!strcasecmp(sub->name, name)) {
|
||||
if (prev)
|
||||
prev->next = sub->next;
|
||||
else
|
||||
chan->subs = sub->next;
|
||||
free(sub->name);
|
||||
free(sub);
|
||||
return;
|
||||
}
|
||||
prev = sub;
|
||||
sub = sub->next;
|
||||
}
|
||||
}
|
||||
|
||||
static void append_sub(struct channel *chan, char *name)
|
||||
{
|
||||
struct subchannel *sub;
|
||||
sub = chan->subs;
|
||||
while(sub) {
|
||||
if (!strcasecmp(sub->name, name))
|
||||
return;
|
||||
sub = sub->next;
|
||||
}
|
||||
sub = malloc(sizeof(struct subchannel));
|
||||
if (sub) {
|
||||
memset(sub, 0, sizeof(struct subchannel));
|
||||
sub->name = strdup(name);
|
||||
sub->next = chan->subs;
|
||||
chan->subs = sub;
|
||||
}
|
||||
}
|
||||
|
||||
static void hangup_chan(char *channel)
|
||||
{
|
||||
struct channel *chan;
|
||||
chan = find_channel(channel);
|
||||
if (chan)
|
||||
chan->offhook = 0;
|
||||
delete_sub(chan, channel);
|
||||
check_mute();
|
||||
}
|
||||
|
||||
@@ -396,7 +439,7 @@ static void offhook_chan(char *channel)
|
||||
struct channel *chan;
|
||||
chan = find_channel(channel);
|
||||
if (chan)
|
||||
chan->offhook = 1;
|
||||
append_sub(chan, channel);
|
||||
check_mute();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user