35#include <machine/bus.h>
44#ifdef HAVE_KERNEL_OPTION_HEADERS
92#error Too many hardware channels defined. 13 is the maximum
167static int emu10k2_adcspeed[9] = {48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000};
177 [SOUND_MIXER_DIGITAL1] = {1, 1, 1},
179 [SOUND_MIXER_DIGITAL2] = {1, 1, 3},
180 [SOUND_MIXER_LINE2] = {1, 1, 4},
181 [SOUND_MIXER_DIGITAL3] = {1, 1, 5},
182 [SOUND_MIXER_LINE3] = {1, 1, 6},
190 [SOUND_MIXER_VOLUME] = {1, 0, (-1)},
191 [SOUND_MIXER_PCM] = {1, 0, (-1)},
194 [SOUND_MIXER_DIGITAL1] = {1, 1, 1},
195 [SOUND_MIXER_DIGITAL2] = {1, 1, 2},
197 [SOUND_MIXER_LINE2] = {1, 1, 4},
198 [SOUND_MIXER_DIGITAL3] = {1, 1, 5},
199 [SOUND_MIXER_LINE3] = {1, 1, 6},
219 if (sc->
sm != NULL) {
230 p |= (1 << SOUND_MIXER_PCM);
231 p |= (1 << SOUND_MIXER_VOLUME);
235 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
242 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
265 if (sc->
sm != NULL) {
282 case SOUND_MIXER_VOLUME:
320 case SOUND_MIXER_PCM:
355 case SOUND_MIXER_DIGITAL1:
359 case SOUND_MIXER_DIGITAL2:
370 case SOUND_MIXER_LINE2:
374 case SOUND_MIXER_DIGITAL3:
378 case SOUND_MIXER_LINE3:
383 if (sc->
sm != NULL) {
389 device_printf(sc->
dev,
"mixer error: unknown device %d\n",
dev);
404 for (i=0; i < 8; i++)
416 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
418 if ((
src & (1 << i)) == ((uint32_t)1 << i)) {
425 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
427 if ((
src & (1 << i)) == ((uint32_t)1 << i)) {
460 if ((
src & (1 << SOUND_MIXER_PCM)) == (1 << SOUND_MIXER_PCM)) {
498 return (SOUND_MASK_MONITOR);
520#define AC97LEFT(x) ((x & 0x7F00)>>8)
521#define AC97RIGHT(x) (x & 0x007F)
522#define AC97MUTE(x) ((x & 0x8000)>>15)
523#define BIT4_TO100(x) (100-(x)*100/(0x0f))
524#define BIT6_TO100(x) (100-(x)*100/(0x3f))
525#define BIT4_TO255(x) (255-(x)*255/(0x0f))
526#define BIT6_TO255(x) (255-(x)*255/(0x3f))
527#define V100_TOBIT6(x) (0x3f*(100-x)/100)
528#define V100_TOBIT4(x) (0x0f*(100-x)/100)
529#define AC97ENCODE(x_muted, x_left, x_right) (((x_muted & 1)<<15) | ((x_left & 0x3f)<<8) | (x_right & 0x3f))
574 uint32_t emu_left, emu_right;
585 emu_left = emu_right = 0;
662 KASSERT(sc->
card != NULL, (
"emu_rdcd: no soundcard"));
673 KASSERT(sc->
card != NULL, (
"emu_wrcd: no soundcard"));
716 KASSERT(sc->
card != NULL, (
"empchan_init: no soundcard"));
745 if (ch->
slave != NULL)
865 KASSERT(
dir ==
PCMDIR_REC, (
"emurchan_init: bad direction"));
1045 KASSERT(
dir ==
PCMDIR_REC, (
"emurchan_init: bad direction"));
1047 if (sc == NULL)
return (NULL);
1114 switch (sc->
bufsz) {
1244 if (sc->
pch[i].
run == 1) {
1329 rt =
"multichannel recording";
1333 snprintf(
buffer, 255,
"EMU10Kx DSP %s PCM interface",
rt);
1345 uintptr_t
route,
r, ivar;
1347 sc = malloc(
sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
1349 if (sc->
card == NULL) {
1350 device_printf(
dev,
"cannot get bridge conf\n");
1366 for (i = 0; i < 8; i++) {
1373 for (i = 0; i < 8; i++) {
1397 if (sc->
codec != NULL)
1400 device_printf(
dev,
"failed to initialize DSP mixer\n");
1410 device_printf(
dev,
"failed to initialize mixer\n");
1418 device_printf(
dev,
"failed to initialize mixer\n");
1426 device_printf(
dev,
"failed to initialize mixer\n");
1436 device_printf(
dev,
"failed to initialize mixer\n");
1442 device_printf(
dev,
"failed to initialize EFX mixer\n");
1447 device_printf(
dev,
"invalid default route\n");
1456 device_printf(
dev,
"unable to initialize PCM part of the card\n");
1468 device_printf(
dev,
"can't register PCM channels!\n");
kobj_class_t ac97_getmixerclass(void)
void ac97_destroy(struct ac97_info *codec)
#define AC97_CREATE(dev, devinfo, cls)
int sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, int dmaflags, unsigned int size)
bus_addr_t sndbuf_getbufaddr(struct snd_dbuf *buf)
unsigned int sndbuf_getalign(struct snd_dbuf *b)
void chn_intr(struct pcm_channel *c)
#define PCMTRIG_COMMON(x)
struct pcmchan_matrix * m
static int emu_vinit(struct sc_info *sc, struct emu_voice *m, struct emu_voice *s, u_int32_t sz, struct snd_dbuf *b)
static void emu_wr(struct sc_info *, int, u_int32_t, int)
static void emu_wrptr(struct sc_info *sc, int chn, int reg, u_int32_t data)
static void emu_vwrite(struct sc_info *sc, struct emu_voice *v)
static u_int32_t emu_rd(struct sc_info *, int, int)
static struct emu_voice * emu_valloc(struct sc_info *sc)
static u_int32_t emu_rdptr(struct sc_info *sc, int chn, int reg)
static void emu_vsetup(struct sc_pchinfo *ch)
static void emu_vtrigger(struct sc_info *sc, struct emu_voice *v, int go)
static int emu_vpos(struct sc_info *sc, struct emu_voice *v)
static struct pcmchan_caps * emurchan_getcaps(kobj_t obj __unused, void *c_devinfo __unused)
static int emu10k2_adcspeed[9]
static kobj_method_t emudspmixer_methods[]
static int emupchan_trigger(kobj_t obj __unused, void *c_devinfo, int go)
static int emu10k1_adcspeed[8]
static uint32_t emupchan_getptr(kobj_t obj __unused, void *c_devinfo)
static int emu_rates_live[]
static uint32_t emufxrchan_setspeed(kobj_t obj __unused, void *c_devinfo, uint32_t speed)
static int emu_ewrcd(kobj_t obj __unused, void *devinfo, int regno, uint32_t data)
static struct pcmchan_caps emu_playcaps
static int emu_dspmixer_uninit(struct snd_mixer *m)
static uint32_t emu_pfmt[]
static const struct emu_dspmix_props_k1 dspmix_k1[SOUND_MIXER_NRDEVICES]
static kobj_method_t emu_eac97_methods[]
static struct pcmchan_caps * emufxrchan_getcaps(kobj_t obj __unused, void *c_devinfo)
static u_int32_t emu_dspmixer_setrecsrc(struct snd_mixer *m, u_int32_t src)
static uint32_t emu_pcm_intr(void *pcm, uint32_t stat)
static uint32_t emurchan_getptr(kobj_t obj __unused, void *c_devinfo)
static kobj_method_t emu_ac97_methods[]
static int emupchan_setformat(kobj_t obj __unused, void *c_devinfo, uint32_t format)
static int emu_pcm_attach(device_t dev)
DRIVER_MODULE(snd_emu10kx_pcm, emu10kx, emu_pcm_driver, pcm_devclass, 0, 0)
static int emurchan_setformat(kobj_t obj __unused, void *c_devinfo, uint32_t format)
static struct pcmchan_caps * emupchan_getcaps(kobj_t obj __unused, void *c_devinfo __unused)
static struct pcmchan_caps emu_reccaps_efx_audigy
static const struct emu_dspmix_props_k2 dspmix_k2[SOUND_MIXER_NRDEVICES]
static int emu_k2_recval(int speed)
static int emu_pcm_detach(device_t dev)
static int emu_rdcd(kobj_t obj __unused, void *devinfo, int regno)
static int emu_rates_audigy[]
static device_method_t emu_pcm_methods[]
static kobj_method_t emufxrchan_methods[]
static uint32_t emupchan_setspeed(kobj_t obj __unused, void *c_devinfo, uint32_t speed)
static uint32_t emurchan_setspeed(kobj_t obj __unused, void *c_devinfo, uint32_t speed)
static int emu_pcm_probe(device_t dev)
static void * emufxrchan_init(kobj_t obj __unused, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir __unused)
MODULE_VERSION(snd_emu10kx_pcm, SND_EMU10KX_PREFVER)
static int emu_efxmixer_init(struct snd_mixer *m)
static kobj_method_t emupchan_methods[]
static int emufxrchan_trigger(kobj_t obj __unused, void *c_devinfo, int go)
static void emu_ac97_write_emulation(struct emu_pcm_info *sc, int regno, uint32_t data)
static void * emupchan_init(kobj_t obj __unused, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir __unused)
static int emurchan_free(kobj_t obj __unused, void *c_devinfo)
static uint32_t emurchan_setblocksize(kobj_t obj __unused, void *c_devinfo, uint32_t blocksize)
static uint32_t emufxrchan_setblocksize(kobj_t obj __unused, void *c_devinfo, uint32_t blocksize)
static uint32_t emufxrchan_getptr(kobj_t obj __unused, void *c_devinfo)
static struct pcmchan_caps emu_playcaps_mono
static u_int32_t emu_efxmixer_setrecsrc(struct snd_mixer *m __unused, u_int32_t src __unused)
static int emufxrchan_setformat(kobj_t obj __unused, void *c_devinfo __unused, uint32_t format)
static kobj_method_t emurchan_methods[]
static int emu_dspmixer_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right)
static driver_t emu_pcm_driver
static struct pcmchan_caps emu_reccaps_adc
static int emu_efxmixer_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right)
static void * emurchan_init(kobj_t obj __unused, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir __unused)
static int emufxrchan_getrates(kobj_t obj __unused, void *c_devinfo, int **rates)
static uint32_t emu_pfmt_mono[]
static int emu_pcm_init(struct emu_pcm_info *sc)
MODULE_DEPEND(snd_emu10kx_pcm, snd_emu10kx, SND_EMU10KX_MINVER, SND_EMU10KX_PREFVER, SND_EMU10KX_MAXVER)
CHANNEL_DECLARE(emupchan)
static int emu_erdcd(kobj_t obj __unused, void *devinfo, int regno)
static int emurchan_trigger(kobj_t obj __unused, void *c_devinfo, int go)
static uint32_t emu_rfmt_adc[]
static int emu_ac97_read_emulation(struct emu_pcm_info *sc, int regno)
static struct pcmchan_caps emu_reccaps_efx_live
static int emu_pcm_uninit(struct emu_pcm_info *sc __unused)
static int emu_wrcd(kobj_t obj __unused, void *devinfo, int regno, uint32_t data)
static kobj_method_t emuefxmixer_methods[]
static int emu_dspmixer_init(struct snd_mixer *m)
static int emu_k1_recval(int speed)
static int emupchan_free(kobj_t obj __unused, void *c_devinfo)
static uint32_t emu_rfmt_efx[]
static uint32_t emupchan_setblocksize(kobj_t obj __unused, void *c_devinfo, uint32_t blocksize)
MIXER_DECLARE(emudspmixer)
int emu_timer_clear(struct emu_sc_info *sc, int timer)
void emu_vroute(struct emu_sc_info *sc, struct emu_route *rt, struct emu_voice *v)
int emu_timer_set(struct emu_sc_info *sc, int timer, int delay)
void emumix_set_volume(struct emu_sc_info *sc, int mixer_idx, int volume)
int emu_intr_register(struct emu_sc_info *sc, uint32_t inte_mask, uint32_t intr_mask, uint32_t(*func)(void *softc, uint32_t irq), void *isc)
void emu_vfree(struct emu_sc_info *sc, struct emu_voice *v)
int emu_timer_enable(struct emu_sc_info *sc, int timer, int go)
int emumix_get_volume(struct emu_sc_info *sc, int mixer_idx)
bus_dma_tag_t emu_gettag(struct emu_sc_info *sc)
int emu_intr_unregister(struct emu_sc_info *sc, int hnumber)
int emu_timer_create(struct emu_sc_info *sc)
#define SND_EMU10KX_MINVER
#define M_MASTER_SUBWOOFER
#define EMU_VAR_ISEMU10K1
#define SND_EMU10KX_PREFVER
#define EMU_VAR_MCH_DISABLED
#define SND_EMU10KX_MAXVER
#define EMU_IPR_INTERVALTIMER
#define EMU_A_ADCCR_RCHANENABLE
#define EMU_IPR_ADCBUFFULL
#define EMU_ADCCR_LCHANENABLE
#define EMU_RECBS_BUFSIZE_4096
#define EMU_ADCCR_RCHANENABLE
#define EMU_INTE_EFXBUFENABLE
#define EMU_RECBS_BUFSIZE_8192
#define EMU_IPR_ADCBUFHALFFULL
#define EMU_RECBS_BUFSIZE_16384
#define EMU_IPR_EFXBUFHALFFULL
#define EMU_INTE_ADCBUFENABLE
#define EMU_RECBS_BUFSIZE_65536
#define EMU_RECBS_BUFSIZE_32768
#define EMU_INTE_INTERTIMERENB
#define EMU_A_ADCCR_LCHANENABLE
#define EMU_IPR_EFXBUFFULL
static int mixer_setrecsrc(struct snd_mixer *mixer, u_int32_t src)
int mixer_init(device_t dev, kobj_class_t cls, void *devinfo)
int mixer_delete(struct snd_mixer *m)
static int mixer_set(struct snd_mixer *m, u_int dev, u_int32_t muted, u_int lev)
u_int32_t mix_getdevs(struct snd_mixer *m)
int mixer_uninit(device_t dev)
void mix_setdevs(struct snd_mixer *m, u_int32_t v)
struct snd_mixer * mixer_create(device_t dev, kobj_class_t cls, void *devinfo, const char *desc)
int mix_setrecsrc(struct snd_mixer *m, u_int32_t src)
u_int32_t mix_getrecdevs(struct snd_mixer *m)
int mix_set(struct snd_mixer *m, u_int dev, u_int left, u_int right)
void * mix_getdevinfo(struct snd_mixer *m)
void mix_setrecdevs(struct snd_mixer *m, u_int32_t v)
Record mask of available recording devices.
void * snd_mtxcreate(const char *desc, const char *type)
void pcm_setflags(device_t dev, uint32_t val)
void * pcm_getdevinfo(device_t dev)
uint32_t pcm_getflags(device_t dev)
int pcm_setstatus(device_t dev, char *str)
void snd_mtxfree(void *m)
int pcm_addchan(device_t dev, int dir, kobj_class_t cls, void *devinfo)
int pcm_unregister(device_t dev)
int pcm_register(device_t dev, void *devinfo, int numplay, int numrec)
unsigned int pcm_getbuffersize(device_t dev, unsigned int minbufsz, unsigned int deflt, unsigned int maxbufsz)
#define SND_FORMAT(f, c, e)
unsigned int emu10k1_volcache[2][2]
kobj_class_t ac97_mixerclass
struct emu_pcm_rchinfo rch_adc
uint32_t ac97_state[0x7F]
struct emu_pcm_pchinfo pch[MAX_CHANNELS]
struct emu_sc_info * card
struct emu_pcm_rchinfo rch_efx
struct pcm_channel * channel
struct emu_pcm_info * pcm
struct emu_voice * master
struct emu_pcm_info * pcm
struct pcm_channel * channel