mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-29 18:19:30 +00:00
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:
51
muted.c
51
muted.c
@@ -36,11 +36,16 @@ static int debug = 0;
|
|||||||
static int stepsize = 3;
|
static int stepsize = 3;
|
||||||
static int mixchan = SOUND_MIXER_VOLUME;
|
static int mixchan = SOUND_MIXER_VOLUME;
|
||||||
|
|
||||||
|
struct subchannel {
|
||||||
|
char *name;
|
||||||
|
struct subchannel *next;
|
||||||
|
};
|
||||||
|
|
||||||
static struct channel {
|
static struct channel {
|
||||||
char *tech;
|
char *tech;
|
||||||
char *location;
|
char *location;
|
||||||
struct channel *next;
|
struct channel *next;
|
||||||
int offhook;
|
struct subchannel *subs;
|
||||||
} *channels;
|
} *channels;
|
||||||
|
|
||||||
static void add_channel(char *tech, char *location)
|
static void add_channel(char *tech, char *location)
|
||||||
@@ -370,7 +375,7 @@ static void check_mute(void)
|
|||||||
struct channel *chan;
|
struct channel *chan;
|
||||||
chan = channels;
|
chan = channels;
|
||||||
while(chan) {
|
while(chan) {
|
||||||
if (chan->offhook) {
|
if (chan->subs) {
|
||||||
offhook++;
|
offhook++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -382,12 +387,50 @@ static void check_mute(void)
|
|||||||
unmute();
|
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)
|
static void hangup_chan(char *channel)
|
||||||
{
|
{
|
||||||
struct channel *chan;
|
struct channel *chan;
|
||||||
chan = find_channel(channel);
|
chan = find_channel(channel);
|
||||||
if (chan)
|
if (chan)
|
||||||
chan->offhook = 0;
|
delete_sub(chan, channel);
|
||||||
check_mute();
|
check_mute();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -396,7 +439,7 @@ static void offhook_chan(char *channel)
|
|||||||
struct channel *chan;
|
struct channel *chan;
|
||||||
chan = find_channel(channel);
|
chan = find_channel(channel);
|
||||||
if (chan)
|
if (chan)
|
||||||
chan->offhook = 1;
|
append_sub(chan, channel);
|
||||||
check_mute();
|
check_mute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user