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