manage multiple subchannels per device
authorMark Spencer <markster@digium.com>
Mon, 17 May 2004 07:00:21 +0000 (07:00 +0000)
committerMark Spencer <markster@digium.com>
Mon, 17 May 2004 07:00:21 +0000 (07:00 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2991 65c4cc65-6c06-0410-ace0-fbb531ad65f3

muted.c

diff --git a/muted.c b/muted.c
index c4e03dd..135a416 100755 (executable)
--- 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();
 }