mirror of https://github.com/ericonr/sndio.git
sndiod: replace the gloal opt list with per-device lists.
This commit is contained in:
parent
ddf5e0dfa7
commit
37ee5aa871
|
@ -24,6 +24,7 @@
|
||||||
#include "dsp.h"
|
#include "dsp.h"
|
||||||
#include "siofile.h"
|
#include "siofile.h"
|
||||||
#include "midi.h"
|
#include "midi.h"
|
||||||
|
#include "opt.h"
|
||||||
#include "sysex.h"
|
#include "sysex.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
@ -972,6 +973,7 @@ dev_new(char *path, struct aparams *par,
|
||||||
d = xmalloc(sizeof(struct dev));
|
d = xmalloc(sizeof(struct dev));
|
||||||
d->path = xstrdup(path);
|
d->path = xstrdup(path);
|
||||||
d->num = dev_sndnum++;
|
d->num = dev_sndnum++;
|
||||||
|
d->opt_list = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXX: below, we allocate a midi input buffer, since we don't
|
* XXX: below, we allocate a midi input buffer, since we don't
|
||||||
|
@ -1239,6 +1241,8 @@ dev_del(struct dev *d)
|
||||||
log_puts(": deleting\n");
|
log_puts(": deleting\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
while (d->opt_list != NULL)
|
||||||
|
opt_del(d, d->opt_list);
|
||||||
if (d->pstate != DEV_CFG)
|
if (d->pstate != DEV_CFG)
|
||||||
dev_close(d);
|
dev_close(d);
|
||||||
for (p = &dev_list; *p != d; p = &(*p)->next) {
|
for (p = &dev_list; *p != d; p = &(*p)->next) {
|
||||||
|
|
13
sndiod/dev.h
13
sndiod/dev.h
|
@ -95,12 +95,25 @@ struct slot {
|
||||||
unsigned int tstate; /* mmc state */
|
unsigned int tstate; /* mmc state */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct opt {
|
||||||
|
struct opt *next;
|
||||||
|
#define OPT_NAMEMAX 11
|
||||||
|
char name[OPT_NAMEMAX + 1];
|
||||||
|
int maxweight; /* max dynamic range for clients */
|
||||||
|
int pmin, pmax; /* play channels */
|
||||||
|
int rmin, rmax; /* recording channels */
|
||||||
|
int mmc; /* true if MMC control enabled */
|
||||||
|
int dup; /* true if join/expand enabled */
|
||||||
|
int mode; /* bitmap of MODE_XXX */
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* audio device with plenty of slots
|
* audio device with plenty of slots
|
||||||
*/
|
*/
|
||||||
struct dev {
|
struct dev {
|
||||||
struct dev *next;
|
struct dev *next;
|
||||||
struct slot *slot_list; /* audio streams attached */
|
struct slot *slot_list; /* audio streams attached */
|
||||||
|
struct opt *opt_list;
|
||||||
struct midi *midi;
|
struct midi *midi;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
25
sndiod/opt.c
25
sndiod/opt.c
|
@ -20,13 +20,11 @@
|
||||||
#include "opt.h"
|
#include "opt.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
struct opt *opt_list = NULL;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* create a new audio sub-device "configuration"
|
* create a new audio sub-device "configuration"
|
||||||
*/
|
*/
|
||||||
struct opt *
|
struct opt *
|
||||||
opt_new(char *name, struct dev *dev,
|
opt_new(struct dev *d, char *name,
|
||||||
int pmin, int pmax, int rmin, int rmax,
|
int pmin, int pmax, int rmin, int rmax,
|
||||||
int maxweight, int mmc, int dup, unsigned int mode)
|
int maxweight, int mmc, int dup, unsigned int mode)
|
||||||
{
|
{
|
||||||
|
@ -34,7 +32,9 @@ opt_new(char *name, struct dev *dev,
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
if (opt_byname(name, dev->num)) {
|
if (opt_byname(d, name)) {
|
||||||
|
dev_log(d);
|
||||||
|
log_puts(".");
|
||||||
log_puts(name);
|
log_puts(name);
|
||||||
log_puts(": already defined\n");
|
log_puts(": already defined\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -66,12 +66,11 @@ opt_new(char *name, struct dev *dev,
|
||||||
o->mmc = mmc;
|
o->mmc = mmc;
|
||||||
o->dup = dup;
|
o->dup = dup;
|
||||||
o->mode = mode;
|
o->mode = mode;
|
||||||
o->dev = dev;
|
|
||||||
memcpy(o->name, name, len + 1);
|
memcpy(o->name, name, len + 1);
|
||||||
o->next = opt_list;
|
o->next = d->opt_list;
|
||||||
opt_list = o;
|
d->opt_list = o;
|
||||||
if (log_level >= 2) {
|
if (log_level >= 2) {
|
||||||
dev_log(o->dev);
|
dev_log(d);
|
||||||
log_puts(".");
|
log_puts(".");
|
||||||
log_puts(o->name);
|
log_puts(o->name);
|
||||||
log_puts(":");
|
log_puts(":");
|
||||||
|
@ -107,13 +106,11 @@ opt_new(char *name, struct dev *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct opt *
|
struct opt *
|
||||||
opt_byname(char *name, unsigned int num)
|
opt_byname(struct dev *d, char *name)
|
||||||
{
|
{
|
||||||
struct opt *o;
|
struct opt *o;
|
||||||
|
|
||||||
for (o = opt_list; o != NULL; o = o->next) {
|
for (o = d->opt_list; o != NULL; o = o->next) {
|
||||||
if (o->dev->num != num)
|
|
||||||
continue;
|
|
||||||
if (strcmp(name, o->name) == 0)
|
if (strcmp(name, o->name) == 0)
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
@ -121,11 +118,11 @@ opt_byname(char *name, unsigned int num)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
opt_del(struct opt *o)
|
opt_del(struct dev *d, struct opt *o)
|
||||||
{
|
{
|
||||||
struct opt **po;
|
struct opt **po;
|
||||||
|
|
||||||
for (po = &opt_list; *po != o; po = &(*po)->next) {
|
for (po = &d->opt_list; *po != o; po = &(*po)->next) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (*po == NULL) {
|
if (*po == NULL) {
|
||||||
log_puts("opt_del: not on list\n");
|
log_puts("opt_del: not on list\n");
|
||||||
|
|
21
sndiod/opt.h
21
sndiod/opt.h
|
@ -19,24 +19,9 @@
|
||||||
|
|
||||||
struct dev;
|
struct dev;
|
||||||
|
|
||||||
struct opt {
|
struct opt *opt_new(struct dev *, char *, int, int, int, int,
|
||||||
struct opt *next;
|
|
||||||
#define OPT_NAMEMAX 11
|
|
||||||
char name[OPT_NAMEMAX + 1];
|
|
||||||
int maxweight; /* max dynamic range for clients */
|
|
||||||
int pmin, pmax; /* play channels */
|
|
||||||
int rmin, rmax; /* recording channels */
|
|
||||||
int mmc; /* true if MMC control enabled */
|
|
||||||
int dup; /* true if join/expand enabled */
|
|
||||||
int mode; /* bitmap of MODE_XXX */
|
|
||||||
struct dev *dev; /* device to which we're attached */
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct opt *opt_list;
|
|
||||||
|
|
||||||
struct opt *opt_new(char *, struct dev *, int, int, int, int,
|
|
||||||
int, int, int, unsigned int);
|
int, int, int, unsigned int);
|
||||||
void opt_del(struct opt *);
|
void opt_del(struct dev *, struct opt *);
|
||||||
struct opt *opt_byname(char *, unsigned int);
|
struct opt *opt_byname(struct dev *, char *);
|
||||||
|
|
||||||
#endif /* !defined(OPT_H) */
|
#endif /* !defined(OPT_H) */
|
||||||
|
|
|
@ -325,7 +325,7 @@ mkopt(char *path, struct dev *d,
|
||||||
{
|
{
|
||||||
struct opt *o;
|
struct opt *o;
|
||||||
|
|
||||||
o = opt_new(path, d, pmin, pmax, rmin, rmax,
|
o = opt_new(d, path, pmin, pmax, rmin, rmax,
|
||||||
MIDI_TO_ADATA(vol), mmc, dup, mode);
|
MIDI_TO_ADATA(vol), mmc, dup, mode);
|
||||||
if (o == NULL)
|
if (o == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -466,7 +466,7 @@ main(int argc, char **argv)
|
||||||
if (dev_list == NULL)
|
if (dev_list == NULL)
|
||||||
mkdev(DEFAULT_DEV, &par, 0, bufsz, round, rate, hold, autovol);
|
mkdev(DEFAULT_DEV, &par, 0, bufsz, round, rate, hold, autovol);
|
||||||
for (d = dev_list; d != NULL; d = d->next) {
|
for (d = dev_list; d != NULL; d = d->next) {
|
||||||
if (opt_byname("default", d->num))
|
if (opt_byname(d, "default"))
|
||||||
continue;
|
continue;
|
||||||
if (mkopt("default", d, pmin, pmax, rmin, rmax,
|
if (mkopt("default", d, pmin, pmax, rmin, rmax,
|
||||||
mode, vol, mmc, dup) == NULL)
|
mode, vol, mmc, dup) == NULL)
|
||||||
|
@ -534,8 +534,6 @@ main(int argc, char **argv)
|
||||||
; /* nothing */
|
; /* nothing */
|
||||||
midi_done();
|
midi_done();
|
||||||
|
|
||||||
while (opt_list != NULL)
|
|
||||||
opt_del(opt_list);
|
|
||||||
while (dev_list)
|
while (dev_list)
|
||||||
dev_del(dev_list);
|
dev_del(dev_list);
|
||||||
while (port_list)
|
while (port_list)
|
||||||
|
|
|
@ -843,14 +843,17 @@ sock_hello(struct sock *f)
|
||||||
return 0;
|
return 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
f->opt = opt_byname(p->opt, p->devnum);
|
d = dev_bynum(p->devnum);
|
||||||
|
if (d == NULL)
|
||||||
|
return 0;
|
||||||
|
f->opt = opt_byname(d, p->opt);
|
||||||
if (f->opt == NULL)
|
if (f->opt == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (log_level >= 3) {
|
if (log_level >= 3) {
|
||||||
sock_log(f);
|
sock_log(f);
|
||||||
log_puts(": using ");
|
log_puts(": using ");
|
||||||
dev_log(f->opt->dev);
|
dev_log(d);
|
||||||
log_puts(".");
|
log_puts(".");
|
||||||
log_puts(f->opt->name);
|
log_puts(f->opt->name);
|
||||||
log_puts(", mode = ");
|
log_puts(", mode = ");
|
||||||
|
@ -869,7 +872,7 @@ sock_hello(struct sock *f)
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
s = slot_new(f->opt->dev, p->who, &sock_slotops, f, mode);
|
s = slot_new(d, p->who, &sock_slotops, f, mode);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
f->midi = NULL;
|
f->midi = NULL;
|
||||||
|
|
Loading…
Reference in New Issue