From 1a81758f1cd626724bf64e9e007ce55959e92733 Mon Sep 17 00:00:00 2001 From: Mark Spencer <markster@digium.com> Date: Mon, 17 May 2004 07:00:21 +0000 Subject: [PATCH] manage multiple subchannels per device git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2991 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- muted.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/muted.c b/muted.c index c4e03ddb1d..135a4164bb 100755 --- a/muted.c +++ b/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(); } -- GitLab