#define AD1848_NPORT 4
#define AD1848_TIMO 1000000
struct ad1848_volume {
u_char left;
u_char right;
};
struct ad1848_softc {
struct device sc_dev;
struct isadev sc_id;
void *sc_ih;
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
int sc_iooffs;
void *parent;
struct device *sc_isa;
char sc_playrun;
char sc_recrun;
int sc_irq;
int sc_drq;
int sc_recdrq;
int sc_flags;
#define AD1848_FLAG_32REGS 0x01
struct ad1848_volume gains[6];
struct ad1848_volume rec_gain;
int rec_port;
u_char MCE_bit;
char mic_gain_on;
char mute[6];
char *chip_name;
int mode;
u_int precision;
int channels;
u_char speed_bits;
u_char format_bits;
u_char need_commit;
void (*sc_pintr)(void *);
void (*sc_rintr)(void *);
void *sc_parg;
void *sc_rarg;
int sc_iobase;
};
#define MUTE_LEFT 1
#define MUTE_RIGHT 2
#define MUTE_ALL (MUTE_LEFT | MUTE_RIGHT)
#define MUTE_MONO MUTE_ALL
#define AD1848_AUX2_CHANNEL 0
#define AD1848_AUX1_CHANNEL 1
#define AD1848_DAC_CHANNEL 2
#define AD1848_LINE_CHANNEL 3
#define AD1848_MONO_CHANNEL 4
#define AD1848_MONITOR_CHANNEL 5
#define MIC_IN_PORT 0
#define LINE_IN_PORT 1
#define AUX1_IN_PORT 2
#define DAC_IN_PORT 3
#ifdef _KERNEL
#define AD1848_KIND_LVL 0
#define AD1848_KIND_MUTE 1
#define AD1848_KIND_RECORDGAIN 2
#define AD1848_KIND_MICGAIN 3
#define AD1848_KIND_RECORDSOURCE 4
typedef struct ad1848_devmap {
int id;
int kind;
int dev;
} ad1848_devmap_t;
static __inline int ad1848_to_vol(mixer_ctrl_t *, struct ad1848_volume *);
static __inline int ad1848_from_vol(mixer_ctrl_t *, struct ad1848_volume *);
static __inline int
ad1848_to_vol(mixer_ctrl_t *cp, struct ad1848_volume *vol)
{
if (cp->un.value.num_channels == 1) {
vol->left = vol->right = cp->un.value.level[AUDIO_MIXER_LEVEL_MONO];
return(1);
}
else if (cp->un.value.num_channels == 2) {
vol->left = cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT];
vol->right = cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT];
return(1);
}
return(0);
}
static __inline int
ad1848_from_vol(mixer_ctrl_t *cp, struct ad1848_volume *vol)
{
if (cp->un.value.num_channels == 1) {
cp->un.value.level[AUDIO_MIXER_LEVEL_MONO] = vol->left;
return(1);
}
else if (cp->un.value.num_channels == 2) {
cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT] = vol->left;
cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = vol->right;
return(1);
}
return(0);
}
int ad1848_mixer_get_port(struct ad1848_softc *, ad1848_devmap_t *, int cnt, mixer_ctrl_t *);
int ad1848_mixer_set_port(struct ad1848_softc *, ad1848_devmap_t *, int, mixer_ctrl_t *);
int ad1848_mapprobe(struct ad1848_softc *, int);
int ad1848_probe(struct ad1848_softc *);
void ad1848_unmap(struct ad1848_softc *);
void ad1848_attach(struct ad1848_softc *);
int ad1848_open(void *, int);
void ad1848_close(void *);
void ad1848_forceintr(struct ad1848_softc *);
int ad1848_set_params(void *, int, int, struct audio_params *, struct audio_params *);
int ad1848_round_blocksize(void *, int);
int ad1848_trigger_input(void *, void *, void *, int, void (*)(void *),
void *, struct audio_params *);
int ad1848_trigger_output(void *, void *, void *, int, void (*)(void *),
void *, struct audio_params *);
int ad1848_commit_settings(void *);
int ad1848_halt_input(void *);
int ad1848_halt_output(void *);
int ad1848_intr(void *);
int ad1848_set_rec_port(struct ad1848_softc *, int);
int ad1848_get_rec_port(struct ad1848_softc *);
int ad1848_set_channel_gain(struct ad1848_softc *, int, struct ad1848_volume *);
int ad1848_get_device_gain(struct ad1848_softc *, int, struct ad1848_volume *);
int ad1848_set_rec_gain(struct ad1848_softc *, struct ad1848_volume *);
int ad1848_get_rec_gain(struct ad1848_softc *, struct ad1848_volume *);
int ad1848_set_mic_gain(struct ad1848_softc *, struct ad1848_volume *);
int ad1848_get_mic_gain(struct ad1848_softc *, struct ad1848_volume *);
void ad1848_mute_channel(struct ad1848_softc *, int device, int mute);
void *ad1848_malloc(void *, int, size_t, int, int);
void ad1848_free(void *, void *, int);
size_t ad1848_round(void *, int, size_t);
#endif