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
* Local driver for libossmix
19
#include <sys/ioctl.h>
22
#include <soundcard.h>
26
#include "libossmix.h"
27
#include "libossmix_impl.h"
29
static int global_fd = -1;
30
static int num_mixers=0;
32
static int mixer_fd[MAX_TMP_MIXER];
35
local_connect (const char *hostname, int port)
41
fprintf (stderr, "Entered local_connect()\n");
43
for (i = 0; i < MAX_TMP_MIXER; i++)
46
if ((devmixer = getenv ("OSS_MIXERDEV")) == NULL)
47
devmixer = "/dev/mixer";
50
* Open the mixer device
52
if ((global_fd = open (devmixer, O_RDWR, 0)) == -1)
62
local_disconnect (void)
65
fprintf (stderr, "Entered local_disconnect()\n");
74
local_enable_events (void)
79
local_get_fd (ossmix_select_poll_t * cb)
82
return -1; /* No poll handling required */
86
local_get_nmixers (void)
90
if (ioctl (global_fd, SNDCTL_SYSINFO, &si) == -1)
92
perror ("SNDCTL_SYSINFO");
96
return num_mixers = si.nummixers;
100
local_get_mixerinfo (int mixernum, oss_mixerinfo * mi)
104
if (ioctl (global_fd, SNDCTL_MIXERINFO, mi) == -1)
106
perror ("SNDCTL_MIXERINFO");
114
local_open_mixer (int mixernum)
118
if (mixer_fd[mixernum] > -1)
121
if (ossmix_get_mixerinfo (mixernum, &mi) < 0)
124
//fprintf(stderr, "local_open_mixer(%d: %s)\n", mixernum, mi.devnode);
126
if ((mixer_fd[mixernum] = open (mi.devnode, O_RDWR, 0)) == -1)
136
local_close_mixer (int mixernum)
138
//fprintf(stderr, "local_close_mixer(%d)\n", mixernum);
140
if (mixer_fd[mixernum] == -1)
143
close (mixer_fd[mixernum]);
144
mixer_fd[mixernum] = -1;
148
local_get_nrext (int mixernum)
152
if (ioctl (mixer_fd[mixernum], SNDCTL_MIX_NREXT, &n) == -1)
154
perror ("SNDCTL_MIX_NREXT");
162
local_get_nodeinfo (int mixernum, int node, oss_mixext * ext)
167
if (ioctl (mixer_fd[mixernum], SNDCTL_MIX_EXTINFO, ext) == -1)
169
perror ("SNDCTL_MIX_EXTINFO");
173
mixc_add_node (mixernum, node, ext);
178
local_get_enuminfo (int mixernum, int node, oss_mixer_enuminfo * ei)
183
if (ioctl (mixer_fd[mixernum], SNDCTL_MIX_ENUMINFO, ei) == -1)
185
perror ("SNDCTL_MIX_ENUMINFO");
193
local_get_description (int mixernum, int node, oss_mixer_enuminfo * desc)
195
desc->dev = mixernum;
198
if (ioctl (mixer_fd[mixernum], SNDCTL_MIX_DESCRIPTION, desc) == -1)
200
perror ("SNDCTL_MIX_DESCRIPTION");
208
local_get_value (int mixernum, int ctl, int timestamp)
214
val.timestamp = timestamp;
216
if (ioctl (mixer_fd[mixernum], SNDCTL_MIX_READ, &val) == -1)
218
perror ("SNDCTL_MIX_READ");
222
mixc_set_value (mixernum, ctl, val.value);
227
private_get_value (int mixernum, int ctl, int timestamp)
233
val.timestamp = timestamp;
235
if (ioctl (mixer_fd[mixernum], SNDCTL_MIX_READ, &val) == -1)
237
perror ("SNDCTL_MIX_READ");
245
local_set_value (int mixernum, int ctl, int timestamp, int value)
251
val.timestamp = timestamp;
254
if (ioctl (mixer_fd[mixernum], SNDCTL_MIX_WRITE, &val) == -1)
256
perror ("SNDCTL_MIX_WRITE");
258
mixc_set_value (mixernum, ctl, val.value);
262
update_values (int mixernum)
267
int value, prev_value;
269
nrext = ossmix_get_nrext (mixernum);
271
for (i = 0; i < nrext; i++)
273
if ((ext = mixc_get_node (mixernum, i)) == NULL)
278
if (ext->type == MIXT_DEVROOT || ext->type == MIXT_GROUP
279
|| ext->type == MIXT_MARKER)
282
prev_value = mixc_get_value (mixernum, i);
284
if ((value = private_get_value (mixernum, i, ext->timestamp)) < 0)
286
// TODO check for EIDRM
288
if (value != prev_value)
290
mixc_set_value (mixernum, i, value);
291
_client_event (OSSMIX_EVENT_VALUE, mixernum, i, value, 0, 0);
298
local_timertick(void)
302
for (mixernum=0;mixernum<num_mixers;mixernum++)
303
if (mixer_fd[mixernum] >= 0) /* Open */
305
update_values (mixernum);
308
n=ossmix_get_nmixers();
312
_client_event (OSSMIX_EVENT_NEWMIXER, n, 0, 0, 0, 0);
316
ossmix_driver_t ossmix_local_driver = {
328
local_get_description,