31#ifdef HAVE_KERNEL_OPTION_HEADERS
51#define WAVEOUT_MAXBUFSIZE 32768
52#define EMUPAGESIZE 4096
53#define EMUMAXPAGES (WAVEOUT_MAXBUFSIZE * NUM_G / EMUPAGESIZE)
54#define EMU10K1_PCI_ID 0x00021102
55#define EMU10K2_PCI_ID 0x00041102
56#define EMU10K3_PCI_ID 0x00081102
57#define EMU_DEFAULT_BUFSZ 4096
58#define EMU_MAX_CHANS 8
66#define TMEMSIZE 256*1024
69#define ENABLE 0xffffffff
70#define DISABLE 0x00000000
71#define ENV_ON EMU_CHAN_DCYSUSV_CHANNELENABLE_MASK
74#define EMU_A_IOCFG_GPOUT_A 0x40
75#define EMU_A_IOCFG_GPOUT_D 0x04
76#define EMU_A_IOCFG_GPOUT_AD (EMU_A_IOCFG_GPOUT_A|EMU_A_IOCFG_GPOUT_D)
78#define EMU_HCFG_GPOUT1 0x00000800
85#define C_00000000 0x40
86#define C_00000001 0x41
87#define C_00000004 0x44
88#define C_40000000 0x4d
90#define A_C_00000000 0xc0
91#define A_C_40000000 0xcd
94#define FXBUS(x) (0x00 + (x))
95#define EXTIN(x) (0x10 + (x))
96#define EXTOUT(x) (0x20 + (x))
98#define GPR(x) (EMU_FXGPREGBASE + (x))
99#define A_EXTIN(x) (0x40 + (x))
100#define A_FXBUS(x) (0x00 + (x))
101#define A_EXTOUT(x) (0x60 + (x))
102#define A_GPR(x) (EMU_A_FXGPREGBASE + (x))
105#define FXBUS_PCM_LEFT 0x00
106#define FXBUS_PCM_RIGHT 0x01
107#define FXBUS_MIDI_LEFT 0x04
108#define FXBUS_MIDI_RIGHT 0x05
109#define FXBUS_MIDI_REVERB 0x0c
110#define FXBUS_MIDI_CHORUS 0x0d
113#define EXTIN_AC97_L 0x00
114#define EXTIN_AC97_R 0x01
115#define EXTIN_SPDIF_CD_L 0x02
116#define EXTIN_SPDIF_CD_R 0x03
117#define EXTIN_TOSLINK_L 0x06
118#define EXTIN_TOSLINK_R 0x07
119#define EXTIN_COAX_SPDIF_L 0x0a
120#define EXTIN_COAX_SPDIF_R 0x0b
122#define A_EXTIN_AC97_L 0x00
123#define A_EXTIN_AC97_R 0x01
126#define EXTOUT_AC97_L 0x00
127#define EXTOUT_AC97_R 0x01
128#define EXTOUT_TOSLINK_L 0x02
129#define EXTOUT_TOSLINK_R 0x03
130#define EXTOUT_AC97_CENTER 0x04
131#define EXTOUT_AC97_LFE 0x05
132#define EXTOUT_HEADPHONE_L 0x06
133#define EXTOUT_HEADPHONE_R 0x07
134#define EXTOUT_REAR_L 0x08
135#define EXTOUT_REAR_R 0x09
136#define EXTOUT_ADC_CAP_L 0x0a
137#define EXTOUT_ADC_CAP_R 0x0b
138#define EXTOUT_ACENTER 0x11
139#define EXTOUT_ALFE 0x12
141#define A_EXTOUT_FRONT_L 0x00
142#define A_EXTOUT_FRONT_R 0x01
143#define A_EXTOUT_CENTER 0x02
144#define A_EXTOUT_LFE 0x03
145#define A_EXTOUT_HEADPHONE_L 0x04
146#define A_EXTOUT_HEADPHONE_R 0x05
147#define A_EXTOUT_REAR_L 0x06
148#define A_EXTOUT_REAR_R 0x07
149#define A_EXTOUT_AFRONT_L 0x08
150#define A_EXTOUT_AFRONT_R 0x09
151#define A_EXTOUT_ACENTER 0x0a
152#define A_EXTOUT_ALFE 0x0b
153#define A_EXTOUT_AREAR_L 0x0e
154#define A_EXTOUT_AREAR_R 0x0f
155#define A_EXTOUT_AC97_L 0x10
156#define A_EXTOUT_AC97_R 0x11
157#define A_EXTOUT_ADC_CAP_L 0x16
158#define A_EXTOUT_ADC_CAP_R 0x17
164 u_int32_t pte_start, pte_size;
165 bus_dmamap_t buf_map;
218 bus_space_handle_t
sh;
221 struct resource *
reg, *
irq;
247static void *
emu_malloc(
struct sc_info *sc, u_int32_t sz, bus_addr_t *addr, bus_dmamap_t *map);
293static int adcspeed[8] = {48000, 44100, 32000, 24000, 22050, 16000, 11025, 8000};
296 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000
306 return bus_space_read_1(sc->
st, sc->
sh,
regno);
308 return bus_space_read_2(sc->
st, sc->
sh,
regno);
310 return bus_space_read_4(sc->
st, sc->
sh,
regno);
340 if (
reg & 0xff000000) {
357 if (
reg & 0xff000000) {
415 for (i = 0; i < sc->
nchans; i++) {
425 for (i = 0; i < 3; i++) {
446 if (sc->
timer++ == 0) {
454 x &= ~EMU_INTE_INTERTIMERENB;
493 static u_int32_t logMagTable[128] = {
494 0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3, 0x13aa2,
495 0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a, 0x2655d, 0x28ed5,
496 0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb, 0x381b6, 0x3a93d, 0x3d081,
497 0x3f782, 0x41e42, 0x444c1, 0x46b01, 0x49101, 0x4b6c4, 0x4dc49, 0x50191,
498 0x5269e, 0x54b6f, 0x57006, 0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7,
499 0x646ee, 0x66a00, 0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829,
500 0x759d4, 0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e,
501 0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20, 0x93d26,
502 0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec, 0xa11d8, 0xa2f9d,
503 0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241, 0xadf26, 0xafbe7, 0xb1885,
504 0xb3500, 0xb5157, 0xb6d8c, 0xb899f, 0xba58f, 0xbc15e, 0xbdd0c, 0xbf899,
505 0xc1404, 0xc2f50, 0xc4a7b, 0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c,
506 0xceaec, 0xd053f, 0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3,
507 0xdba4a, 0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3,
508 0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a, 0xf2c83,
509 0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57, 0xfd1a7, 0xfe8df
511 static char logSlopeTable[128] = {
512 0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58,
513 0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53,
514 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f,
515 0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b,
516 0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47,
517 0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44,
518 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41,
519 0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e,
520 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c,
521 0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39,
522 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37,
523 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35,
524 0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34,
525 0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32,
526 0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30,
527 0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f
534 for (i = 31; i > 0; i--) {
535 if (
rate & 0x80000000) {
536 return (((u_int32_t) (i - 15) << 20) +
537 logMagTable[0x7f & (
rate >> 24)] +
538 (0x7f & (
rate >> 17)) *
539 logSlopeTable[0x7f & (
rate >> 24)]);
561 for (i = 0; i < 64 && sc->
voice[i].
busy; i++);
582 m->end =
m->start + sz;
595 m->fxrt2 = 0x3f3f3f3f;
628 if (v->
slave != NULL) {
635 if (v->
slave != NULL)
647 s = (v->
stereo ? 1 : 0) + (v->
b16 ? 1 : 0);
652 l =
r = x = y = v->
vol;
679 silent_page = ((u_int32_t)(sc->
mem.silent_page_addr) << 1)
702 if (v->
slave != NULL)
709 u_int32_t pitch_target, initial_pitch;
710 u_int32_t cra, cs, ccis;
716 ccis = v->
stereo ? 28 : 30;
717 ccis *= v->
b16 ? 1 : 2;
718 sample = v->
b16 ? 0x00000000 : 0x80808080;
720 for (i = 0; i < cs; i++)
746 if (v->
slave != NULL)
755 s = (v->
b16 ? 1 : 0) + (v->
stereo ? 1 : 0);
757 return ptr & ~0x0000001f;
765 "cpf",
"ptrx",
"cvcf",
"vtft",
"z2",
"z1",
"psst",
"dsl",
766 "ccca",
"ccr",
"clp",
"fxrt",
"mapa",
"mapb", NULL, NULL,
767 "envvol",
"atkhldv",
"dcysusv",
"lfoval1",
768 "envval",
"atkhldm",
"dcysusm",
"lfoval2",
769 "ip",
"ifatn",
"pefe",
"fmmod",
"tremfrq",
"fmfrq2",
773 "mudata1",
"mustat1",
"mudata2",
"mustat2",
774 "fxwc1",
"fxwc2",
"spdrate", NULL, NULL,
775 NULL, NULL, NULL,
"fxrt2",
"sndamnt",
"fxrt1",
780 printf(
"voice number %d\n", v->
vnum);
781 for (i = 0, x = 0; i <= 0x1e; i++) {
782 if (regname[i] == NULL)
785 printf(
"%s", (x == 2) ?
"\n" :
"\t");
793 for (i = 0; i <= 0xe; i++) {
794 if (regname2[i] == NULL)
796 printf(
"%s\t[%08x]", regname2[i],
798 printf(
"%s", (x == 2)?
"\n" :
"\t");
899 printf(
"start [%d bit, %s, %d hz]\n",
900 ch->master->b16 ? 16 : 8,
901 ch->master->stereo ?
"stereo" :
"mono",
903 emu_vdump(sc,
ch->master);
904 emu_vdump(sc,
ch->slave);
954 KASSERT(
dir ==
PCMDIR_REC, (
"emurchan_init: bad direction"));
1113 val &= ~ch->irqmask;
1225 u_int32_t stat, ack, i, x;
1249 device_printf(sc->
dev,
"pci error\n");
1255 device_printf(sc->
dev,
1256 "sample rate tracker lock status change\n");
1267 device_printf(sc->
dev,
"dodgy irq: %x (harmless)\n",
1277 for (i = 0; i < sc->
nchans; i++) {
1309emu_setmap(
void *arg, bus_dma_segment_t *segs,
int nseg,
int error)
1311 bus_addr_t *phys = arg;
1313 *phys =
error ? 0 : (bus_addr_t)segs->ds_addr;
1316 printf(
"emu: setmap (%lx, %lx), nseg=%d, error=%d\n",
1317 (
unsigned long)segs->ds_addr, (
unsigned long)segs->ds_len,
1329 if (bus_dmamem_alloc(sc->
parent_dmat, &
buf, BUS_DMA_NOWAIT, map))
1332 BUS_DMA_NOWAIT) || !*
addr) {
1349 u_int32_t
blksz,
start, idx, ofs, tmp, found;
1363 if (mem->
bmap[idx >> 3] & (1 << (idx & 7)))
1370 blk = malloc(
sizeof(*blk), M_DEVBUF, M_NOWAIT);
1374 *
addr = blk->buf_addr;
1376 free(blk, M_DEVBUF);
1380 blk->pte_start =
start;
1381 blk->pte_size =
blksz;
1383 printf(
"buf %p, pte_start %d, pte_size %d\n", blk->buf,
1384 blk->pte_start, blk->pte_size);
1388 mem->
bmap[idx >> 3] |= 1 << (idx & 7);
1389 tmp = (uint32_t)(blk->buf_addr + ofs);
1391 printf(
"pte[%d] -> %x phys, %x virt\n", idx, tmp,
1392 ((u_int32_t)
buf) + ofs);
1397 SLIST_INSERT_HEAD(&mem->blocks, blk, link);
1409 SLIST_FOREACH(i, &mem->blocks, link) {
1415 SLIST_REMOVE(&mem->blocks, blk,
emu_memblk, link);
1417 tmp = (u_int32_t)(sc->
mem.silent_page_addr) << 1;
1418 for (idx = blk->pte_start; idx < blk->pte_start + blk->pte_size; idx++) {
1419 mem->
bmap[idx >> 3] &= ~(1 << (idx & 7));
1422 free(blk, M_DEVBUF);
1433 SLIST_FOREACH(i, &mem->blocks, link) {
1439 return blk->pte_start;
1446 emu_wrefx(sc, (*pc) * 2, (x << 10) | y);
1447 emu_wrefx(sc, (*pc) * 2 + 1, (op << 20) | (z << 10) | w);
1455 emu_wrefx(sc, (*pc) * 2, (x << 12) | y);
1456 emu_wrefx(sc, (*pc) * 2 + 1, (op << 24) | (z << 12) | w);
1467 for (i = 0; i < 512; i++)
1470 for (i = 0; i < 512; i++)
1621 for (i = 0; i < 512; i++) {
1626 for (i = 0; i < 256; i++)
1754 u_int32_t spcs, ch, tmp, i;
1790 for (ch = 0; ch <
NUM_G; ch++) {
1883 emu_wr(sc, 0x20, 0x00600000, 4);
1884 emu_wr(sc, 0x24, 0x00000014, 4);
1887 emu_wr(sc, 0x20, 0x006e0000, 4);
1888 emu_wr(sc, 0x24, 0xff00ff00, 4);
1891 SLIST_INIT(&sc->
mem.blocks);
1893 &sc->
mem.ptb_pages_addr, &sc->
mem.ptb_map);
1894 if (sc->
mem.ptb_pages == NULL)
1898 &sc->
mem.silent_page_addr, &sc->
mem.silent_map);
1899 if (sc->
mem.silent_page == NULL) {
1905 tmp = (u_int32_t)(sc->
mem.silent_page_addr) << 1;
1907 sc->
mem.ptb_pages[i] = tmp | i;
1913 for (ch = 0; ch <
NUM_G; ch++) {
1997 for (ch = 0; ch <
NUM_G; ch++)
1999 for (ch = 0; ch <
NUM_G; ch++) {
2034 if (!SLIST_EMPTY(&sc->
mem.blocks))
2035 device_printf(sc->
dev,
"warning: memblock list not empty\n");
2049 switch (pci_get_devid(
dev)) {
2051 s =
"Creative EMU10K1";
2055 if (pci_get_revid(
dev) == 0x04)
2056 s =
"Creative Audigy 2 (EMU10K2)";
2058 s =
"Creative Audigy (EMU10K2)";
2062 s =
"Creative Audigy 2 (EMU10K3)";
2069 device_set_desc(
dev, s);
2070 return BUS_PROBE_LOW_PRIORITY;
2081 sc = malloc(
sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
2084 sc->
type = pci_get_devid(
dev);
2085 sc->
rev = pci_get_revid(
dev);
2091 pci_enable_busmaster(
dev);
2094 sc->
reg = bus_alloc_resource_any(
dev, SYS_RES_IOPORT, &i, RF_ACTIVE);
2095 if (sc->
reg == NULL) {
2096 device_printf(
dev,
"unable to map register space\n");
2099 sc->
st = rman_get_bustag(sc->
reg);
2100 sc->
sh = rman_get_bushandle(sc->
reg);
2104 if (bus_dma_tag_create(bus_get_dma_tag(
dev), 2,
2109 sc->
bufsz, 1, 0x3ffff,
2112 device_printf(
dev,
"unable to create dma tag\n");
2117 device_printf(
dev,
"unable to initialize the card\n");
2122 if (
codec == NULL)
goto bad;
2129 sc->
irq = bus_alloc_resource_any(
dev, SYS_RES_IRQ, &i,
2130 RF_ACTIVE | RF_SHAREABLE);
2133 device_printf(
dev,
"unable to map interrupt\n");
2138 rman_get_start(sc->
reg), rman_get_start(sc->
irq),
2142 for (i = 0; i < sc->
nchans; i++)
2144 for (i = 0; i < (gotmic ? 3 : 2); i++)
2154 if (sc->
ih) bus_teardown_intr(
dev, sc->
irq, sc->
ih);
2155 if (sc->
irq) bus_release_resource(
dev, SYS_RES_IRQ, 0, sc->
irq);
2177 bus_teardown_intr(
dev, sc->
irq, sc->
ih);
2178 bus_release_resource(
dev, SYS_RES_IRQ, 0, sc->
irq);
2213 switch (pci_get_devid(
dev)) {
2215 s =
"Creative EMU10K1 Joystick";
2219 s =
"Creative EMU10K2 Joystick";
2224 if (s) device_set_desc(
dev, s);
2225 return s ? -1000 : ENXIO;
u_int16_t ac97_getcaps(struct ac97_info *codec)
kobj_class_t ac97_getmixerclass(void)
void ac97_destroy(struct ac97_info *codec)
#define AC97_CREATE(dev, devinfo, cls)
#define AC97_CAP_MICCHANNEL
int sndbuf_setup(struct snd_dbuf *b, void *buf, unsigned int size)
int sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, int dmaflags, unsigned int size)
void * sndbuf_getbuf(struct snd_dbuf *b)
bus_addr_t sndbuf_getbufaddr(struct snd_dbuf *buf)
unsigned int sndbuf_getalign(struct snd_dbuf *b)
void chn_intr(struct pcm_channel *c)
SLIST_HEAD(pcm_synclist, pcmchan_syncgroup) snd_pcm_syncgroups
#define PCMTRIG_COMMON(x)
struct pcmchan_matrix * m
static int emujoy_pci_attach(device_t dev)
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 int audigy_recval(int speed)
static struct pcmchan_caps * emupchan_getcaps(kobj_t obj, void *data)
static void emu_wr(struct sc_info *, int, u_int32_t, int)
static u_int32_t emu_rfmt_ac97[]
static int emu_recval(int speed)
static int emu_uninit(struct sc_info *sc)
static int emu_memfree(struct sc_info *sc, void *buf)
static void emu_intr2(void *p)
static struct pcmchan_caps emu_playcaps
static int emu_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data)
static int emurchan_setformat(kobj_t obj, void *data, u_int32_t format)
static void emu_mwrite(struct mpu401 *arg, void *sc, int reg, unsigned char b)
static void emu_wrptr(struct sc_info *sc, int chn, int reg, u_int32_t data)
#define A_EXTOUT_AFRONT_L
#define A_EXTOUT_HEADPHONE_L
static driver_t emu_driver
static struct pcmchan_caps emu_reccaps[3]
static u_int32_t emu_rfmt_mic[]
#define EXTIN_COAX_SPDIF_L
static u_int32_t emurchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
#define A_EXTOUT_ADC_CAP_L
static kobj_method_t emu_ac97_methods[]
static void emu_wrefx(struct sc_info *sc, unsigned int pc, unsigned int data)
static DEFINE_CLASS(emu_mpu, emu_mpu_methods, 0)
static int emu_pci_detach(device_t dev)
static device_method_t emujoy_methods[]
static int emujoy_pci_probe(device_t dev)
#define A_EXTOUT_ADC_CAP_R
static void * emupchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir)
static int emu_memstart(struct sc_info *sc, void *buf)
static u_int32_t emu_rate_to_linearpitch(u_int32_t rate)
static void emu_vwrite(struct sc_info *sc, struct emu_voice *v)
static u_int32_t emu_rd(struct sc_info *, int, int)
#define EMU_DEFAULT_BUFSZ
static int emu_pci_attach(device_t dev)
static void emu_enastop(struct sc_info *sc, char channel, int enable)
SND_DECLARE_FILE("$FreeBSD$")
static void emu_free(struct sc_info *sc, void *buf, bus_dmamap_t map)
static int emupchan_free(kobj_t obj, void *data)
#define FXBUS_MIDI_CHORUS
static int emu_muninit(struct mpu401 *arg, void *cookie)
static void * emu_malloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr, bus_dmamap_t *map)
static void emu_midiattach(struct sc_info *sc)
static kobj_method_t emupchan_methods[]
static u_int32_t emurchan_getptr(kobj_t obj, void *data)
static u_int32_t emupchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int emu_init(struct sc_info *)
#define EXTOUT_AC97_CENTER
static struct pcmchan_caps * emurchan_getcaps(kobj_t obj, void *data)
static int emujoy_pci_detach(device_t dev)
#define A_EXTOUT_AFRONT_R
static int audigy_adcspeed[9]
static void emu_intr(void *)
static void emu_setmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
static int emupchan_trigger(kobj_t obj, void *data, int go)
static u_int32_t emu_pfmt[]
static u_int32_t emupchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
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 * emurchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir)
static driver_t emujoy_driver
static int emurchan_trigger(kobj_t obj, void *data, int go)
static kobj_method_t emurchan_methods[]
#define A_EXTOUT_HEADPHONE_R
static void emu_vsetup(struct sc_pchinfo *ch)
static kobj_method_t emu_mpu_methods[]
static int emu_settimer(struct sc_info *sc)
#define EXTOUT_HEADPHONE_L
DRIVER_MODULE(snd_emu10k1, pci, emu_driver, pcm_devclass, NULL, NULL)
#define EXTIN_COAX_SPDIF_R
static void emu_vtrigger(struct sc_info *sc, struct emu_voice *v, int go)
static int emu_pci_probe(device_t dev)
static u_int32_t emu_rate_to_pitch(u_int32_t rate)
static int emu_rdcd(kobj_t obj, void *devinfo, int regno)
static unsigned char emu_mread(struct mpu401 *arg, void *sc, int reg)
#define EMU_A_IOCFG_GPOUT_AD
CHANNEL_DECLARE(emupchan)
static void audigy_addefxop(struct sc_info *sc, int op, int z, int w, int x, int y, u_int32_t *pc)
static devclass_t emujoy_devclass
static void * emu_memalloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr)
static void emu_addefxop(struct sc_info *sc, int op, int z, int w, int x, int y, u_int32_t *pc)
#define FXBUS_MIDI_REVERB
static int emu_enatimer(struct sc_info *sc, int go)
static u_int32_t emupchan_getptr(kobj_t obj, void *data)
static void emu_initefx(struct sc_info *sc)
#define EMU_A_IOCFG_GPOUT_A
static void audigy_initefx(struct sc_info *sc)
MODULE_DEPEND(snd_emu10k1, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER)
MODULE_VERSION(snd_emu10k1, 1)
static int emu_vpos(struct sc_info *sc, struct emu_voice *v)
static device_method_t emu_methods[]
#define EXTOUT_HEADPHONE_R
static u_int32_t emu_rfmt_efx[]
static int emupchan_setformat(kobj_t obj, void *data, u_int32_t format)
static u_int32_t emurchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
#define EMU_IPR_INTERVALTIMER
#define EMU_CHAN_CCR_READADDRESS
#define EMU_MICROCODEBASE
#define EMU_A_ADCCR_RCHANENABLE
#define EMU_HCFG_JOYENABLE
#define EMU_INTE_PCIERRENABLE
#define EMU_A_FXGPREGBASE
#define EMU_SPCS_EMPHASIS_NONE
#define EMU_SPCS_CLKACCY_1000PPM
#define EMU_CHAN_CPF_PITCH
#define EMU_PTR_CHNO_MASK
#define EMU_CHAN_PEFE_FILTERAMOUNT
#define EMU_IPR_MIDIRECVBUFE
#define EMU_SPCS_SOURCENUM_UNSPEC
#define EMU_HCFG_LOCKTANKCACHE_MASK
#define EMU_IPR_ADCBUFFULL
#define EMU_CHAN_PEFE_PITCHAMOUNT
#define EMU_ADCCR_LCHANENABLE
#define EMU_RECBS_BUFSIZE_4096
#define EMU_ADCCR_RCHANENABLE
#define EMU_CHAN_PTRX_PITCHTARGET
#define EMU_HCFG_AC3ENABLE_CDSPDIF
#define EMU_INTE_EFXBUFENABLE
#define EMU_CHAN_VTFT_FILTERTARGET_MASK
#define EMU_PTR_ADDR_MASK
#define EMU_RECBS_BUFSIZE_8192
#define EMU_IPR_ADCBUFHALFFULL
#define EMU_INTE_MIDIRXENABLE
#define EMU_HCFG_AC3ENABLE_GPSPDIF
#define EMU_INTE_MICBUFENABLE
#define EMU_HCFG_GPINPUT0
#define EMU_IPR_MICBUFFULL
#define EMU_RECBS_BUFSIZE_16384
#define EMU_SPCS_GENERATIONSTATUS
#define EMU_CHAN_CCCA_CURRADDR
#define EMU_AC97SLOT_CENTER
#define EMU_IPR_EFXBUFHALFFULL
#define EMU_HCFG_MUTEBUTTONENABLE
#define EMU_CHAN_MAP_PTI_MASK
#define EMU_INTE_ADCBUFENABLE
#define EMU_RECBS_BUFSIZE_65536
#define EMU_A_PTR_ADDR_MASK
#define EMU_RECBS_BUFSIZE_32768
#define EMU_HCFG_LOCKSOUNDCACHE
#define EMU_CHAN_CCR_CACHEINVALIDSIZE
#define EMU_INTE_INTERTIMERENB
#define EMU_INTE_SAMPLERATER
#define EMU_CHAN_DCYSUSM_DECAYTIME_MASK
#define EMU_IPR_RATETRCHANGE
#define EMU_HCFG_AUTOMUTE
#define EMU_CHAN_ATKHLDV_ATTACKTIME_MASK
#define EMU_A_CHAN_SENDAMOUNTS
#define EMU_CHAN_CPF_STEREO_MASK
#define EMU_HCFG_GPINPUT1
#define EMU_IPR_MICBUFHALFFULL
#define EMU_SPCS_COPYRIGHT
#define EMU_SPCS_SAMPLERATE_48
#define EMU_A_SPDIF_SAMPLERATE
#define EMU_A_DBG_SINGLE_STEP
#define EMU_SPCS_CHANNELNUM_LEFT
#define EMU_RECBS_BUFSIZE_NONE
#define EMU_IPR_MIDITRANSBUFE
#define EMU_CHAN_CVCF_CURRFILTER_MASK
#define EMU_HCFG_AUDIOENABLE
#define EMU_A_ADCCR_LCHANENABLE
#define EMU_A_MICROCODEBASE
#define EMU_CHAN_ATKHLDV_HOLDTIME_MASK
#define EMU_CHAN_CCCA_8BITSELECT
#define EMU_IPR_EFXBUFFULL
int mixer_init(device_t dev, kobj_class_t cls, void *devinfo)
int mpu401_uninit(struct mpu401 *m)
struct mpu401 * mpu401_init(kobj_class_t cls, void *cookie, driver_intr_t softintr, mpu401_intr_t **cb)
int mpu401_intr_t(struct mpu401 *_obj)
#define RANGE(var, low, high)
void * snd_mtxcreate(const char *desc, const char *type)
void * pcm_getdevinfo(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)
int snd_setup_intr(device_t dev, struct resource *res, int flags, driver_intr_t hand, void *param, void **cookiep)
unsigned int pcm_getbuffersize(device_t dev, unsigned int minbufsz, unsigned int deflt, unsigned int maxbufsz)
#define SND_FORMAT(f, c, e)
u_int8_t bmap[EMUMAXPAGES/8]
bus_addr_t silent_page_addr
bus_addr_t ptb_pages_addr
struct pcm_channel * channel
struct pcm_channel * channel
bus_dma_tag_t parent_dmat
struct emu_voice voice[64]
struct emu_voice * master
struct pcm_channel * channel
struct pcm_channel * channel