3
* This file is part of Open Sound System.
5
* Copyright (C) 4Front Technologies 1996-2008.
7
* This this source file is released under GPL v2 license (no other versions).
8
* See the COPYING file included in the main directory of this source
9
* distribution for the license terms and conditions.
13
* Settings cache for libossmix
18
#include <soundcard.h>
21
#include <sys/types.h>
22
#include <sys/socket.h>
23
#include <netinet/in.h>
30
#include "libossmix.h"
31
#include "libossmix_impl.h"
33
static local_mixer_t *mixers[MAX_TMP_MIXER] = { NULL };
36
mixc_add_node (int mixernum, int node, oss_mixext * ext)
38
local_mixer_t *lmixer;
41
if (mixers[mixernum] == NULL)
45
mixers[mixernum] = lmixer = malloc (sizeof (*lmixer));
48
fprintf (stderr, "mixc_add_node: Out of memory\n");
52
memset (lmixer, 0, sizeof (*lmixer));
53
for (i = 0; i < MAX_TMP_NODES; i++)
54
lmixer->values[i] = -1; // Invalid
57
lmixer = mixers[mixernum];
59
if (ext->ctrl >= lmixer->nrext)
60
lmixer->nrext = ext->ctrl + 1;
62
if (node >= MAX_TMP_NODES)
64
fprintf (stderr, "mixc_add_node: Node number too large %d\n", node);
68
lnode = lmixer->nodes[node];
72
lmixer->nodes[node] = lnode = malloc (sizeof (*lnode));
76
fprintf (stderr, "mixc_get_node: Out of memory\n");
81
memcpy (lnode, ext, sizeof (*ext));
86
mixc_get_node (int mixernum, int node)
88
local_mixer_t *lmixer;
91
if (mixers[mixernum] == NULL)
95
lmixer = mixers[mixernum];
97
if (node >= MAX_TMP_NODES)
99
fprintf (stderr, "mixc_get_node: Node number too large %d\n", node);
103
lnode = lmixer->nodes[node];
109
mixc_clear_changeflags(int mixernum)
111
local_mixer_t *lmixer;
113
if (mixers[mixernum] == NULL)
117
lmixer = mixers[mixernum];
119
memset(lmixer->changemask, 0, sizeof(lmixer->changemask));
123
mixc_set_value (int mixernum, int node, int value)
125
local_mixer_t *lmixer;
127
if (mixers[mixernum] == NULL)
131
lmixer = mixers[mixernum];
133
if (node >= MAX_TMP_NODES)
135
fprintf (stderr, "mixc_set_value: Node number too large %d\n", node);
139
if (lmixer->values[node] != value)
140
lmixer->changemask[node / 8] |= (1 << (node % 8));
142
lmixer->values[node] = value;
146
mixc_get_value (int mixernum, int node)
148
local_mixer_t *lmixer;
150
if (mixers[mixernum] == NULL)
154
lmixer = mixers[mixernum];
156
if (node >= MAX_TMP_NODES)
158
fprintf (stderr, "mixc_get_value: Node number too large %d\n", node);
161
lmixer->changemask[node / 8] &= ~(1 << (node % 8));
163
return lmixer->values[node];
167
mixc_get_all_values (int mixernum, value_packet_t value_packet, int changecheck)
171
local_mixer_t *lmixer;
173
if (mixers[mixernum] == NULL)
175
fprintf (stderr, "mixc_get_all_values: Mixer %d doesn't exist\n",
179
lmixer = mixers[mixernum];
181
for (i = 0; i < lmixer->nrext; i++)
183
lnode = lmixer->nodes[i];
187
fprintf (stderr, "mixc_get_all_values: Mixer %d, node %d == NULL\n",
192
if (changecheck) // Not changed since the last time
193
if (!(lmixer->changemask[i / 8] & (1 << (i % 8)) ))
196
if (lnode->type != MIXT_DEVROOT && lnode->type != MIXT_GROUP
197
&& lnode->type != MIXT_MARKER)
199
value_packet[n].node = i;
200
value_packet[n].value = lmixer->values[i];
202
lmixer->changemask[i / 8] &= ~(1 << (i % 8));
204
//printf("Send %d = %08x\n", i, lmixer->values[i]);