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:
Mark Spencer
2004-05-17 07:00:21 +00:00
parent 655bce9e1f
commit 1a81758f1c

51
muted.c
View File

@@ -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();
}