#ifndef _MIXER_H_
#define _MIXER_H_
#include <sys/cdefs.h>
#include <sys/queue.h>
#include <sys/soundcard.h>
#include <limits.h>
#define MIX_ISSET(n,f) (((1U << (n)) & (f)) ? 1 : 0)
#define MIX_ISDEV(m,n) MIX_ISSET(n, (m)->devmask)
#define MIX_ISMUTE(m,n) MIX_ISSET(n, (m)->mutemask)
#define MIX_ISREC(m,n) MIX_ISSET(n, (m)->recmask)
#define MIX_ISRECSRC(m,n) MIX_ISSET(n, (m)->recsrc)
struct mixer;
struct mix_dev;
typedef struct mix_ctl mix_ctl_t;
typedef struct mix_volume mix_volume_t;
struct mix_ctl {
struct mix_dev *parent_dev;
int id;
char name[NAME_MAX];
int (*mod)(struct mix_dev *, void *);
int (*print)(struct mix_dev *, void *);
TAILQ_ENTRY(mix_ctl) ctls;
};
struct mix_dev {
struct mixer *parent_mixer;
char name[NAME_MAX];
int devno;
struct mix_volume {
#define MIX_VOLMIN 0.0f
#define MIX_VOLMAX 1.0f
#define MIX_VOLNORM(v) ((v) / 100.0f)
#define MIX_VOLDENORM(v) ((int)((v) * 100.0f + 0.5f))
float left;
float right;
} vol;
int nctl;
TAILQ_HEAD(mix_ctlhead, mix_ctl) ctls;
TAILQ_ENTRY(mix_dev) devs;
};
struct mixer {
TAILQ_HEAD(mix_devhead, mix_dev) devs;
struct mix_dev *dev;
oss_mixerinfo mi;
oss_card_info ci;
char name[NAME_MAX];
int fd;
int unit;
int ndev;
int devmask;
#define MIX_MUTE 0x01
#define MIX_UNMUTE 0x02
#define MIX_TOGGLEMUTE 0x04
int mutemask;
int recmask;
#define MIX_ADDRECSRC 0x01
#define MIX_REMOVERECSRC 0x02
#define MIX_SETRECSRC 0x04
#define MIX_TOGGLERECSRC 0x08
int recsrc;
#define MIX_MODE_MIXER 0x01
#define MIX_MODE_PLAY 0x02
#define MIX_MODE_REC 0x04
int mode;
int f_default;
};
__BEGIN_DECLS
struct mixer *mixer_open(const char *);
int mixer_close(struct mixer *);
struct mix_dev *mixer_get_dev(struct mixer *, int);
struct mix_dev *mixer_get_dev_byname(struct mixer *, const char *);
int mixer_add_ctl(struct mix_dev *, int, const char *,
int (*)(struct mix_dev *, void *), int (*)(struct mix_dev *, void *));
int mixer_add_ctl_s(mix_ctl_t *);
int mixer_remove_ctl(mix_ctl_t *);
mix_ctl_t *mixer_get_ctl(struct mix_dev *, int);
mix_ctl_t *mixer_get_ctl_byname(struct mix_dev *, const char *);
int mixer_set_vol(struct mixer *, mix_volume_t);
int mixer_set_mute(struct mixer *, int);
int mixer_mod_recsrc(struct mixer *, int);
int mixer_get_dunit(void);
int mixer_set_dunit(struct mixer *, int);
int mixer_get_mode(int);
int mixer_get_nmixers(void);
int mixer_get_path(char *, size_t, int);
__END_DECLS
#endif