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)
struct channel *chan;
chan = channels;
while(chan) {
- if (chan->offhook) {
+ if (chan->subs) {
offhook++;
break;
}
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();
}
struct channel *chan;
chan = find_channel(channel);
if (chan)
- chan->offhook = 1;
+ append_sub(chan, channel);
check_mute();
}