1 /* $NetBSD: emuxki.c,v 1.58 2009/06/09 11:01:18 tsutsui Exp $ */
4 * Copyright (c) 2001 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
33 * Driver for Creative Labs SBLive! series and probably PCI512.
36 * - inversed stereo at ac97 codec level
37 * (XXX jdolecek - don't see the problem? maybe because auvia(4) has
39 * - bass disappear when you plug rear jack-in on Cambridge FPS2000 speakers
40 * (and presumably all speakers that support front and rear jack-in)
44 * - (midi/mpu),joystick support
45 * - Multiple voices play (problem with /dev/audio architecture)
46 * - Multiple sources recording (Pb with audio(4))
47 * - Independent modification of each channel's parameters (via mixer ?)
48 * - DSP FX patches (to make fx like chipmunk)
51 #include <sys/cdefs.h>
52 __KERNEL_RCSID(0, "$NetBSD: emuxki.c,v 1.58 2009/06/09 11:01:18 tsutsui Exp $");
54 #include <sys/param.h>
55 #include <sys/device.h>
56 #include <sys/errno.h>
57 #include <sys/malloc.h>
58 #include <sys/systm.h>
59 #include <sys/audioio.h>
60 #include <sys/select.h>
61 #include <dev/pci/pcireg.h>
62 #include <dev/pci/pcivar.h>
63 #include <dev/pci/pcidevs.h>
64 #include <dev/audio_if.h>
65 #include <dev/audiovar.h>
66 #include <dev/auconv.h>
67 #include <dev/mulaw.h>
68 #include <dev/ic/ac97reg.h>
69 #include <dev/ic/ac97var.h>
71 #include <dev/pci/emuxkireg.h>
72 #include <dev/pci/emuxkivar.h>
75 static int emuxki_match(device_t
, cfdata_t
, void *);
76 static void emuxki_attach(device_t
, device_t
, void *);
77 static int emuxki_detach(device_t
, int);
80 static struct dmamem
*dmamem_alloc(bus_dma_tag_t
, size_t, bus_size_t
,
81 int, struct malloc_type
*, int);
82 static void dmamem_free(struct dmamem
*, struct malloc_type
*);
84 /* Emu10k1 init & shutdown */
85 static int emuxki_init(struct emuxki_softc
*);
86 static void emuxki_shutdown(struct emuxki_softc
*);
88 /* Emu10k1 mem mgmt */
89 static void *emuxki_pmem_alloc(struct emuxki_softc
*, size_t,
90 struct malloc_type
*,int);
91 static void *emuxki_rmem_alloc(struct emuxki_softc
*, size_t,
92 struct malloc_type
*,int);
95 * Emu10k1 channels funcs : There is no direct access to channels, everything
96 * is done through voices I will at least provide channel based fx params
97 * modification, later...
100 /* Emu10k1 voice mgmt */
101 static struct emuxki_voice
*emuxki_voice_new(struct emuxki_softc
*,
103 static void emuxki_voice_delete(struct emuxki_voice
*);
104 static int emuxki_voice_set_audioparms(struct emuxki_voice
*, uint8_t,
106 /* emuxki_voice_set_fxparms will come later, it'll need channel distinction */
107 static int emuxki_voice_set_bufparms(struct emuxki_voice
*,
108 void *, uint32_t, uint16_t);
109 static void emuxki_voice_commit_parms(struct emuxki_voice
*);
110 static int emuxki_voice_adc_rate(struct emuxki_voice
*);
111 static uint32_t emuxki_voice_curaddr(struct emuxki_voice
*);
112 static void emuxki_voice_start(struct emuxki_voice
*,
113 void (*) (void *), void *);
114 static void emuxki_voice_halt(struct emuxki_voice
*);
117 * Emu10k1 stream mgmt : not done yet
120 static struct emuxki_stream
*emuxki_stream_new(struct emu10k1
*);
121 static void emuxki_stream_delete(struct emuxki_stream
*);
122 static int emuxki_stream_set_audio_params(struct emuxki_stream
*,
123 uint8_t, uint8_t, uint8_t, uint16_t);
124 static void emuxki_stream_start(struct emuxki_stream
*);
125 static void emuxki_stream_halt(struct emuxki_stream
*);
128 /* audio interface callbacks */
130 static int emuxki_open(void *, int);
131 static void emuxki_close(void *);
133 static int emuxki_query_encoding(void *, struct audio_encoding
*);
134 static int emuxki_set_params(void *, int, int, audio_params_t
*,
135 audio_params_t
*, stream_filter_list_t
*,
136 stream_filter_list_t
*);
138 static int emuxki_round_blocksize(void *, int, int, const audio_params_t
*);
139 static size_t emuxki_round_buffersize(void *, int, size_t);
141 static int emuxki_trigger_output(void *, void *, void *, int,
142 void (*)(void *), void *, const audio_params_t
*);
143 static int emuxki_trigger_input(void *, void *, void *, int,
144 void (*) (void *), void *, const audio_params_t
*);
145 static int emuxki_halt_output(void *);
146 static int emuxki_halt_input(void *);
148 static int emuxki_getdev(void *, struct audio_device
*);
149 static int emuxki_set_port(void *, mixer_ctrl_t
*);
150 static int emuxki_get_port(void *, mixer_ctrl_t
*);
151 static int emuxki_query_devinfo(void *, mixer_devinfo_t
*);
153 static void *emuxki_allocm(void *, int, size_t, struct malloc_type
*, int);
154 static void emuxki_freem(void *, void *, struct malloc_type
*);
156 static paddr_t
emuxki_mappage(void *, void *, off_t
, int);
157 static int emuxki_get_props(void *);
159 /* Interrupt handler */
160 static int emuxki_intr(void *);
162 /* Emu10k1 AC97 interface callbacks */
163 static int emuxki_ac97_attach(void *, struct ac97_codec_if
*);
164 static int emuxki_ac97_read(void *, uint8_t, uint16_t *);
165 static int emuxki_ac97_write(void *, uint8_t, uint16_t);
166 static int emuxki_ac97_reset(void *);
167 static enum ac97_host_flags
emuxki_ac97_flags(void *);
172 CFATTACH_DECL_NEW(emuxki
, sizeof(struct emuxki_softc
),
173 emuxki_match
, emuxki_attach
, emuxki_detach
, NULL
);
175 static const struct audio_hw_if emuxki_hw_if
= {
179 emuxki_query_encoding
,
181 emuxki_round_blocksize
,
182 NULL
, /* commit settings */
183 NULL
, /* init_output */
184 NULL
, /* init_input */
185 NULL
, /* start_output */
186 NULL
, /* start_input */
189 NULL
, /* speaker_ctl */
194 emuxki_query_devinfo
,
197 emuxki_round_buffersize
,
200 emuxki_trigger_output
,
201 emuxki_trigger_input
,
202 NULL
, /* dev_ioctl */
203 NULL
, /* powerstate */
207 static const int emuxki_recsrc_intrmasks
[EMU_NUMRECSRCS
] =
208 { EMU_INTE_MICBUFENABLE
, EMU_INTE_ADCBUFENABLE
, EMU_INTE_EFXBUFENABLE
};
210 static const uint32_t emuxki_recsrc_bufaddrreg
[EMU_NUMRECSRCS
] =
211 { EMU_MICBA
, EMU_ADCBA
, EMU_FXBA
};
212 static const uint32_t emuxki_recsrc_szreg
[EMU_NUMRECSRCS
] =
213 { EMU_MICBS
, EMU_ADCBS
, EMU_FXBS
};
214 static const int emuxki_recbuf_sz
[] = {
215 0, 384, 448, 512, 640, 768, 896, 1024, 1280, 1536, 1792,
216 2048, 2560, 3072, 3584, 4096, 5120, 6144, 7168, 8192, 10240,
217 12288, 14366, 16384, 20480, 24576, 28672, 32768, 40960, 49152,
221 #define EMUXKI_NFORMATS 4
222 static const struct audio_format emuxki_formats
[EMUXKI_NFORMATS
] = {
223 {NULL
, AUMODE_PLAY
| AUMODE_RECORD
, AUDIO_ENCODING_SLINEAR_LE
, 16, 16,
224 2, AUFMT_STEREO
, 0, {4000, 48000}},
225 {NULL
, AUMODE_PLAY
| AUMODE_RECORD
, AUDIO_ENCODING_SLINEAR_LE
, 16, 16,
226 1, AUFMT_MONAURAL
, 0, {4000, 48000}},
227 {NULL
, AUMODE_PLAY
, AUDIO_ENCODING_ULINEAR_LE
, 8, 8,
228 2, AUFMT_STEREO
, 0, {4000, 48000}},
229 {NULL
, AUMODE_PLAY
, AUDIO_ENCODING_ULINEAR_LE
, 8, 8,
230 1, AUFMT_MONAURAL
, 0, {4000, 48000}},
238 dmamem_delete(struct dmamem
*mem
, struct malloc_type
*type
)
241 free(mem
->segs
, type
);
245 static struct dmamem
*
246 dmamem_alloc(bus_dma_tag_t dmat
, size_t size
, bus_size_t align
,
247 int nsegs
, struct malloc_type
*type
, int flags
)
252 /* Allocate memory for structure */
253 if ((mem
= malloc(sizeof(*mem
), type
, flags
)) == NULL
)
261 mem
->segs
= malloc(mem
->nsegs
* sizeof(*(mem
->segs
)), type
, flags
);
262 if (mem
->segs
== NULL
) {
267 bus_dma_flags
= (flags
& M_NOWAIT
) ? BUS_DMA_NOWAIT
: BUS_DMA_WAITOK
;
268 if (bus_dmamem_alloc(dmat
, mem
->size
, mem
->align
, mem
->bound
,
269 mem
->segs
, mem
->nsegs
, &(mem
->rsegs
),
271 dmamem_delete(mem
, type
);
275 if (bus_dmamem_map(dmat
, mem
->segs
, mem
->nsegs
, mem
->size
,
276 &(mem
->kaddr
), bus_dma_flags
| BUS_DMA_COHERENT
)) {
277 bus_dmamem_free(dmat
, mem
->segs
, mem
->nsegs
);
278 dmamem_delete(mem
, type
);
282 if (bus_dmamap_create(dmat
, mem
->size
, mem
->nsegs
, mem
->size
,
283 mem
->bound
, bus_dma_flags
, &(mem
->map
))) {
284 bus_dmamem_unmap(dmat
, mem
->kaddr
, mem
->size
);
285 bus_dmamem_free(dmat
, mem
->segs
, mem
->nsegs
);
286 dmamem_delete(mem
, type
);
290 if (bus_dmamap_load(dmat
, mem
->map
, mem
->kaddr
,
291 mem
->size
, NULL
, bus_dma_flags
)) {
292 bus_dmamap_destroy(dmat
, mem
->map
);
293 bus_dmamem_unmap(dmat
, mem
->kaddr
, mem
->size
);
294 bus_dmamem_free(dmat
, mem
->segs
, mem
->nsegs
);
295 dmamem_delete(mem
, type
);
303 dmamem_free(struct dmamem
*mem
, struct malloc_type
*type
)
306 bus_dmamap_unload(mem
->dmat
, mem
->map
);
307 bus_dmamap_destroy(mem
->dmat
, mem
->map
);
308 bus_dmamem_unmap(mem
->dmat
, mem
->kaddr
, mem
->size
);
309 bus_dmamem_free(mem
->dmat
, mem
->segs
, mem
->nsegs
);
310 dmamem_delete(mem
, type
);
315 * Autoconf device callbacks : attach and detach
319 emuxki_pci_shutdown(struct emuxki_softc
*sc
)
322 if (sc
->sc_ih
!= NULL
)
323 pci_intr_disestablish(sc
->sc_pc
, sc
->sc_ih
);
325 bus_space_unmap(sc
->sc_iot
, sc
->sc_ioh
, sc
->sc_ios
);
329 emuxki_scinit(struct emuxki_softc
*sc
)
333 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_HCFG
,
334 EMU_HCFG_LOCKSOUNDCACHE
| EMU_HCFG_LOCKTANKCACHE_MASK
|
335 EMU_HCFG_MUTEBUTTONENABLE
);
336 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_INTE
,
337 EMU_INTE_SAMPLERATER
| EMU_INTE_PCIERRENABLE
);
339 if ((err
= emuxki_init(sc
)))
342 if (sc
->sc_type
& EMUXKI_AUDIGY2
) {
343 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_HCFG
,
344 EMU_HCFG_AUDIOENABLE
| EMU_HCFG_AC3ENABLE_CDSPDIF
|
345 EMU_HCFG_AC3ENABLE_GPSPDIF
| EMU_HCFG_AUTOMUTE
);
346 } else if (sc
->sc_type
& EMUXKI_AUDIGY
) {
347 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_HCFG
,
348 EMU_HCFG_AUDIOENABLE
| EMU_HCFG_AUTOMUTE
);
350 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_HCFG
,
351 EMU_HCFG_AUDIOENABLE
| EMU_HCFG_JOYENABLE
|
352 EMU_HCFG_LOCKTANKCACHE_MASK
| EMU_HCFG_AUTOMUTE
);
354 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_INTE
,
355 bus_space_read_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_INTE
) |
356 EMU_INTE_VOLINCRENABLE
| EMU_INTE_VOLDECRENABLE
|
357 EMU_INTE_MUTEENABLE
);
358 if (sc
->sc_type
& EMUXKI_AUDIGY2
) {
359 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_A_IOCFG
,
361 bus_space_read_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_A_IOCFG
));
364 /* No multiple voice support for now */
365 sc
->pvoice
= sc
->rvoice
= NULL
;
371 emuxki_ac97_init(struct emuxki_softc
*sc
)
374 sc
->hostif
.attach
= emuxki_ac97_attach
;
375 sc
->hostif
.read
= emuxki_ac97_read
;
376 sc
->hostif
.write
= emuxki_ac97_write
;
377 sc
->hostif
.reset
= emuxki_ac97_reset
;
378 sc
->hostif
.flags
= emuxki_ac97_flags
;
379 return ac97_attach(&sc
->hostif
, sc
->sc_dev
);
383 emuxki_match(device_t parent
, cfdata_t match
, void *aux
)
385 struct pci_attach_args
*pa
;
388 if (PCI_VENDOR(pa
->pa_id
) != PCI_VENDOR_CREATIVELABS
)
391 switch (PCI_PRODUCT(pa
->pa_id
)) {
392 case PCI_PRODUCT_CREATIVELABS_SBLIVE
:
393 case PCI_PRODUCT_CREATIVELABS_SBLIVE2
:
394 case PCI_PRODUCT_CREATIVELABS_AUDIGY
:
402 emuxki_attach(device_t parent
, device_t self
, void *aux
)
404 struct emuxki_softc
*sc
;
405 struct pci_attach_args
*pa
;
407 pci_intr_handle_t ih
;
410 sc
= device_private(self
);
413 aprint_naive(": Audio controller\n");
415 if (pci_mapreg_map(pa
, EMU_PCI_CBIO
, PCI_MAPREG_TYPE_IO
, 0,
416 &(sc
->sc_iot
), &(sc
->sc_ioh
), &(sc
->sc_iob
),
418 aprint_error(": can't map iospace\n");
421 pci_devinfo(pa
->pa_id
, pa
->pa_class
, 1, devinfo
, sizeof(devinfo
));
422 aprint_normal(": %s\n", devinfo
);
424 sc
->sc_pc
= pa
->pa_pc
;
425 sc
->sc_dmat
= pa
->pa_dmat
;
426 pci_conf_write(pa
->pa_pc
, pa
->pa_tag
, PCI_COMMAND_STATUS_REG
,
427 pci_conf_read(pa
->pa_pc
, pa
->pa_tag
,
428 (PCI_COMMAND_STATUS_REG
) | PCI_COMMAND_MASTER_ENABLE
));
430 if (pci_intr_map(pa
, &ih
)) {
431 aprint_error_dev(self
, "couldn't map interrupt\n");
432 bus_space_unmap(sc
->sc_iot
, sc
->sc_ioh
, sc
->sc_ios
);
436 intrstr
= pci_intr_string(pa
->pa_pc
, ih
);
437 sc
->sc_ih
= pci_intr_establish(pa
->pa_pc
, ih
, IPL_AUDIO
, emuxki_intr
,
439 if (sc
->sc_ih
== NULL
) {
440 aprint_error_dev(self
, "couldn't establish interrupt");
442 aprint_error(" at %s", intrstr
);
444 bus_space_unmap(sc
->sc_iot
, sc
->sc_ioh
, sc
->sc_ios
);
447 aprint_normal_dev(self
, "interrupting at %s\n", intrstr
);
449 /* XXX it's unknown whether APS is made from Audigy as well */
450 if (PCI_PRODUCT(pa
->pa_id
) == PCI_PRODUCT_CREATIVELABS_AUDIGY
) {
451 sc
->sc_type
= EMUXKI_AUDIGY
;
452 if (PCI_REVISION(pa
->pa_class
) == 0x04) {
453 sc
->sc_type
|= EMUXKI_AUDIGY2
;
454 strlcpy(sc
->sc_audv
.name
, "Audigy2", sizeof sc
->sc_audv
.name
);
456 strlcpy(sc
->sc_audv
.name
, "Audigy", sizeof sc
->sc_audv
.name
);
458 } else if (pci_conf_read(pa
->pa_pc
, pa
->pa_tag
,
459 PCI_SUBSYS_ID_REG
) == EMU_SUBSYS_APS
) {
460 sc
->sc_type
= EMUXKI_APS
;
461 strlcpy(sc
->sc_audv
.name
, "E-mu APS", sizeof sc
->sc_audv
.name
);
463 sc
->sc_type
= EMUXKI_SBLIVE
;
464 strlcpy(sc
->sc_audv
.name
, "SB Live!", sizeof sc
->sc_audv
.name
);
466 snprintf(sc
->sc_audv
.version
, sizeof sc
->sc_audv
.version
, "0x%02x",
467 PCI_REVISION(pa
->pa_class
));
468 strlcpy(sc
->sc_audv
.config
, "emuxki", sizeof sc
->sc_audv
.config
);
470 if (emuxki_scinit(sc
) || emuxki_ac97_init(sc
) ||
471 (sc
->sc_audev
= audio_attach_mi(&emuxki_hw_if
, sc
, self
)) == NULL
) {
472 emuxki_pci_shutdown(sc
);
477 sc
->codecif
->vtbl
->get_portnum_by_name(sc
->codec_if
, AudioCrecord
,
479 sc
->rsourcectl
.cp
= AUDIO_MIXER_ENUM
;
484 emuxki_detach(device_t self
, int flags
)
486 struct emuxki_softc
*sc
;
488 sc
= device_private(self
);
489 if (sc
->sc_audev
!= NULL
) /* Test in case audio didn't attach */
490 config_detach(sc
->sc_audev
, 0);
492 /* All voices should be stopped now but add some code here if not */
494 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_HCFG
,
495 EMU_HCFG_LOCKSOUNDCACHE
| EMU_HCFG_LOCKTANKCACHE_MASK
|
496 EMU_HCFG_MUTEBUTTONENABLE
);
497 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_INTE
, 0);
501 emuxki_pci_shutdown(sc
);
507 /* Misc stuff relative to emu10k1 */
510 emuxki_rate_to_pitch(uint32_t rate
)
512 static const uint32_t logMagTable
[128] = {
513 0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3,
514 0x13aa2, 0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a,
515 0x2655d, 0x28ed5, 0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb,
516 0x381b6, 0x3a93d, 0x3d081, 0x3f782, 0x41e42, 0x444c1, 0x46b01,
517 0x49101, 0x4b6c4, 0x4dc49, 0x50191, 0x5269e, 0x54b6f, 0x57006,
518 0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7, 0x646ee, 0x66a00,
519 0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829, 0x759d4,
520 0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e,
521 0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20,
522 0x93d26, 0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec,
523 0xa11d8, 0xa2f9d, 0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241,
524 0xadf26, 0xafbe7, 0xb1885, 0xb3500, 0xb5157, 0xb6d8c, 0xb899f,
525 0xba58f, 0xbc15e, 0xbdd0c, 0xbf899, 0xc1404, 0xc2f50, 0xc4a7b,
526 0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c, 0xceaec, 0xd053f,
527 0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3, 0xdba4a,
528 0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3,
529 0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a,
530 0xf2c83, 0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57,
533 static const uint8_t logSlopeTable
[128] = {
534 0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58,
535 0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53,
536 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f,
537 0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b,
538 0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47,
539 0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44,
540 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41,
541 0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e,
542 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c,
543 0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39,
544 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37,
545 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35,
546 0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34,
547 0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32,
548 0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30,
549 0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f
554 return 0; /* Bail out if no leading "1" */
555 rate
*= 11185; /* Scale 48000 to 0x20002380 */
556 for (i
= 31; i
> 0; i
--) {
557 if (rate
& 0x80000000) { /* Detect leading "1" */
558 return (((uint32_t) (i
- 15) << 20) +
559 logMagTable
[0x7f & (rate
>> 24)] +
560 (0x7f & (rate
>> 17)) *
561 logSlopeTable
[0x7f & (rate
>> 24)]);
566 return 0; /* Should never reach this point */
569 /* Emu10k1 Low level */
572 emuxki_read(struct emuxki_softc
*sc
, uint16_t chano
, uint32_t reg
)
575 uint8_t size
, offset
;
580 ptr
= ((((u_int32_t
) reg
) << 16) &
581 (sc
->sc_type
& EMUXKI_AUDIGY
?
582 EMU_A_PTR_ADDR_MASK
: EMU_PTR_ADDR_MASK
)) |
583 (chano
& EMU_PTR_CHNO_MASK
);
584 if (reg
& 0xff000000) {
585 size
= (reg
>> 24) & 0x3f;
586 offset
= (reg
>> 16) & 0x1f;
587 mask
= ((1 << size
) - 1) << offset
;
591 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_PTR
, ptr
);
592 ptr
= (bus_space_read_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_DATA
) & mask
)
600 emuxki_write(struct emuxki_softc
*sc
, uint16_t chano
,
601 uint32_t reg
, uint32_t data
)
604 uint8_t size
, offset
;
607 ptr
= ((((u_int32_t
) reg
) << 16) &
608 (sc
->sc_type
& EMUXKI_AUDIGY
?
609 EMU_A_PTR_ADDR_MASK
: EMU_PTR_ADDR_MASK
)) |
610 (chano
& EMU_PTR_CHNO_MASK
);
611 if (reg
& 0xff000000) {
612 size
= (reg
>> 24) & 0x3f;
613 offset
= (reg
>> 16) & 0x1f;
614 mask
= ((1 << size
) - 1) << offset
;
615 data
= ((data
<< offset
) & mask
) |
616 (emuxki_read(sc
, chano
, reg
& 0xffff) & ~mask
);
620 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_PTR
, ptr
);
621 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_DATA
, data
);
625 /* Microcode should this go in /sys/dev/microcode ? */
628 emuxki_write_micro(struct emuxki_softc
*sc
, uint32_t pc
, uint32_t data
)
632 (sc
->sc_type
& EMUXKI_AUDIGY
?
633 EMU_A_MICROCODEBASE
: EMU_MICROCODEBASE
) + pc
,
638 emuxki_dsp_addop(struct emuxki_softc
*sc
, uint16_t *pc
, uint8_t op
,
639 uint16_t r
, uint16_t a
, uint16_t x
, uint16_t y
)
642 if (sc
->sc_type
& EMUXKI_AUDIGY
) {
643 emuxki_write_micro(sc
, *pc
<< 1,
644 ((x
<< 12) & EMU_A_DSP_LOWORD_OPX_MASK
) |
645 (y
& EMU_A_DSP_LOWORD_OPY_MASK
));
646 emuxki_write_micro(sc
, (*pc
<< 1) + 1,
647 ((op
<< 24) & EMU_A_DSP_HIWORD_OPCODE_MASK
) |
648 ((r
<< 12) & EMU_A_DSP_HIWORD_RESULT_MASK
) |
649 (a
& EMU_A_DSP_HIWORD_OPA_MASK
));
651 emuxki_write_micro(sc
, *pc
<< 1,
652 ((x
<< 10) & EMU_DSP_LOWORD_OPX_MASK
) |
653 (y
& EMU_DSP_LOWORD_OPY_MASK
));
654 emuxki_write_micro(sc
, (*pc
<< 1) + 1,
655 ((op
<< 20) & EMU_DSP_HIWORD_OPCODE_MASK
) |
656 ((r
<< 10) & EMU_DSP_HIWORD_RESULT_MASK
) |
657 (a
& EMU_DSP_HIWORD_OPA_MASK
));
662 /* init and shutdown */
665 emuxki_initfx(struct emuxki_softc
*sc
)
669 /* Set all GPRs to 0 */
670 for (pc
= 0; pc
< 256; pc
++)
671 emuxki_write(sc
, 0, EMU_DSP_GPR(pc
), 0);
672 for (pc
= 0; pc
< 160; pc
++) {
673 emuxki_write(sc
, 0, EMU_TANKMEMDATAREGBASE
+ pc
, 0);
674 emuxki_write(sc
, 0, EMU_TANKMEMADDRREGBASE
+ pc
, 0);
678 if (sc
->sc_type
& EMUXKI_AUDIGY
) {
679 /* AC97 Out (l/r) = AC97 In (l/r) + FX[0/1] * 4 */
680 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_MACINTS
,
681 EMU_A_DSP_OUTL(EMU_A_DSP_OUT_A_FRONT
),
683 EMU_DSP_FX(0), EMU_A_DSP_CST(4));
684 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_MACINTS
,
685 EMU_A_DSP_OUTR(EMU_A_DSP_OUT_A_FRONT
),
687 EMU_DSP_FX(1), EMU_A_DSP_CST(4));
689 /* Rear channel OUT (l/r) = FX[2/3] * 4 */
691 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_MACINTS
,
692 EMU_A_DSP_OUTL(EMU_A_DSP_OUT_A_REAR
),
693 EMU_A_DSP_OUTL(EMU_A_DSP_OUT_A_FRONT
),
694 EMU_DSP_FX(0), EMU_A_DSP_CST(4));
695 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_MACINTS
,
696 EMU_A_DSP_OUTR(EMU_A_DSP_OUT_A_REAR
),
697 EMU_A_DSP_OUTR(EMU_A_DSP_OUT_A_FRONT
),
698 EMU_DSP_FX(1), EMU_A_DSP_CST(4));
700 /* ADC recording (l/r) = AC97 In (l/r) */
701 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_ACC3
,
702 EMU_A_DSP_OUTL(EMU_A_DSP_OUT_ADC
),
703 EMU_A_DSP_INL(EMU_DSP_IN_AC97
),
704 EMU_A_DSP_CST(0), EMU_A_DSP_CST(0));
705 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_ACC3
,
706 EMU_A_DSP_OUTR(EMU_A_DSP_OUT_ADC
),
707 EMU_A_DSP_INR(EMU_DSP_IN_AC97
),
708 EMU_A_DSP_CST(0), EMU_A_DSP_CST(0));
710 /* zero out the rest of the microcode */
712 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_ACC3
,
713 EMU_A_DSP_CST(0), EMU_A_DSP_CST(0),
714 EMU_A_DSP_CST(0), EMU_A_DSP_CST(0));
716 emuxki_write(sc
, 0, EMU_A_DBG
, 0); /* Is it really necessary ? */
718 /* AC97 Out (l/r) = AC97 In (l/r) + FX[0/1] * 4 */
719 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_MACINTS
,
720 EMU_DSP_OUTL(EMU_DSP_OUT_A_FRONT
),
722 EMU_DSP_FX(0), EMU_DSP_CST(4));
723 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_MACINTS
,
724 EMU_DSP_OUTR(EMU_DSP_OUT_A_FRONT
),
726 EMU_DSP_FX(1), EMU_DSP_CST(4));
728 /* Rear channel OUT (l/r) = FX[2/3] * 4 */
730 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_MACINTS
,
731 EMU_DSP_OUTL(EMU_DSP_OUT_AD_REAR
),
732 EMU_DSP_OUTL(EMU_DSP_OUT_A_FRONT
),
733 EMU_DSP_FX(0), EMU_DSP_CST(4));
734 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_MACINTS
,
735 EMU_DSP_OUTR(EMU_DSP_OUT_AD_REAR
),
736 EMU_DSP_OUTR(EMU_DSP_OUT_A_FRONT
),
737 EMU_DSP_FX(1), EMU_DSP_CST(4));
739 /* ADC recording (l/r) = AC97 In (l/r) */
740 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_ACC3
,
741 EMU_DSP_OUTL(EMU_DSP_OUT_ADC
),
742 EMU_DSP_INL(EMU_DSP_IN_AC97
),
743 EMU_DSP_CST(0), EMU_DSP_CST(0));
744 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_ACC3
,
745 EMU_DSP_OUTR(EMU_DSP_OUT_ADC
),
746 EMU_DSP_INR(EMU_DSP_IN_AC97
),
747 EMU_DSP_CST(0), EMU_DSP_CST(0));
749 /* zero out the rest of the microcode */
751 emuxki_dsp_addop(sc
, &pc
, EMU_DSP_OP_ACC3
,
752 EMU_DSP_CST(0), EMU_DSP_CST(0),
753 EMU_DSP_CST(0), EMU_DSP_CST(0));
755 emuxki_write(sc
, 0, EMU_DBG
, 0); /* Is it really necessary ? */
760 emuxki_init(struct emuxki_softc
*sc
)
764 bus_addr_t silentpage
;
766 /* disable any channel interrupt */
767 emuxki_write(sc
, 0, EMU_CLIEL
, 0);
768 emuxki_write(sc
, 0, EMU_CLIEH
, 0);
769 emuxki_write(sc
, 0, EMU_SOLEL
, 0);
770 emuxki_write(sc
, 0, EMU_SOLEH
, 0);
772 /* Set recording buffers sizes to zero */
773 emuxki_write(sc
, 0, EMU_MICBS
, EMU_RECBS_BUFSIZE_NONE
);
774 emuxki_write(sc
, 0, EMU_MICBA
, 0);
775 emuxki_write(sc
, 0, EMU_FXBS
, EMU_RECBS_BUFSIZE_NONE
);
776 emuxki_write(sc
, 0, EMU_FXBA
, 0);
777 emuxki_write(sc
, 0, EMU_ADCBS
, EMU_RECBS_BUFSIZE_NONE
);
778 emuxki_write(sc
, 0, EMU_ADCBA
, 0);
780 if(sc
->sc_type
& EMUXKI_AUDIGY
) {
781 emuxki_write(sc
, 0, EMU_SPBYPASS
, EMU_SPBYPASS_24_BITS
);
782 emuxki_write(sc
, 0, EMU_AC97SLOT
, EMU_AC97SLOT_CENTER
| EMU_AC97SLOT_LFE
);
785 /* Initialize all channels to stopped and no effects */
786 for (i
= 0; i
< EMU_NUMCHAN
; i
++) {
787 emuxki_write(sc
, i
, EMU_CHAN_DCYSUSV
, 0);
788 emuxki_write(sc
, i
, EMU_CHAN_IP
, 0);
789 emuxki_write(sc
, i
, EMU_CHAN_VTFT
, 0xffff);
790 emuxki_write(sc
, i
, EMU_CHAN_CVCF
, 0xffff);
791 emuxki_write(sc
, i
, EMU_CHAN_PTRX
, 0);
792 emuxki_write(sc
, i
, EMU_CHAN_CPF
, 0);
793 emuxki_write(sc
, i
, EMU_CHAN_CCR
, 0);
794 emuxki_write(sc
, i
, EMU_CHAN_PSST
, 0);
795 emuxki_write(sc
, i
, EMU_CHAN_DSL
, 0x10); /* Why 16 ? */
796 emuxki_write(sc
, i
, EMU_CHAN_CCCA
, 0);
797 emuxki_write(sc
, i
, EMU_CHAN_Z1
, 0);
798 emuxki_write(sc
, i
, EMU_CHAN_Z2
, 0);
799 emuxki_write(sc
, i
, EMU_CHAN_FXRT
, 0x32100000);
800 emuxki_write(sc
, i
, EMU_CHAN_ATKHLDM
, 0);
801 emuxki_write(sc
, i
, EMU_CHAN_DCYSUSM
, 0);
802 emuxki_write(sc
, i
, EMU_CHAN_IFATN
, 0xffff);
803 emuxki_write(sc
, i
, EMU_CHAN_PEFE
, 0);
804 emuxki_write(sc
, i
, EMU_CHAN_FMMOD
, 0);
805 emuxki_write(sc
, i
, EMU_CHAN_TREMFRQ
, 24);
806 emuxki_write(sc
, i
, EMU_CHAN_FM2FRQ2
, 24);
807 emuxki_write(sc
, i
, EMU_CHAN_TEMPENV
, 0);
809 /* these are last so OFF prevents writing */
810 emuxki_write(sc
, i
, EMU_CHAN_LFOVAL2
, 0);
811 emuxki_write(sc
, i
, EMU_CHAN_LFOVAL1
, 0);
812 emuxki_write(sc
, i
, EMU_CHAN_ATKHLDV
, 0);
813 emuxki_write(sc
, i
, EMU_CHAN_ENVVOL
, 0);
814 emuxki_write(sc
, i
, EMU_CHAN_ENVVAL
, 0);
817 /* set digital outputs format */
818 spcs
= (EMU_SPCS_CLKACCY_1000PPM
| EMU_SPCS_SAMPLERATE_48
|
819 EMU_SPCS_CHANNELNUM_LEFT
| EMU_SPCS_SOURCENUM_UNSPEC
|
820 EMU_SPCS_GENERATIONSTATUS
| 0x00001200 /* Cat code. */ |
821 0x00000000 /* IEC-958 Mode */ | EMU_SPCS_EMPHASIS_NONE
|
823 emuxki_write(sc
, 0, EMU_SPCS0
, spcs
);
824 emuxki_write(sc
, 0, EMU_SPCS1
, spcs
);
825 emuxki_write(sc
, 0, EMU_SPCS2
, spcs
);
827 if(sc
->sc_type
& EMUXKI_AUDIGY2
) {
828 emuxki_write(sc
, 0, EMU_A2_SPDIF_SAMPLERATE
, EMU_A2_SPDIF_UNKNOWN
);
830 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_A2_PTR
, EMU_A2_SRCSEL
);
831 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_A2_DATA
,
832 EMU_A2_SRCSEL_ENABLE_SPDIF
| EMU_A2_SRCSEL_ENABLE_SRCMULTI
);
834 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_A2_PTR
, EMU_A2_SRCMULTI
);
835 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_A2_DATA
, EMU_A2_SRCMULTI_ENABLE_INPUT
);
839 /* Let's play with sound processor */
842 /* Here is our Page Table */
843 if ((sc
->ptb
= dmamem_alloc(sc
->sc_dmat
,
844 EMU_MAXPTE
* sizeof(u_int32_t
),
845 EMU_DMA_ALIGN
, EMU_DMAMEM_NSEG
,
846 M_DEVBUF
, M_WAITOK
)) == NULL
)
849 /* This is necessary unless you like Metallic noise... */
850 if ((sc
->silentpage
= dmamem_alloc(sc
->sc_dmat
, EMU_PTESIZE
,
851 EMU_DMA_ALIGN
, EMU_DMAMEM_NSEG
, M_DEVBUF
, M_WAITOK
))==NULL
){
852 dmamem_free(sc
->ptb
, M_DEVBUF
);
856 /* Zero out the silent page */
857 /* This might not be always true, it might be 128 for 8bit channels */
858 memset(KERNADDR(sc
->silentpage
), 0, DMASIZE(sc
->silentpage
));
861 * Set all the PTB Entries to the silent page We shift the physical
862 * address by one and OR it with the page number. I don't know what
863 * the ORed index is for, might be a very useful unused feature...
865 silentpage
= DMAADDR(sc
->silentpage
) << 1;
866 ptb
= KERNADDR(sc
->ptb
);
867 for (i
= 0; i
< EMU_MAXPTE
; i
++)
868 ptb
[i
] = htole32(silentpage
| i
);
870 /* Write PTB address and set TCB to none */
871 emuxki_write(sc
, 0, EMU_PTB
, DMAADDR(sc
->ptb
));
872 emuxki_write(sc
, 0, EMU_TCBS
, 0); /* This means 16K TCB */
873 emuxki_write(sc
, 0, EMU_TCB
, 0); /* No TCB use for now */
876 * Set channels MAPs to the silent page.
877 * I don't know what MAPs are for.
879 silentpage
|= EMU_CHAN_MAP_PTI_MASK
;
880 for (i
= 0; i
< EMU_NUMCHAN
; i
++) {
881 emuxki_write(sc
, i
, EMU_CHAN_MAPA
, silentpage
);
882 emuxki_write(sc
, i
, EMU_CHAN_MAPB
, silentpage
);
883 sc
->channel
[i
] = NULL
;
886 /* Init voices list */
887 LIST_INIT(&(sc
->voices
));
889 /* Timer is stopped */
890 sc
->timerstate
&= ~EMU_TIMER_STATE_ENABLED
;
895 emuxki_shutdown(struct emuxki_softc
*sc
)
899 /* Disable any Channels interrupts */
900 emuxki_write(sc
, 0, EMU_CLIEL
, 0);
901 emuxki_write(sc
, 0, EMU_CLIEH
, 0);
902 emuxki_write(sc
, 0, EMU_SOLEL
, 0);
903 emuxki_write(sc
, 0, EMU_SOLEH
, 0);
906 * Should do some voice(stream) stopping stuff here, that's what will
907 * stop and deallocate all channels.
910 /* Stop all channels */
911 /* XXX This shouldn't be necessary, I'll remove once everything works */
912 for (i
= 0; i
< EMU_NUMCHAN
; i
++)
913 emuxki_write(sc
, i
, EMU_CHAN_DCYSUSV
, 0);
914 for (i
= 0; i
< EMU_NUMCHAN
; i
++) {
915 emuxki_write(sc
, i
, EMU_CHAN_VTFT
, 0);
916 emuxki_write(sc
, i
, EMU_CHAN_CVCF
, 0);
917 emuxki_write(sc
, i
, EMU_CHAN_PTRX
, 0);
918 emuxki_write(sc
, i
, EMU_CHAN_CPF
, 0);
922 * Deallocate Emu10k1 caches and recording buffers. Again it will be
923 * removed because it will be done in voice shutdown.
925 emuxki_write(sc
, 0, EMU_MICBS
, EMU_RECBS_BUFSIZE_NONE
);
926 emuxki_write(sc
, 0, EMU_MICBA
, 0);
927 emuxki_write(sc
, 0, EMU_FXBS
, EMU_RECBS_BUFSIZE_NONE
);
928 emuxki_write(sc
, 0, EMU_FXBA
, 0);
929 if(sc
->sc_type
& EMUXKI_AUDIGY
) {
930 emuxki_write(sc
, 0, EMU_A_FXWC1
, 0);
931 emuxki_write(sc
, 0, EMU_A_FXWC2
, 0);
933 emuxki_write(sc
, 0, EMU_FXWC
, 0);
935 emuxki_write(sc
, 0, EMU_ADCBS
, EMU_RECBS_BUFSIZE_NONE
);
936 emuxki_write(sc
, 0, EMU_ADCBA
, 0);
939 * XXX I don't know yet how I will handle tank cache buffer,
940 * I don't even clearly know what it is for.
942 emuxki_write(sc
, 0, EMU_TCB
, 0); /* 16K again */
943 emuxki_write(sc
, 0, EMU_TCBS
, 0);
945 emuxki_write(sc
, 0, EMU_DBG
, 0x8000); /* necessary ? */
947 dmamem_free(sc
->silentpage
, M_DEVBUF
);
948 dmamem_free(sc
->ptb
, M_DEVBUF
);
951 /* Emu10k1 Memory management */
953 static struct emuxki_mem
*
954 emuxki_mem_new(struct emuxki_softc
*sc
, int ptbidx
,
955 size_t size
, struct malloc_type
*type
, int flags
)
957 struct emuxki_mem
*mem
;
959 if ((mem
= malloc(sizeof(*mem
), type
, flags
)) == NULL
)
962 mem
->ptbidx
= ptbidx
;
963 if ((mem
->dmamem
= dmamem_alloc(sc
->sc_dmat
, size
, EMU_DMA_ALIGN
,
964 EMU_DMAMEM_NSEG
, type
, flags
)) == NULL
) {
972 emuxki_mem_delete(struct emuxki_mem
*mem
, struct malloc_type
*type
)
975 dmamem_free(mem
->dmamem
, type
);
980 emuxki_pmem_alloc(struct emuxki_softc
*sc
, size_t size
,
981 struct malloc_type
*type
, int flags
)
985 struct emuxki_mem
*mem
;
986 uint32_t *ptb
, silentpage
;
988 ptb
= KERNADDR(sc
->ptb
);
989 silentpage
= DMAADDR(sc
->silentpage
) << 1;
990 numblocks
= size
/ EMU_PTESIZE
;
991 if (size
% EMU_PTESIZE
)
994 for (i
= 0; i
< EMU_MAXPTE
; i
++)
995 if ((le32toh(ptb
[i
]) & EMU_CHAN_MAP_PTE_MASK
) == silentpage
) {
996 /* We look for a free PTE */
998 for (j
= 0; j
< numblocks
; j
++)
999 if ((le32toh(ptb
[i
+ j
])
1000 & EMU_CHAN_MAP_PTE_MASK
) != silentpage
)
1002 if (j
== numblocks
) {
1003 if ((mem
= emuxki_mem_new(sc
, i
,
1004 size
, type
, flags
)) == NULL
) {
1008 for (j
= 0; j
< numblocks
; j
++)
1010 htole32((((DMAADDR(mem
->dmamem
) +
1011 j
* EMU_PTESIZE
)) << 1) | (i
+ j
));
1012 LIST_INSERT_HEAD(&(sc
->mem
), mem
, next
);
1014 return (KERNADDR(mem
->dmamem
));
1023 emuxki_rmem_alloc(struct emuxki_softc
*sc
, size_t size
,
1024 struct malloc_type
*type
, int flags
)
1026 struct emuxki_mem
*mem
;
1029 mem
= emuxki_mem_new(sc
, EMU_RMEM
, size
, type
, flags
);
1034 LIST_INSERT_HEAD(&(sc
->mem
), mem
, next
);
1037 return KERNADDR(mem
->dmamem
);
1041 * emuxki_channel_* : Channel management functions
1042 * emuxki_chanparms_* : Channel parameters modification functions
1046 * is splaudio necessary here, can the same voice be manipulated by two
1047 * different threads at a time ?
1050 emuxki_chanparms_set_defaults(struct emuxki_channel
*chan
)
1053 chan
->fxsend
.a
.level
= chan
->fxsend
.b
.level
=
1054 chan
->fxsend
.c
.level
= chan
->fxsend
.d
.level
=
1056 chan
->fxsend
.e
.level
= chan
->fxsend
.f
.level
=
1057 chan
->fxsend
.g
.level
= chan
->fxsend
.h
.level
=
1058 chan
->voice
->sc
->sc_type
& EMUXKI_AUDIGY
?
1059 0xc0 : 0xff; /* not max */
1061 chan
->fxsend
.a
.dest
= 0x0;
1062 chan
->fxsend
.b
.dest
= 0x1;
1063 chan
->fxsend
.c
.dest
= 0x2;
1064 chan
->fxsend
.d
.dest
= 0x3;
1066 chan
->fxsend
.e
.dest
= 0x4;
1067 chan
->fxsend
.f
.dest
= 0x5;
1068 chan
->fxsend
.g
.dest
= 0x6;
1069 chan
->fxsend
.h
.dest
= 0x7;
1071 chan
->pitch
.initial
= 0x0000; /* shouldn't it be 0xE000 ? */
1072 chan
->pitch
.current
= 0x0000; /* should it be 0x0400 */
1073 chan
->pitch
.target
= 0x0000; /* the unity pitch shift ? */
1074 chan
->pitch
.envelope_amount
= 0x00; /* none */
1076 chan
->initial_attenuation
= 0x00; /* no attenuation */
1077 chan
->volume
.current
= 0x0000; /* no volume */
1078 chan
->volume
.target
= 0xffff;
1079 chan
->volume
.envelope
.current_state
= 0x8000; /* 0 msec delay */
1080 chan
->volume
.envelope
.hold_time
= 0x7f; /* 0 msec */
1081 chan
->volume
.envelope
.attack_time
= 0x7F; /* 5.5msec */
1082 chan
->volume
.envelope
.sustain_level
= 0x7F; /* full */
1083 chan
->volume
.envelope
.decay_time
= 0x7F; /* 22msec */
1085 chan
->filter
.initial_cutoff_frequency
= 0xff; /* no filter */
1086 chan
->filter
.current_cutoff_frequency
= 0xffff; /* no filtering */
1087 chan
->filter
.target_cutoff_frequency
= 0xffff; /* no filtering */
1088 chan
->filter
.lowpass_resonance_height
= 0x0;
1089 chan
->filter
.interpolation_ROM
= 0x1; /* full band */
1090 chan
->filter
.envelope_amount
= 0x7f; /* none */
1091 chan
->filter
.LFO_modulation_depth
= 0x00; /* none */
1093 chan
->loop
.start
= 0x000000;
1094 chan
->loop
.end
= 0x000010; /* Why ? */
1096 chan
->modulation
.envelope
.current_state
= 0x8000;
1097 chan
->modulation
.envelope
.hold_time
= 0x00; /* 127 better ? */
1098 chan
->modulation
.envelope
.attack_time
= 0x00; /* infinite */
1099 chan
->modulation
.envelope
.sustain_level
= 0x00; /* off */
1100 chan
->modulation
.envelope
.decay_time
= 0x7f; /* 22 msec */
1101 chan
->modulation
.LFO_state
= 0x8000;
1103 chan
->vibrato_LFO
.state
= 0x8000;
1104 chan
->vibrato_LFO
.modulation_depth
= 0x00; /* none */
1105 chan
->vibrato_LFO
.vibrato_depth
= 0x00;
1106 chan
->vibrato_LFO
.frequency
= 0x00; /* Why set to 24 when
1109 chan
->tremolo_depth
= 0x00;
1112 /* only call it at splaudio */
1113 static struct emuxki_channel
*
1114 emuxki_channel_new(struct emuxki_voice
*voice
, u_int8_t num
)
1116 struct emuxki_channel
*chan
;
1118 chan
= malloc(sizeof(struct emuxki_channel
), M_DEVBUF
, M_WAITOK
);
1122 chan
->voice
= voice
;
1124 emuxki_chanparms_set_defaults(chan
);
1125 chan
->voice
->sc
->channel
[num
] = chan
;
1129 /* only call it at splaudio */
1131 emuxki_channel_delete(struct emuxki_channel
*chan
)
1134 chan
->voice
->sc
->channel
[chan
->num
] = NULL
;
1135 free(chan
, M_DEVBUF
);
1139 emuxki_channel_set_fxsend(struct emuxki_channel
*chan
,
1140 struct emuxki_chanparms_fxsend
*fxsend
)
1142 /* Could do a memcpy ...*/
1143 chan
->fxsend
.a
.level
= fxsend
->a
.level
;
1144 chan
->fxsend
.b
.level
= fxsend
->b
.level
;
1145 chan
->fxsend
.c
.level
= fxsend
->c
.level
;
1146 chan
->fxsend
.d
.level
= fxsend
->d
.level
;
1147 chan
->fxsend
.a
.dest
= fxsend
->a
.dest
;
1148 chan
->fxsend
.b
.dest
= fxsend
->b
.dest
;
1149 chan
->fxsend
.c
.dest
= fxsend
->c
.dest
;
1150 chan
->fxsend
.d
.dest
= fxsend
->d
.dest
;
1153 chan
->fxsend
.e
.level
= fxsend
->e
.level
;
1154 chan
->fxsend
.f
.level
= fxsend
->f
.level
;
1155 chan
->fxsend
.g
.level
= fxsend
->g
.level
;
1156 chan
->fxsend
.h
.level
= fxsend
->h
.level
;
1157 chan
->fxsend
.e
.dest
= fxsend
->e
.dest
;
1158 chan
->fxsend
.f
.dest
= fxsend
->f
.dest
;
1159 chan
->fxsend
.g
.dest
= fxsend
->g
.dest
;
1160 chan
->fxsend
.h
.dest
= fxsend
->h
.dest
;
1164 emuxki_channel_set_srate(struct emuxki_channel
*chan
, uint32_t srate
)
1167 chan
->pitch
.target
= (srate
<< 8) / 375;
1168 chan
->pitch
.target
= (chan
->pitch
.target
>> 1) +
1169 (chan
->pitch
.target
& 1);
1170 chan
->pitch
.target
&= 0xffff;
1171 chan
->pitch
.current
= chan
->pitch
.target
;
1172 chan
->pitch
.initial
=
1173 (emuxki_rate_to_pitch(srate
) >> 8) & EMU_CHAN_IP_MASK
;
1176 /* voice params must be set before calling this */
1178 emuxki_channel_set_bufparms(struct emuxki_channel
*chan
,
1179 uint32_t start
, uint32_t end
)
1182 chan
->loop
.start
= start
& EMU_CHAN_PSST_LOOPSTARTADDR_MASK
;
1183 chan
->loop
.end
= end
& EMU_CHAN_DSL_LOOPENDADDR_MASK
;
1187 emuxki_channel_commit_fx(struct emuxki_channel
*chan
)
1189 struct emuxki_softc
*sc
;
1192 sc
= chan
->voice
->sc
;
1194 if(sc
->sc_type
& EMUXKI_AUDIGY
) {
1195 emuxki_write(sc
, chano
, EMU_A_CHAN_FXRT1
,
1196 (chan
->fxsend
.d
.dest
<< 24) |
1197 (chan
->fxsend
.c
.dest
<< 16) |
1198 (chan
->fxsend
.b
.dest
<< 8) |
1199 (chan
->fxsend
.a
.dest
));
1200 emuxki_write(sc
, chano
, EMU_A_CHAN_FXRT2
,
1201 (chan
->fxsend
.h
.dest
<< 24) |
1202 (chan
->fxsend
.g
.dest
<< 16) |
1203 (chan
->fxsend
.f
.dest
<< 8) |
1204 (chan
->fxsend
.e
.dest
));
1205 emuxki_write(sc
, chano
, EMU_A_CHAN_SENDAMOUNTS
,
1206 (chan
->fxsend
.e
.level
<< 24) |
1207 (chan
->fxsend
.f
.level
<< 16) |
1208 (chan
->fxsend
.g
.level
<< 8) |
1209 (chan
->fxsend
.h
.level
));
1211 emuxki_write(sc
, chano
, EMU_CHAN_FXRT
,
1212 (chan
->fxsend
.d
.dest
<< 28) |
1213 (chan
->fxsend
.c
.dest
<< 24) |
1214 (chan
->fxsend
.b
.dest
<< 20) |
1215 (chan
->fxsend
.a
.dest
<< 16));
1218 emuxki_write(sc
, chano
, 0x10000000 | EMU_CHAN_PTRX
,
1219 (chan
->fxsend
.a
.level
<< 8) | chan
->fxsend
.b
.level
);
1220 emuxki_write(sc
, chano
, EMU_CHAN_DSL
,
1221 (chan
->fxsend
.d
.level
<< 24) | chan
->loop
.end
);
1222 emuxki_write(sc
, chano
, EMU_CHAN_PSST
,
1223 (chan
->fxsend
.c
.level
<< 24) | chan
->loop
.start
);
1227 emuxki_channel_commit_parms(struct emuxki_channel
*chan
)
1229 struct emuxki_voice
*voice
;
1230 struct emuxki_softc
*sc
;
1231 uint32_t start
, mapval
;
1235 voice
= chan
->voice
;
1238 start
= chan
->loop
.start
+
1239 (voice
->stereo
? 28 : 30) * (voice
->b16
+ 1);
1240 mapval
= DMAADDR(sc
->silentpage
) << 1 | EMU_CHAN_MAP_PTI_MASK
;
1243 emuxki_write(sc
, chano
, EMU_CHAN_CPF_STEREO
, voice
->stereo
);
1245 emuxki_channel_commit_fx(chan
);
1247 emuxki_write(sc
, chano
, EMU_CHAN_CCCA
,
1248 (chan
->filter
.lowpass_resonance_height
<< 28) |
1249 (chan
->filter
.interpolation_ROM
<< 25) |
1250 (voice
->b16
? 0 : EMU_CHAN_CCCA_8BITSELECT
) | start
);
1251 emuxki_write(sc
, chano
, EMU_CHAN_Z1
, 0);
1252 emuxki_write(sc
, chano
, EMU_CHAN_Z2
, 0);
1253 emuxki_write(sc
, chano
, EMU_CHAN_MAPA
, mapval
);
1254 emuxki_write(sc
, chano
, EMU_CHAN_MAPB
, mapval
);
1255 emuxki_write(sc
, chano
, EMU_CHAN_CVCF_CURRFILTER
,
1256 chan
->filter
.current_cutoff_frequency
);
1257 emuxki_write(sc
, chano
, EMU_CHAN_VTFT_FILTERTARGET
,
1258 chan
->filter
.target_cutoff_frequency
);
1259 emuxki_write(sc
, chano
, EMU_CHAN_ATKHLDM
,
1260 (chan
->modulation
.envelope
.hold_time
<< 8) |
1261 chan
->modulation
.envelope
.attack_time
);
1262 emuxki_write(sc
, chano
, EMU_CHAN_DCYSUSM
,
1263 (chan
->modulation
.envelope
.sustain_level
<< 8) |
1264 chan
->modulation
.envelope
.decay_time
);
1265 emuxki_write(sc
, chano
, EMU_CHAN_LFOVAL1
,
1266 chan
->modulation
.LFO_state
);
1267 emuxki_write(sc
, chano
, EMU_CHAN_LFOVAL2
,
1268 chan
->vibrato_LFO
.state
);
1269 emuxki_write(sc
, chano
, EMU_CHAN_FMMOD
,
1270 (chan
->vibrato_LFO
.modulation_depth
<< 8) |
1271 chan
->filter
.LFO_modulation_depth
);
1272 emuxki_write(sc
, chano
, EMU_CHAN_TREMFRQ
,
1273 (chan
->tremolo_depth
<< 8));
1274 emuxki_write(sc
, chano
, EMU_CHAN_FM2FRQ2
,
1275 (chan
->vibrato_LFO
.vibrato_depth
<< 8) |
1276 chan
->vibrato_LFO
.frequency
);
1277 emuxki_write(sc
, chano
, EMU_CHAN_ENVVAL
,
1278 chan
->modulation
.envelope
.current_state
);
1279 emuxki_write(sc
, chano
, EMU_CHAN_ATKHLDV
,
1280 (chan
->volume
.envelope
.hold_time
<< 8) |
1281 chan
->volume
.envelope
.attack_time
);
1282 emuxki_write(sc
, chano
, EMU_CHAN_ENVVOL
,
1283 chan
->volume
.envelope
.current_state
);
1284 emuxki_write(sc
, chano
, EMU_CHAN_PEFE
,
1285 (chan
->pitch
.envelope_amount
<< 8) |
1286 chan
->filter
.envelope_amount
);
1291 emuxki_channel_start(struct emuxki_channel
*chan
)
1293 struct emuxki_voice
*voice
;
1294 struct emuxki_softc
*sc
;
1295 u_int8_t cache_sample
, cache_invalid_size
, chano
;
1299 voice
= chan
->voice
;
1302 cache_sample
= voice
->stereo
? 4 : 2;
1303 sample
= voice
->b16
? 0x00000000 : 0x80808080;
1304 cache_invalid_size
= (voice
->stereo
? 28 : 30) * (voice
->b16
+ 1);
1307 while (cache_sample
--) {
1308 emuxki_write(sc
, chano
, EMU_CHAN_CD0
+ cache_sample
,
1311 emuxki_write(sc
, chano
, EMU_CHAN_CCR_CACHEINVALIDSIZE
, 0);
1312 emuxki_write(sc
, chano
, EMU_CHAN_CCR_READADDRESS
, 64);
1313 emuxki_write(sc
, chano
, EMU_CHAN_CCR_CACHEINVALIDSIZE
,
1314 cache_invalid_size
);
1315 emuxki_write(sc
, chano
, EMU_CHAN_IFATN
,
1316 (chan
->filter
.target_cutoff_frequency
<< 8) |
1317 chan
->initial_attenuation
);
1318 emuxki_write(sc
, chano
, EMU_CHAN_VTFT_VOLUMETARGET
,
1319 chan
->volume
.target
);
1320 emuxki_write(sc
, chano
, EMU_CHAN_CVCF_CURRVOL
,
1321 chan
->volume
.current
);
1323 EMU_MKSUBREG(1, chano
, EMU_SOLEL
+ (chano
>> 5)),
1324 0); /* Clear stop on loop */
1326 EMU_MKSUBREG(1, chano
, EMU_CLIEL
+ (chano
>> 5)),
1327 0); /* Clear loop interrupt */
1328 emuxki_write(sc
, chano
, EMU_CHAN_DCYSUSV
,
1329 (chan
->volume
.envelope
.sustain_level
<< 8) |
1330 chan
->volume
.envelope
.decay_time
);
1331 emuxki_write(sc
, chano
, EMU_CHAN_PTRX_PITCHTARGET
,
1332 chan
->pitch
.target
);
1333 emuxki_write(sc
, chano
, EMU_CHAN_CPF_PITCH
,
1334 chan
->pitch
.current
);
1335 emuxki_write(sc
, chano
, EMU_CHAN_IP
, chan
->pitch
.initial
);
1341 emuxki_channel_stop(struct emuxki_channel
*chan
)
1343 struct emuxki_softc
*sc
;
1347 sc
= chan
->voice
->sc
;
1350 emuxki_write(sc
, chano
, EMU_CHAN_PTRX_PITCHTARGET
, 0);
1351 emuxki_write(sc
, chano
, EMU_CHAN_CPF_PITCH
, 0);
1352 emuxki_write(sc
, chano
, EMU_CHAN_IFATN_ATTENUATION
, 0xff);
1353 emuxki_write(sc
, chano
, EMU_CHAN_VTFT_VOLUMETARGET
, 0);
1354 emuxki_write(sc
, chano
, EMU_CHAN_CVCF_CURRVOL
, 0);
1355 emuxki_write(sc
, chano
, EMU_CHAN_IP
, 0);
1361 * emuxki_voice_dataloc : use(play or rec) independent dataloc union helpers
1362 * emuxki_voice_channel_* : play part of dataloc union helpers
1363 * emuxki_voice_recsrc_* : rec part of dataloc union helpers
1366 /* Allocate channels for voice in case of play voice */
1368 emuxki_voice_channel_create(struct emuxki_voice
*voice
)
1370 struct emuxki_channel
**channel
;
1374 channel
= voice
->sc
->channel
;
1375 stereo
= voice
->stereo
;
1376 for (i
= 0; i
< EMU_NUMCHAN
- stereo
; i
+= stereo
+ 1) {
1377 if ((stereo
&& (channel
[i
+ 1] != NULL
)) ||
1378 (channel
[i
] != NULL
)) /* Looking for free channels */
1382 voice
->dataloc
.chan
[1] =
1383 emuxki_channel_new(voice
, i
+ 1);
1384 if (voice
->dataloc
.chan
[1] == NULL
) {
1389 voice
->dataloc
.chan
[0] = emuxki_channel_new(voice
, i
);
1390 if (voice
->dataloc
.chan
[0] == NULL
) {
1392 emuxki_channel_delete(voice
->dataloc
.chan
[1]);
1393 voice
->dataloc
.chan
[1] = NULL
;
1404 /* When calling this function we assume no one can access the voice */
1406 emuxki_voice_channel_destroy(struct emuxki_voice
*voice
)
1409 emuxki_channel_delete(voice
->dataloc
.chan
[0]);
1410 voice
->dataloc
.chan
[0] = NULL
;
1412 emuxki_channel_delete(voice
->dataloc
.chan
[1]);
1413 voice
->dataloc
.chan
[1] = NULL
;
1417 * Will come back when used in voice_dataloc_create
1420 emuxki_recsrc_reserve(struct emuxki_voice
*voice
, emuxki_recsrc_t source
)
1423 if (source
>= EMU_NUMRECSRCS
) {
1425 printf("Tried to reserve invalid source: %d\n", source
);
1429 if (voice
->sc
->recsrc
[source
] == voice
)
1431 if (voice
->sc
->recsrc
[source
] != NULL
)
1433 voice
->sc
->recsrc
[source
] = voice
;
1437 /* When calling this function we assume the voice is stopped */
1439 emuxki_voice_recsrc_release(struct emuxki_softc
*sc
, emuxki_recsrc_t source
)
1442 sc
->recsrc
[source
] = NULL
;
1446 emuxki_voice_dataloc_create(struct emuxki_voice
*voice
)
1450 if (voice
->use
& EMU_VOICE_USE_PLAY
) {
1451 if ((error
= emuxki_voice_channel_create(voice
)))
1455 emuxki_recsrc_reserve(voice
, voice
->dataloc
.source
)))
1462 emuxki_voice_dataloc_destroy(struct emuxki_voice
*voice
)
1465 if (voice
->use
& EMU_VOICE_USE_PLAY
) {
1466 if (voice
->dataloc
.chan
[0] != NULL
)
1467 emuxki_voice_channel_destroy(voice
);
1469 if (voice
->dataloc
.source
!= EMU_RECSRC_NOTSET
) {
1470 emuxki_voice_recsrc_release(voice
->sc
,
1471 voice
->dataloc
.source
);
1472 voice
->dataloc
.source
= EMU_RECSRC_NOTSET
;
1477 static struct emuxki_voice
*
1478 emuxki_voice_new(struct emuxki_softc
*sc
, uint8_t use
)
1480 struct emuxki_voice
*voice
;
1489 if (!(voice
= malloc(sizeof(*voice
), M_DEVBUF
, M_WAITOK
)))
1491 } else if (voice
->use
!= use
)
1492 emuxki_voice_dataloc_destroy(voice
);
1494 goto skip_initialize
;
1497 voice
->state
= !EMU_VOICE_STATE_STARTED
;
1498 voice
->stereo
= EMU_VOICE_STEREO_NOTSET
;
1500 voice
->sample_rate
= 0;
1501 if (use
& EMU_VOICE_USE_PLAY
)
1502 voice
->dataloc
.chan
[0] = voice
->dataloc
.chan
[1] = NULL
;
1504 voice
->dataloc
.source
= EMU_RECSRC_NOTSET
;
1505 voice
->buffer
= NULL
;
1510 voice
->inthparam
= NULL
;
1515 LIST_INSERT_HEAD((&sc
->voices
), voice
, next
);
1522 emuxki_voice_delete(struct emuxki_voice
*voice
)
1524 struct emuxki_softc
*sc
;
1525 struct emuxki_voice
*lvoice
;
1529 if (voice
->state
& EMU_VOICE_STATE_STARTED
)
1530 emuxki_voice_halt(voice
);
1533 LIST_REMOVE(voice
, next
);
1534 lvoice
= sc
->lvoice
;
1539 emuxki_voice_dataloc_destroy(lvoice
);
1540 free(lvoice
, M_DEVBUF
);
1545 emuxki_voice_set_stereo(struct emuxki_voice
*voice
, uint8_t stereo
)
1548 emuxki_recsrc_t source
;
1549 struct emuxki_chanparms_fxsend fxsend
;
1551 source
= 0; /* XXX: gcc */
1552 if (! (voice
->use
& EMU_VOICE_USE_PLAY
))
1553 source
= voice
->dataloc
.source
;
1554 emuxki_voice_dataloc_destroy(voice
);
1555 if (! (voice
->use
& EMU_VOICE_USE_PLAY
))
1556 voice
->dataloc
.source
= source
;
1557 voice
->stereo
= stereo
;
1558 if ((error
= emuxki_voice_dataloc_create(voice
)))
1560 if (voice
->use
& EMU_VOICE_USE_PLAY
) {
1561 fxsend
.a
.dest
= 0x0;
1562 fxsend
.b
.dest
= 0x1;
1563 fxsend
.c
.dest
= 0x2;
1564 fxsend
.d
.dest
= 0x3;
1566 fxsend
.e
.dest
= 0x4;
1567 fxsend
.f
.dest
= 0x5;
1568 fxsend
.g
.dest
= 0x6;
1569 fxsend
.h
.dest
= 0x7;
1570 if (voice
->stereo
) {
1571 fxsend
.a
.level
= fxsend
.c
.level
= 0xc0;
1572 fxsend
.b
.level
= fxsend
.d
.level
= 0x00;
1573 fxsend
.e
.level
= fxsend
.g
.level
= 0xc0;
1574 fxsend
.f
.level
= fxsend
.h
.level
= 0x00;
1575 emuxki_channel_set_fxsend(voice
->dataloc
.chan
[0],
1577 fxsend
.a
.level
= fxsend
.c
.level
= 0x00;
1578 fxsend
.b
.level
= fxsend
.d
.level
= 0xc0;
1579 fxsend
.e
.level
= fxsend
.g
.level
= 0x00;
1580 fxsend
.f
.level
= fxsend
.h
.level
= 0xc0;
1581 emuxki_channel_set_fxsend(voice
->dataloc
.chan
[1],
1583 } /* No else : default is good for mono */
1589 emuxki_voice_set_srate(struct emuxki_voice
*voice
, uint32_t srate
)
1592 if (voice
->use
& EMU_VOICE_USE_PLAY
) {
1593 if ((srate
< 4000) || (srate
> 48000))
1595 voice
->sample_rate
= srate
;
1596 emuxki_channel_set_srate(voice
->dataloc
.chan
[0], srate
);
1598 emuxki_channel_set_srate(voice
->dataloc
.chan
[1],
1601 if ((srate
< 8000) || (srate
> 48000))
1603 voice
->sample_rate
= srate
;
1604 if (emuxki_voice_adc_rate(voice
) < 0) {
1605 voice
->sample_rate
= 0;
1613 emuxki_voice_set_audioparms(struct emuxki_voice
*voice
, uint8_t stereo
,
1614 uint8_t b16
, uint32_t srate
)
1618 if (voice
->stereo
== stereo
&& voice
->b16
== b16
&&
1619 voice
->sample_rate
== srate
)
1623 printf("Setting %s voice params : %s, %u bits, %u Hz\n",
1624 (voice
->use
& EMU_VOICE_USE_PLAY
) ? "play" : "record",
1625 stereo
? "stereo" : "mono", (b16
+ 1) * 8, srate
);
1628 if (voice
->stereo
!= stereo
) {
1629 if ((error
= emuxki_voice_set_stereo(voice
, stereo
)))
1633 if (voice
->sample_rate
!= srate
)
1634 error
= emuxki_voice_set_srate(voice
, srate
);
1638 /* voice audio parms (see just before) must be set prior to this */
1640 emuxki_voice_set_bufparms(struct emuxki_voice
*voice
, void *ptr
,
1641 uint32_t bufsize
, uint16_t blksize
)
1643 struct emuxki_mem
*mem
;
1644 struct emuxki_channel
**chan
;
1645 uint32_t start
, end
;
1646 uint8_t sample_size
;
1651 LIST_FOREACH(mem
, &voice
->sc
->mem
, next
) {
1652 if (KERNADDR(mem
->dmamem
) != ptr
)
1655 voice
->buffer
= mem
;
1656 sample_size
= (voice
->b16
+ 1) * (voice
->stereo
+ 1);
1657 voice
->trigblk
= 0; /* This shouldn't be needed */
1658 voice
->blkmod
= bufsize
/ blksize
;
1659 if (bufsize
% blksize
) /* This should not happen */
1663 if (voice
->use
& EMU_VOICE_USE_PLAY
) {
1664 voice
->blksize
= blksize
/ sample_size
;
1665 chan
= voice
->dataloc
.chan
;
1666 start
= mem
->ptbidx
<< 12;
1667 end
= start
+ bufsize
/ sample_size
;
1668 emuxki_channel_set_bufparms(chan
[0],
1671 emuxki_channel_set_bufparms(chan
[1],
1673 voice
->timerate
= (uint32_t) 48000 *
1674 voice
->blksize
/ voice
->sample_rate
;
1675 if (voice
->timerate
< 5)
1678 voice
->blksize
= blksize
;
1679 for(idx
= sizeof(emuxki_recbuf_sz
) /
1680 sizeof(emuxki_recbuf_sz
[0]); --idx
>= 0;)
1681 if (emuxki_recbuf_sz
[idx
] == bufsize
)
1685 printf("Invalid bufsize: %d\n", bufsize
);
1689 emuxki_write(voice
->sc
, 0,
1690 emuxki_recsrc_szreg
[voice
->dataloc
.source
], idx
);
1691 emuxki_write(voice
->sc
, 0,
1692 emuxki_recsrc_bufaddrreg
[voice
->dataloc
.source
],
1693 DMAADDR(mem
->dmamem
));
1695 /* Use timer to emulate DMA completion interrupt */
1696 voice
->timerate
= (u_int32_t
) 48000 * blksize
/
1697 (voice
->sample_rate
* sample_size
);
1698 if (voice
->timerate
< 5) {
1700 printf("Invalid timerate: %d, blksize %d\n",
1701 voice
->timerate
, blksize
);
1714 emuxki_voice_commit_parms(struct emuxki_voice
*voice
)
1716 if (voice
->use
& EMU_VOICE_USE_PLAY
) {
1717 emuxki_channel_commit_parms(voice
->dataloc
.chan
[0]);
1719 emuxki_channel_commit_parms(voice
->dataloc
.chan
[1]);
1724 emuxki_voice_curaddr(struct emuxki_voice
*voice
)
1729 /* XXX different semantics in these cases */
1730 if (voice
->use
& EMU_VOICE_USE_PLAY
) {
1731 /* returns number of samples (an l/r pair counts 1) */
1732 rv
= emuxki_read(voice
->sc
,
1733 voice
->dataloc
.chan
[0]->num
, EMU_CHAN_CCCA_CURRADDR
) -
1734 voice
->dataloc
.chan
[0]->loop
.start
;
1737 /* returns number of bytes */
1738 switch (voice
->dataloc
.source
) {
1739 case EMU_RECSRC_MIC
:
1740 idxreg
= (voice
->sc
->sc_type
& EMUXKI_AUDIGY
) ?
1741 EMU_A_MICIDX
: EMU_MICIDX
;
1743 case EMU_RECSRC_ADC
:
1744 idxreg
= (voice
->sc
->sc_type
& EMUXKI_AUDIGY
) ?
1745 EMU_A_ADCIDX
: EMU_ADCIDX
;
1752 printf("emu: bad recording source!\n");
1756 rv
= emuxki_read(voice
->sc
, 0, EMU_RECIDX(idxreg
)
1763 emuxki_resched_timer(struct emuxki_softc
*sc
)
1765 struct emuxki_voice
*voice
;
1773 LIST_FOREACH(voice
, &sc
->voices
, next
) {
1774 if ((voice
->state
& EMU_VOICE_STATE_STARTED
) == 0)
1777 if (voice
->timerate
< timerate
)
1778 timerate
= voice
->timerate
;
1781 if (timerate
& ~EMU_TIMER_RATE_MASK
)
1783 bus_space_write_2(sc
->sc_iot
, sc
->sc_ioh
, EMU_TIMER
, timerate
);
1784 if (!active
&& (sc
->timerstate
& EMU_TIMER_STATE_ENABLED
)) {
1785 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_INTE
,
1786 bus_space_read_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_INTE
) &
1787 ~EMU_INTE_INTERTIMERENB
);
1788 sc
->timerstate
&= ~EMU_TIMER_STATE_ENABLED
;
1789 } else if (active
&& !(sc
->timerstate
& EMU_TIMER_STATE_ENABLED
)) {
1790 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_INTE
,
1791 bus_space_read_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_INTE
) |
1792 EMU_INTE_INTERTIMERENB
);
1793 sc
->timerstate
|= EMU_TIMER_STATE_ENABLED
;
1799 emuxki_voice_adc_rate(struct emuxki_voice
*voice
)
1802 switch(voice
->sample_rate
) {
1804 return EMU_ADCCR_SAMPLERATE_48
;
1807 return EMU_ADCCR_SAMPLERATE_44
;
1810 return EMU_ADCCR_SAMPLERATE_32
;
1813 return EMU_ADCCR_SAMPLERATE_24
;
1816 return EMU_ADCCR_SAMPLERATE_22
;
1819 return EMU_ADCCR_SAMPLERATE_16
;
1822 if(voice
->sc
->sc_type
& EMUXKI_AUDIGY
)
1823 return EMU_A_ADCCR_SAMPLERATE_12
;
1826 printf("recording sample_rate not supported : %u\n", voice
->sample_rate
);
1832 if(voice
->sc
->sc_type
& EMUXKI_AUDIGY
)
1833 return EMU_A_ADCCR_SAMPLERATE_11
;
1835 return EMU_ADCCR_SAMPLERATE_11
;
1838 if(voice
->sc
->sc_type
& EMUXKI_AUDIGY
)
1839 return EMU_A_ADCCR_SAMPLERATE_8
;
1841 return EMU_ADCCR_SAMPLERATE_8
;
1845 printf("recording sample_rate not supported : %u\n", voice
->sample_rate
);
1849 return -1; /* shouldn't get here */
1854 emuxki_voice_start(struct emuxki_voice
*voice
,
1855 void (*inth
) (void *), void *inthparam
)
1860 voice
->inthparam
= inthparam
;
1861 if (voice
->use
& EMU_VOICE_USE_PLAY
) {
1863 emuxki_channel_start(voice
->dataloc
.chan
[0]);
1865 emuxki_channel_start(voice
->dataloc
.chan
[1]);
1868 switch (voice
->dataloc
.source
) {
1869 case EMU_RECSRC_ADC
:
1870 /* XXX need to program DSP to output L+R
1871 * XXX in monaural case? */
1872 if (voice
->sc
->sc_type
& EMUXKI_AUDIGY
) {
1873 val
= EMU_A_ADCCR_LCHANENABLE
;
1875 val
|= EMU_A_ADCCR_RCHANENABLE
;
1877 val
= EMU_ADCCR_LCHANENABLE
;
1879 val
|= EMU_ADCCR_RCHANENABLE
;
1881 val
|= emuxki_voice_adc_rate(voice
);
1882 emuxki_write(voice
->sc
, 0, EMU_ADCCR
, 0);
1883 emuxki_write(voice
->sc
, 0, EMU_ADCCR
, val
);
1885 case EMU_RECSRC_MIC
:
1887 printf("unimplemented\n");
1889 case EMU_RECSRC_NOTSET
:
1891 printf("Bad dataloc.source %d\n",
1892 voice
->dataloc
.source
);
1896 switch (voice
->dataloc
.source
) {
1897 case EMU_RECSRC_ADC
:
1899 case EMU_RECSRC_MIC
:
1900 /* DMA completion interrupt is useless; use timer */
1903 val
= emu_rd(sc
, INTE
, 4);
1904 val
|= emuxki_recsrc_intrmasks
[voice
->dataloc
.source
];
1905 emu_wr(sc
, INTE
, val
, 4);
1913 voice
->state
|= EMU_VOICE_STATE_STARTED
;
1914 emuxki_resched_timer(voice
->sc
);
1918 emuxki_voice_halt(struct emuxki_voice
*voice
)
1921 if (voice
->use
& EMU_VOICE_USE_PLAY
) {
1922 emuxki_channel_stop(voice
->dataloc
.chan
[0]);
1924 emuxki_channel_stop(voice
->dataloc
.chan
[1]);
1926 switch (voice
->dataloc
.source
) {
1927 case EMU_RECSRC_ADC
:
1928 emuxki_write(voice
->sc
, 0, EMU_ADCCR
, 0);
1931 case EMU_RECSRC_MIC
:
1932 printf("unimplemented\n");
1935 case EMU_RECSRC_NOTSET
:
1936 printf("Bad dataloc.source %d\n",
1937 voice
->dataloc
.source
);
1941 switch (voice
->dataloc
.source
) {
1942 case EMU_RECSRC_ADC
:
1944 case EMU_RECSRC_MIC
:
1945 /* This should reset buffer pointer */
1946 emuxki_write(voice
->sc
, 0,
1947 emuxki_recsrc_szreg
[voice
->dataloc
.source
],
1948 EMU_RECBS_BUFSIZE_NONE
);
1952 val
= emu_rd(sc
, INTE
, 4);
1953 val
&= ~emuxki_recsrc_intrmasks
[voice
->dataloc
.source
];
1954 emu_wr(sc
, INTE
, val
, 4);
1962 voice
->state
&= ~EMU_VOICE_STATE_STARTED
;
1963 emuxki_resched_timer(voice
->sc
);
1967 * The interrupt handler
1970 emuxki_intr(void *arg
)
1972 struct emuxki_softc
*sc
;
1973 struct emuxki_voice
*voice
;
1974 uint32_t ipr
, curblk
;
1979 while ((ipr
= bus_space_read_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_IPR
))) {
1980 if (ipr
& EMU_IPR_INTERVALTIMER
) {
1981 LIST_FOREACH(voice
, &sc
->voices
, next
) {
1983 EMU_VOICE_STATE_STARTED
) == 0)
1986 curblk
= emuxki_voice_curaddr(voice
) /
1989 if (curblk
== voice
->trigblk
) {
1990 voice
->inth(voice
->inthparam
);
1992 voice
->trigblk
%= voice
->blkmod
;
1995 while ((curblk
>= voice
->trigblk
&&
1996 curblk
< (voice
->trigblk
+ voice
->blkmod
/ 2)) ||
1997 ((int)voice
->trigblk
- (int)curblk
) >
1998 (voice
->blkmod
/ 2 + 1)) {
1999 voice
->inth(voice
->inthparam
);
2001 voice
->trigblk
%= voice
->blkmod
;
2008 bus_space_write_4(sc
->sc_iot
, sc
->sc_ioh
, EMU_IPR
, ipr
);
2018 * Audio Architecture callbacks
2022 emuxki_open(void *addr
, int flags
)
2024 struct emuxki_softc
*sc
;
2028 printf("%s: emuxki_open called\n", device_xname(sc
->sc_dev
));
2032 * Multiple voice support would be added as soon as I find a way to
2033 * trick the audio arch into supporting multiple voices.
2034 * Or I might integrate a modified audio arch supporting
2039 * I did this because i have problems identifying the selected
2040 * recording source(s) which is necessary when setting recording
2041 * params This will be addressed very soon
2043 if (flags
& AUOPEN_READ
) {
2044 sc
->rvoice
= emuxki_voice_new(sc
, 0 /* EMU_VOICE_USE_RECORD */);
2045 if (sc
->rvoice
== NULL
)
2048 /* XXX Hardcode RECSRC_ADC for now */
2049 sc
->rvoice
->dataloc
.source
= EMU_RECSRC_ADC
;
2052 if (flags
& AUOPEN_WRITE
) {
2053 sc
->pvoice
= emuxki_voice_new(sc
, EMU_VOICE_USE_PLAY
);
2054 if (sc
->pvoice
== NULL
) {
2056 emuxki_voice_delete(sc
->rvoice
);
2067 emuxki_close(void *addr
)
2069 struct emuxki_softc
*sc
;
2073 printf("%s: emu10K1_close called\n", device_xname(sc
->sc_dev
));
2076 /* No multiple voice support for now */
2077 if (sc
->rvoice
!= NULL
) {
2078 emuxki_voice_delete(sc
->rvoice
);
2081 if (sc
->pvoice
!= NULL
) {
2082 emuxki_voice_delete(sc
->pvoice
);
2088 emuxki_query_encoding(void *addr
, struct audio_encoding
*fp
)
2091 struct emuxki_softc
*sc
;
2094 printf("%s: emuxki_query_encoding called\n", device_xname(sc
->sc_dev
));
2097 switch (fp
->index
) {
2099 strcpy(fp
->name
, AudioEulinear
);
2100 fp
->encoding
= AUDIO_ENCODING_ULINEAR
;
2105 strcpy(fp
->name
, AudioEmulaw
);
2106 fp
->encoding
= AUDIO_ENCODING_ULAW
;
2108 fp
->flags
= AUDIO_ENCODINGFLAG_EMULATED
;
2111 strcpy(fp
->name
, AudioEalaw
);
2112 fp
->encoding
= AUDIO_ENCODING_ALAW
;
2114 fp
->flags
= AUDIO_ENCODINGFLAG_EMULATED
;
2117 strcpy(fp
->name
, AudioEslinear
);
2118 fp
->encoding
= AUDIO_ENCODING_SLINEAR
;
2120 fp
->flags
= AUDIO_ENCODINGFLAG_EMULATED
;
2123 strcpy(fp
->name
, AudioEslinear_le
);
2124 fp
->encoding
= AUDIO_ENCODING_SLINEAR_LE
;
2129 strcpy(fp
->name
, AudioEulinear_le
);
2130 fp
->encoding
= AUDIO_ENCODING_ULINEAR_LE
;
2132 fp
->flags
= AUDIO_ENCODINGFLAG_EMULATED
;
2135 strcpy(fp
->name
, AudioEslinear_be
);
2136 fp
->encoding
= AUDIO_ENCODING_SLINEAR_BE
;
2138 fp
->flags
= AUDIO_ENCODINGFLAG_EMULATED
;
2141 strcpy(fp
->name
, AudioEulinear_be
);
2142 fp
->encoding
= AUDIO_ENCODING_ULINEAR_BE
;
2144 fp
->flags
= AUDIO_ENCODINGFLAG_EMULATED
;
2153 emuxki_set_vparms(struct emuxki_voice
*voice
, const audio_params_t
*p
,
2154 stream_filter_list_t
*fil
)
2158 mode
= (voice
->use
& EMU_VOICE_USE_PLAY
) ?
2159 AUMODE_PLAY
: AUMODE_RECORD
;
2160 i
= auconv_set_converter(emuxki_formats
, EMUXKI_NFORMATS
,
2161 mode
, p
, FALSE
, fil
);
2164 if (fil
->req_size
> 0)
2165 p
= &fil
->filters
[0].param
;
2166 return emuxki_voice_set_audioparms
2167 (voice
, p
->channels
== 2, p
->precision
== 16, p
->sample_rate
);
2171 emuxki_set_params(void *addr
, int setmode
, int usemode
, audio_params_t
*play
,
2172 audio_params_t
*rec
, stream_filter_list_t
*pfil
, stream_filter_list_t
*rfil
)
2174 struct emuxki_softc
*sc
;
2175 struct audio_params
*p
;
2176 struct emuxki_voice
*v
;
2177 stream_filter_list_t
*fil
;
2181 for (mode
= AUMODE_RECORD
; mode
!= -1;
2182 mode
= mode
== AUMODE_RECORD
? AUMODE_PLAY
: -1) {
2183 if ((usemode
& setmode
& mode
) == 0)
2186 if (mode
== AUMODE_PLAY
) {
2200 /* No multiple voice support for now */
2201 if ((error
= emuxki_set_vparms(v
, p
, fil
)))
2209 emuxki_halt_output(void *addr
)
2211 struct emuxki_softc
*sc
;
2214 /* No multiple voice support for now */
2215 if (sc
->pvoice
== NULL
)
2218 emuxki_voice_halt(sc
->pvoice
);
2223 emuxki_halt_input(void *addr
)
2225 struct emuxki_softc
*sc
;
2229 printf("%s: emuxki_halt_input called\n", device_xname(sc
->sc_dev
));
2232 /* No multiple voice support for now */
2233 if (sc
->rvoice
== NULL
)
2235 emuxki_voice_halt(sc
->rvoice
);
2240 emuxki_getdev(void *addr
, struct audio_device
*dev
)
2242 struct emuxki_softc
*sc
;
2250 emuxki_set_port(void *addr
, mixer_ctrl_t
*mctl
)
2252 struct emuxki_softc
*sc
;
2255 return sc
->codecif
->vtbl
->mixer_set_port(sc
->codecif
, mctl
);
2259 emuxki_get_port(void *addr
, mixer_ctrl_t
*mctl
)
2261 struct emuxki_softc
*sc
;
2264 return sc
->codecif
->vtbl
->mixer_get_port(sc
->codecif
, mctl
);
2268 emuxki_query_devinfo(void *addr
, mixer_devinfo_t
*minfo
)
2270 struct emuxki_softc
*sc
;
2273 return sc
->codecif
->vtbl
->query_devinfo(sc
->codecif
, minfo
);
2277 emuxki_allocm(void *addr
, int direction
, size_t size
,
2278 struct malloc_type
*type
, int flags
)
2280 if (direction
== AUMODE_PLAY
)
2281 return emuxki_pmem_alloc(addr
, size
, type
, flags
);
2283 return emuxki_rmem_alloc(addr
, size
, type
, flags
);
2287 emuxki_freem(void *addr
, void *ptr
, struct malloc_type
*type
)
2289 struct emuxki_softc
*sc
;
2290 struct emuxki_mem
*mem
;
2291 uint32_t *ptb
, silentpage
;
2296 ptb
= KERNADDR(sc
->ptb
);
2297 silentpage
= DMAADDR(sc
->silentpage
) << 1;
2298 LIST_FOREACH(mem
, &sc
->mem
, next
) {
2299 if (KERNADDR(mem
->dmamem
) != ptr
)
2303 if (mem
->ptbidx
!= EMU_RMEM
) {
2304 numblocks
= DMASIZE(mem
->dmamem
) / EMU_PTESIZE
;
2305 if (DMASIZE(mem
->dmamem
) % EMU_PTESIZE
)
2307 for (i
= 0; i
< numblocks
; i
++)
2308 ptb
[mem
->ptbidx
+ i
] =
2309 htole32(silentpage
| (mem
->ptbidx
+ i
));
2311 LIST_REMOVE(mem
, next
);
2314 emuxki_mem_delete(mem
, type
);
2319 /* blocksize should be a divisor of allowable buffersize */
2320 /* XXX probably this could be done better */
2322 emuxki_round_blocksize(void *addr
, int blksize
,
2323 int mode
, const audio_params_t
* param
)
2326 struct emuxki_softc
*sc
;
2327 struct audio_softc
*au
;
2335 au
= device_private(sc
->sc_audev
);
2339 bufsize
= emuxki_round_buffersize(sc
, AUMODE_RECORD
,
2345 while (bufsize
> blksize
)
2352 emuxki_round_buffersize(void *addr
, int direction
, size_t bsize
)
2355 if (direction
== AUMODE_PLAY
) {
2356 if (bsize
< EMU_PTESIZE
)
2357 bsize
= EMU_PTESIZE
;
2358 else if (bsize
> (EMU_PTESIZE
* EMU_MAXPTE
))
2359 bsize
= EMU_PTESIZE
* EMU_MAXPTE
;
2360 /* Would be better if set to max available */
2361 else if (bsize
% EMU_PTESIZE
)
2363 (bsize
% EMU_PTESIZE
) +
2368 /* find nearest lower recbuf size */
2369 for(idx
= sizeof(emuxki_recbuf_sz
) /
2370 sizeof(emuxki_recbuf_sz
[0]); --idx
>= 0; ) {
2371 if (bsize
>= emuxki_recbuf_sz
[idx
]) {
2372 bsize
= emuxki_recbuf_sz
[idx
];
2385 emuxki_mappage(void *addr
, void *ptr
, off_t off
, int prot
)
2387 struct emuxki_softc
*sc
;
2388 struct emuxki_mem
*mem
;
2391 LIST_FOREACH(mem
, &sc
->mem
, next
) {
2392 if (KERNADDR(mem
->dmamem
) == ptr
) {
2393 struct dmamem
*dm
= mem
->dmamem
;
2395 return bus_dmamem_mmap(dm
->dmat
, dm
->segs
, dm
->nsegs
,
2396 off
, prot
, BUS_DMA_WAITOK
);
2404 emuxki_get_props(void *addr
)
2406 return AUDIO_PROP_MMAP
| AUDIO_PROP_INDEPENDENT
|
2407 AUDIO_PROP_FULLDUPLEX
;
2411 emuxki_trigger_output(void *addr
, void *start
, void *end
, int blksize
,
2412 void (*inth
) (void *), void *inthparam
, const audio_params_t
*params
)
2414 struct emuxki_softc
*sc
;
2415 /* No multiple voice support for now */
2416 struct emuxki_voice
*voice
;
2423 if ((error
= emuxki_voice_set_audioparms(voice
, params
->channels
== 2,
2424 params
->precision
== 16, params
->sample_rate
)))
2426 if ((error
= emuxki_voice_set_bufparms(voice
, start
,
2427 (char *)end
- (char *)start
, blksize
)))
2429 emuxki_voice_commit_parms(voice
);
2430 emuxki_voice_start(voice
, inth
, inthparam
);
2436 emuxki_trigger_input(void *addr
, void *start
, void *end
, int blksize
,
2437 void (*inth
) (void *), void *inthparam
, const audio_params_t
*params
)
2439 struct emuxki_softc
*sc
;
2440 /* No multiple voice support for now */
2441 struct emuxki_voice
*voice
;
2448 if ((error
= emuxki_voice_set_audioparms(voice
, params
->channels
== 2,
2449 params
->precision
== 16, params
->sample_rate
)))
2451 if ((error
= emuxki_voice_set_bufparms(voice
, start
,
2452 (char *)end
- (char *)start
, blksize
)))
2454 emuxki_voice_start(voice
, inth
, inthparam
);
2464 emuxki_ac97_attach(void *arg
, struct ac97_codec_if
*codecif
)
2466 struct emuxki_softc
*sc
;
2469 sc
->codecif
= codecif
;
2474 emuxki_ac97_read(void *arg
, uint8_t reg
, uint16_t *val
)
2476 struct emuxki_softc
*sc
;
2481 bus_space_write_1(sc
->sc_iot
, sc
->sc_ioh
, EMU_AC97ADDR
, reg
);
2482 *val
= bus_space_read_2(sc
->sc_iot
, sc
->sc_ioh
, EMU_AC97DATA
);
2489 emuxki_ac97_write(void *arg
, uint8_t reg
, uint16_t val
)
2491 struct emuxki_softc
*sc
;
2496 bus_space_write_1(sc
->sc_iot
, sc
->sc_ioh
, EMU_AC97ADDR
, reg
);
2497 bus_space_write_2(sc
->sc_iot
, sc
->sc_ioh
, EMU_AC97DATA
, val
);
2504 emuxki_ac97_reset(void *arg
)
2510 enum ac97_host_flags
2511 emuxki_ac97_flags(void *arg
)
2514 return AC97_HOST_SWAPPED_CHANNELS
;