1 /* $NetBSD: emuxki.c,v 1.45 2006/04/14 19:33:12 christos Exp $ */ 2 3 /*- 4 * Copyright (c) 2001 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Yannick Montulet. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 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. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the NetBSD 21 * Foundation, Inc. and its contributors. 22 * 4. Neither the name of The NetBSD Foundation nor the names of its 23 * contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36 * POSSIBILITY OF SUCH DAMAGE. 37 */ 38 39 /* 40 * Driver for Creative Labs SBLive! series and probably PCI512. 41 * 42 * Known bugs: 43 * - inversed stereo at ac97 codec level 44 * (XXX jdolecek - don't see the problem? maybe because auvia(4) has 45 * it swapped too?) 46 * - bass disappear when you plug rear jack-in on Cambridge FPS2000 speakers 47 * (and presumably all speakers that support front and rear jack-in) 48 * 49 * TODO: 50 * - Digital Outputs 51 * - (midi/mpu),joystick support 52 * - Multiple voices play (problem with /dev/audio architecture) 53 * - Multiple sources recording (Pb with audio(4)) 54 * - Independent modification of each channel's parameters (via mixer ?) 55 * - DSP FX patches (to make fx like chipmunk) 56 */ 57 58 #include <sys/cdefs.h> 59 __KERNEL_RCSID(0, "$NetBSD: emuxki.c,v 1.45 2006/04/14 19:33:12 christos Exp $"); 60 61 #include <sys/param.h> 62 #include <sys/device.h> 63 #include <sys/errno.h> 64 #include <sys/malloc.h> 65 #include <sys/systm.h> 66 #include <sys/audioio.h> 67 #include <sys/select.h> 68 #include <dev/pci/pcireg.h> 69 #include <dev/pci/pcivar.h> 70 #include <dev/pci/pcidevs.h> 71 #include <dev/audio_if.h> 72 #include <dev/audiovar.h> 73 #include <dev/auconv.h> 74 #include <dev/mulaw.h> 75 #include <dev/ic/ac97reg.h> 76 #include <dev/ic/ac97var.h> 77 78 #include <dev/pci/emuxkireg.h> 79 #include <dev/pci/emuxkivar.h> 80 81 /* autoconf goo */ 82 static int emuxki_match(struct device *, struct cfdata *, void *); 83 static void emuxki_attach(struct device *, struct device *, void *); 84 static int emuxki_detach(struct device *, int); 85 86 /* DMA mem mgmt */ 87 static struct dmamem *dmamem_alloc(bus_dma_tag_t, size_t, bus_size_t, 88 int, struct malloc_type *, int); 89 static void dmamem_free(struct dmamem *, struct malloc_type *); 90 91 /* Emu10k1 init & shutdown */ 92 static int emuxki_init(struct emuxki_softc *); 93 static void emuxki_shutdown(struct emuxki_softc *); 94 95 /* Emu10k1 mem mgmt */ 96 static void *emuxki_pmem_alloc(struct emuxki_softc *, size_t, 97 struct malloc_type *,int); 98 static void *emuxki_rmem_alloc(struct emuxki_softc *, size_t, 99 struct malloc_type *,int); 100 101 /* 102 * Emu10k1 channels funcs : There is no direct access to channels, everything 103 * is done through voices I will at least provide channel based fx params 104 * modification, later... 105 */ 106 107 /* Emu10k1 voice mgmt */ 108 static struct emuxki_voice *emuxki_voice_new(struct emuxki_softc *, 109 uint8_t); 110 static void emuxki_voice_delete(struct emuxki_voice *); 111 static int emuxki_voice_set_audioparms(struct emuxki_voice *, uint8_t, 112 uint8_t, uint32_t); 113 /* emuxki_voice_set_fxparms will come later, it'll need channel distinction */ 114 static int emuxki_voice_set_bufparms(struct emuxki_voice *, 115 void *, uint32_t, uint16_t); 116 static void emuxki_voice_commit_parms(struct emuxki_voice *); 117 static int emuxki_voice_adc_rate(struct emuxki_voice *); 118 static uint32_t emuxki_voice_curaddr(struct emuxki_voice *); 119 static void emuxki_voice_start(struct emuxki_voice *, 120 void (*) (void *), void *); 121 static void emuxki_voice_halt(struct emuxki_voice *); 122 123 /* 124 * Emu10k1 stream mgmt : not done yet 125 */ 126 #if 0 127 static struct emuxki_stream *emuxki_stream_new(struct emu10k1 *); 128 static void emuxki_stream_delete(struct emuxki_stream *); 129 static int emuxki_stream_set_audio_params(struct emuxki_stream *, 130 uint8_t, uint8_t, uint8_t, uint16_t); 131 static void emuxki_stream_start(struct emuxki_stream *); 132 static void emuxki_stream_halt(struct emuxki_stream *); 133 #endif 134 135 /* audio interface callbacks */ 136 137 static int emuxki_open(void *, int); 138 static void emuxki_close(void *); 139 140 static int emuxki_query_encoding(void *, struct audio_encoding *); 141 static int emuxki_set_params(void *, int, int, audio_params_t *, 142 audio_params_t *, stream_filter_list_t *, 143 stream_filter_list_t *); 144 145 static int emuxki_round_blocksize(void *, int, int, const audio_params_t *); 146 static size_t emuxki_round_buffersize(void *, int, size_t); 147 148 static int emuxki_trigger_output(void *, void *, void *, int, 149 void (*)(void *), void *, const audio_params_t *); 150 static int emuxki_trigger_input(void *, void *, void *, int, 151 void (*) (void *), void *, const audio_params_t *); 152 static int emuxki_halt_output(void *); 153 static int emuxki_halt_input(void *); 154 155 static int emuxki_getdev(void *, struct audio_device *); 156 static int emuxki_set_port(void *, mixer_ctrl_t *); 157 static int emuxki_get_port(void *, mixer_ctrl_t *); 158 static int emuxki_query_devinfo(void *, mixer_devinfo_t *); 159 160 static void *emuxki_allocm(void *, int, size_t, struct malloc_type *, int); 161 static void emuxki_freem(void *, void *, struct malloc_type *); 162 163 static paddr_t emuxki_mappage(void *, void *, off_t, int); 164 static int emuxki_get_props(void *); 165 166 /* Interrupt handler */ 167 static int emuxki_intr(void *); 168 169 /* Emu10k1 AC97 interface callbacks */ 170 static int emuxki_ac97_attach(void *, struct ac97_codec_if *); 171 static int emuxki_ac97_read(void *, uint8_t, uint16_t *); 172 static int emuxki_ac97_write(void *, uint8_t, uint16_t); 173 static int emuxki_ac97_reset(void *); 174 static enum ac97_host_flags emuxki_ac97_flags(void *); 175 176 /* 177 * Autoconfig goo. 178 */ 179 CFATTACH_DECL(emuxki, sizeof(struct emuxki_softc), 180 emuxki_match, emuxki_attach, emuxki_detach, NULL); 181 182 static const struct audio_hw_if emuxki_hw_if = { 183 emuxki_open, 184 emuxki_close, 185 NULL, /* drain */ 186 emuxki_query_encoding, 187 emuxki_set_params, 188 emuxki_round_blocksize, 189 NULL, /* commit settings */ 190 NULL, /* init_output */ 191 NULL, /* init_input */ 192 NULL, /* start_output */ 193 NULL, /* start_input */ 194 emuxki_halt_output, 195 emuxki_halt_input, 196 NULL, /* speaker_ctl */ 197 emuxki_getdev, 198 NULL, /* setfd */ 199 emuxki_set_port, 200 emuxki_get_port, 201 emuxki_query_devinfo, 202 emuxki_allocm, 203 emuxki_freem, 204 emuxki_round_buffersize, 205 emuxki_mappage, 206 emuxki_get_props, 207 emuxki_trigger_output, 208 emuxki_trigger_input, 209 NULL, /* dev_ioctl */ 210 }; 211 212 #if 0 213 static const int emuxki_recsrc_intrmasks[EMU_NUMRECSRCS] = 214 { EMU_INTE_MICBUFENABLE, EMU_INTE_ADCBUFENABLE, EMU_INTE_EFXBUFENABLE }; 215 #endif 216 static const uint32_t emuxki_recsrc_bufaddrreg[EMU_NUMRECSRCS] = 217 { EMU_MICBA, EMU_ADCBA, EMU_FXBA }; 218 static const uint32_t emuxki_recsrc_szreg[EMU_NUMRECSRCS] = 219 { EMU_MICBS, EMU_ADCBS, EMU_FXBS }; 220 static const int emuxki_recbuf_sz[] = { 221 0, 384, 448, 512, 640, 768, 896, 1024, 1280, 1536, 1792, 222 2048, 2560, 3072, 3584, 4096, 5120, 6144, 7168, 8192, 10240, 223 12288, 14366, 16384, 20480, 24576, 28672, 32768, 40960, 49152, 224 57344, 65536 225 }; 226 227 #define EMUXKI_NFORMATS 4 228 static const struct audio_format emuxki_formats[EMUXKI_NFORMATS] = { 229 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16, 230 2, AUFMT_STEREO, 0, {4000, 48000}}, 231 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16, 232 1, AUFMT_MONAURAL, 0, {4000, 48000}}, 233 {NULL, AUMODE_PLAY, AUDIO_ENCODING_ULINEAR_LE, 8, 8, 234 2, AUFMT_STEREO, 0, {4000, 48000}}, 235 {NULL, AUMODE_PLAY, AUDIO_ENCODING_ULINEAR_LE, 8, 8, 236 1, AUFMT_MONAURAL, 0, {4000, 48000}}, 237 }; 238 239 /* 240 * DMA memory mgmt 241 */ 242 243 static void 244 dmamem_delete(struct dmamem *mem, struct malloc_type *type) 245 { 246 247 free(mem->segs, type); 248 free(mem, type); 249 } 250 251 static struct dmamem * 252 dmamem_alloc(bus_dma_tag_t dmat, size_t size, bus_size_t align, 253 int nsegs, struct malloc_type *type, int flags) 254 { 255 struct dmamem *mem; 256 int bus_dma_flags; 257 258 /* Allocate memory for structure */ 259 if ((mem = malloc(sizeof(*mem), type, flags)) == NULL) 260 return NULL; 261 mem->dmat = dmat; 262 mem->size = size; 263 mem->align = align; 264 mem->nsegs = nsegs; 265 mem->bound = 0; 266 267 mem->segs = malloc(mem->nsegs * sizeof(*(mem->segs)), type, flags); 268 if (mem->segs == NULL) { 269 free(mem, type); 270 return NULL; 271 } 272 273 bus_dma_flags = (flags & M_NOWAIT) ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK; 274 if (bus_dmamem_alloc(dmat, mem->size, mem->align, mem->bound, 275 mem->segs, mem->nsegs, &(mem->rsegs), 276 bus_dma_flags)) { 277 dmamem_delete(mem, type); 278 return NULL; 279 } 280 281 if (bus_dmamem_map(dmat, mem->segs, mem->nsegs, mem->size, 282 &(mem->kaddr), bus_dma_flags | BUS_DMA_COHERENT)) { 283 bus_dmamem_free(dmat, mem->segs, mem->nsegs); 284 dmamem_delete(mem, type); 285 return NULL; 286 } 287 288 if (bus_dmamap_create(dmat, mem->size, mem->nsegs, mem->size, 289 mem->bound, bus_dma_flags, &(mem->map))) { 290 bus_dmamem_unmap(dmat, mem->kaddr, mem->size); 291 bus_dmamem_free(dmat, mem->segs, mem->nsegs); 292 dmamem_delete(mem, type); 293 return NULL; 294 } 295 296 if (bus_dmamap_load(dmat, mem->map, mem->kaddr, 297 mem->size, NULL, bus_dma_flags)) { 298 bus_dmamap_destroy(dmat, mem->map); 299 bus_dmamem_unmap(dmat, mem->kaddr, mem->size); 300 bus_dmamem_free(dmat, mem->segs, mem->nsegs); 301 dmamem_delete(mem, type); 302 return NULL; 303 } 304 305 return mem; 306 } 307 308 static void 309 dmamem_free(struct dmamem *mem, struct malloc_type *type) 310 { 311 312 bus_dmamap_unload(mem->dmat, mem->map); 313 bus_dmamap_destroy(mem->dmat, mem->map); 314 bus_dmamem_unmap(mem->dmat, mem->kaddr, mem->size); 315 bus_dmamem_free(mem->dmat, mem->segs, mem->nsegs); 316 dmamem_delete(mem, type); 317 } 318 319 320 /* 321 * Autoconf device callbacks : attach and detach 322 */ 323 324 static void 325 emuxki_pci_shutdown(struct emuxki_softc *sc) 326 { 327 328 if (sc->sc_ih != NULL) 329 pci_intr_disestablish(sc->sc_pc, sc->sc_ih); 330 if (sc->sc_ios) 331 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); 332 } 333 334 static int 335 emuxki_scinit(struct emuxki_softc *sc) 336 { 337 int err; 338 339 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG, 340 EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK | 341 EMU_HCFG_MUTEBUTTONENABLE); 342 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE, 343 EMU_INTE_SAMPLERATER | EMU_INTE_PCIERRENABLE); 344 345 if ((err = emuxki_init(sc))) 346 return err; 347 348 if (sc->sc_type & EMUXKI_AUDIGY2) { 349 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG, 350 EMU_HCFG_AUDIOENABLE | EMU_HCFG_AC3ENABLE_CDSPDIF | 351 EMU_HCFG_AC3ENABLE_GPSPDIF | EMU_HCFG_AUTOMUTE); 352 } else if (sc->sc_type & EMUXKI_AUDIGY) { 353 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG, 354 EMU_HCFG_AUDIOENABLE | EMU_HCFG_AUTOMUTE); 355 } else { 356 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG, 357 EMU_HCFG_AUDIOENABLE | EMU_HCFG_JOYENABLE | 358 EMU_HCFG_LOCKTANKCACHE_MASK | EMU_HCFG_AUTOMUTE); 359 } 360 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE, 361 bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_INTE) | 362 EMU_INTE_VOLINCRENABLE | EMU_INTE_VOLDECRENABLE | 363 EMU_INTE_MUTEENABLE); 364 if (sc->sc_type & EMUXKI_AUDIGY2) { 365 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A_IOCFG, 366 EMU_A_IOCFG_GPOUT0 | 367 bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_A_IOCFG)); 368 } 369 370 /* No multiple voice support for now */ 371 sc->pvoice = sc->rvoice = NULL; 372 373 return 0; 374 } 375 376 static int 377 emuxki_ac97_init(struct emuxki_softc *sc) 378 { 379 sc->hostif.arg = sc; 380 sc->hostif.attach = emuxki_ac97_attach; 381 sc->hostif.read = emuxki_ac97_read; 382 sc->hostif.write = emuxki_ac97_write; 383 sc->hostif.reset = emuxki_ac97_reset; 384 sc->hostif.flags = emuxki_ac97_flags; 385 return ac97_attach(&sc->hostif, &sc->sc_dev); 386 } 387 388 static int 389 emuxki_match(struct device *parent, struct cfdata *match, void *aux) 390 { 391 struct pci_attach_args *pa; 392 393 pa = aux; 394 if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_CREATIVELABS) 395 return 0; 396 397 switch (PCI_PRODUCT(pa->pa_id)) { 398 case PCI_PRODUCT_CREATIVELABS_SBLIVE: 399 case PCI_PRODUCT_CREATIVELABS_SBLIVE2: 400 case PCI_PRODUCT_CREATIVELABS_AUDIGY: 401 return 1; 402 default: 403 return 0; 404 } 405 } 406 407 static void 408 emuxki_attach(struct device *parent, struct device *self, void *aux) 409 { 410 struct emuxki_softc *sc; 411 struct pci_attach_args *pa; 412 char devinfo[256]; 413 pci_intr_handle_t ih; 414 const char *intrstr; 415 416 sc = (struct emuxki_softc *) self; 417 pa = aux; 418 aprint_naive(": Audio controller\n"); 419 420 if (pci_mapreg_map(pa, EMU_PCI_CBIO, PCI_MAPREG_TYPE_IO, 0, 421 &(sc->sc_iot), &(sc->sc_ioh), &(sc->sc_iob), 422 &(sc->sc_ios))) { 423 aprint_error(": can't map iospace\n"); 424 return; 425 } 426 pci_devinfo(pa->pa_id, pa->pa_class, 1, devinfo, sizeof(devinfo)); 427 aprint_normal(": %s\n", devinfo); 428 429 sc->sc_pc = pa->pa_pc; 430 sc->sc_dmat = pa->pa_dmat; 431 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, 432 pci_conf_read(pa->pa_pc, pa->pa_tag, 433 (PCI_COMMAND_STATUS_REG) | PCI_COMMAND_MASTER_ENABLE)); 434 435 if (pci_intr_map(pa, &ih)) { 436 aprint_error("%s: couldn't map interrupt\n", 437 sc->sc_dev.dv_xname); 438 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); 439 return; 440 } 441 442 intrstr = pci_intr_string(pa->pa_pc, ih); 443 sc->sc_ih = pci_intr_establish(pa->pa_pc, ih, IPL_AUDIO, emuxki_intr, 444 sc); 445 if (sc->sc_ih == NULL) { 446 aprint_error("%s: couldn't establish interrupt", 447 sc->sc_dev.dv_xname); 448 if (intrstr != NULL) 449 aprint_normal(" at %s", intrstr); 450 aprint_normal("\n"); 451 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); 452 return; 453 } 454 455 /* XXX it's unknown whether APS is made from Audigy as well */ 456 if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_CREATIVELABS_AUDIGY) { 457 sc->sc_type = EMUXKI_AUDIGY; 458 if (PCI_REVISION(pa->pa_class) == 0x04) { 459 sc->sc_type |= EMUXKI_AUDIGY2; 460 strlcpy(sc->sc_audv.name, "Audigy2", sizeof sc->sc_audv.name); 461 } else { 462 strlcpy(sc->sc_audv.name, "Audigy", sizeof sc->sc_audv.name); 463 } 464 } else if (pci_conf_read(pa->pa_pc, pa->pa_tag, 465 PCI_SUBSYS_ID_REG) == EMU_SUBSYS_APS) { 466 sc->sc_type = EMUXKI_APS; 467 strlcpy(sc->sc_audv.name, "E-mu APS", sizeof sc->sc_audv.name); 468 } else { 469 sc->sc_type = EMUXKI_SBLIVE; 470 strlcpy(sc->sc_audv.name, "SB Live!", sizeof sc->sc_audv.name); 471 } 472 snprintf(sc->sc_audv.version, sizeof sc->sc_audv.version, "0x%02x", 473 PCI_REVISION(pa->pa_class)); 474 strlcpy(sc->sc_audv.config, "emuxki", sizeof sc->sc_audv.config); 475 476 if (emuxki_scinit(sc) || emuxki_ac97_init(sc) || 477 (sc->sc_audev = audio_attach_mi(&emuxki_hw_if, sc, self)) == NULL) { 478 emuxki_pci_shutdown(sc); 479 return; 480 } 481 aprint_normal("%s: interrupting at %s\n", sc->sc_dev.dv_xname, intrstr); 482 #if 0 483 sc->rsourcectl.dev = 484 sc->codecif->vtbl->get_portnum_by_name(sc->codec_if, AudioCrecord, 485 AudioNsource, NULL); 486 sc->rsourcectl.cp = AUDIO_MIXER_ENUM; 487 #endif 488 } 489 490 static int 491 emuxki_detach(struct device *self, int flags) 492 { 493 struct emuxki_softc *sc; 494 495 sc = (struct emuxki_softc *)self; 496 if (sc->sc_audev != NULL) /* Test in case audio didn't attach */ 497 config_detach(sc->sc_audev, 0); 498 499 /* All voices should be stopped now but add some code here if not */ 500 501 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG, 502 EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK | 503 EMU_HCFG_MUTEBUTTONENABLE); 504 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE, 0); 505 506 emuxki_shutdown(sc); 507 508 emuxki_pci_shutdown(sc); 509 510 return 0; 511 } 512 513 514 /* Misc stuff relative to emu10k1 */ 515 516 static uint32_t 517 emuxki_rate_to_pitch(uint32_t rate) 518 { 519 static const uint32_t logMagTable[128] = { 520 0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3, 521 0x13aa2, 0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a, 522 0x2655d, 0x28ed5, 0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb, 523 0x381b6, 0x3a93d, 0x3d081, 0x3f782, 0x41e42, 0x444c1, 0x46b01, 524 0x49101, 0x4b6c4, 0x4dc49, 0x50191, 0x5269e, 0x54b6f, 0x57006, 525 0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7, 0x646ee, 0x66a00, 526 0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829, 0x759d4, 527 0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e, 528 0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20, 529 0x93d26, 0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec, 530 0xa11d8, 0xa2f9d, 0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241, 531 0xadf26, 0xafbe7, 0xb1885, 0xb3500, 0xb5157, 0xb6d8c, 0xb899f, 532 0xba58f, 0xbc15e, 0xbdd0c, 0xbf899, 0xc1404, 0xc2f50, 0xc4a7b, 533 0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c, 0xceaec, 0xd053f, 534 0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3, 0xdba4a, 535 0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3, 536 0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a, 537 0xf2c83, 0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57, 538 0xfd1a7, 0xfe8df 539 }; 540 static const uint8_t logSlopeTable[128] = { 541 0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58, 542 0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53, 543 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f, 544 0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b, 545 0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47, 546 0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44, 547 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41, 548 0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e, 549 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c, 550 0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 551 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37, 552 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35, 553 0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34, 554 0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32, 555 0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30, 556 0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f 557 }; 558 int8_t i; 559 560 if (rate == 0) 561 return 0; /* Bail out if no leading "1" */ 562 rate *= 11185; /* Scale 48000 to 0x20002380 */ 563 for (i = 31; i > 0; i--) { 564 if (rate & 0x80000000) { /* Detect leading "1" */ 565 return (((uint32_t) (i - 15) << 20) + 566 logMagTable[0x7f & (rate >> 24)] + 567 (0x7f & (rate >> 17)) * 568 logSlopeTable[0x7f & (rate >> 24)]); 569 } 570 rate <<= 1; 571 } 572 573 return 0; /* Should never reach this point */ 574 } 575 576 /* Emu10k1 Low level */ 577 578 static uint32_t 579 emuxki_read(struct emuxki_softc *sc, uint16_t chano, uint32_t reg) 580 { 581 uint32_t ptr, mask; 582 uint8_t size, offset; 583 int s; 584 585 mask = 0xffffffff; 586 offset = 0; 587 ptr = ((((u_int32_t) reg) << 16) & 588 (sc->sc_type & EMUXKI_AUDIGY ? 589 EMU_A_PTR_ADDR_MASK : EMU_PTR_ADDR_MASK)) | 590 (chano & EMU_PTR_CHNO_MASK); 591 if (reg & 0xff000000) { 592 size = (reg >> 24) & 0x3f; 593 offset = (reg >> 16) & 0x1f; 594 mask = ((1 << size) - 1) << offset; 595 } 596 597 s = splaudio(); 598 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_PTR, ptr); 599 ptr = (bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_DATA) & mask) 600 >> offset; 601 splx(s); 602 603 return ptr; 604 } 605 606 static void 607 emuxki_write(struct emuxki_softc *sc, uint16_t chano, 608 uint32_t reg, uint32_t data) 609 { 610 uint32_t ptr, mask; 611 uint8_t size, offset; 612 int s; 613 614 ptr = ((((u_int32_t) reg) << 16) & 615 (sc->sc_type & EMUXKI_AUDIGY ? 616 EMU_A_PTR_ADDR_MASK : EMU_PTR_ADDR_MASK)) | 617 (chano & EMU_PTR_CHNO_MASK); 618 if (reg & 0xff000000) { 619 size = (reg >> 24) & 0x3f; 620 offset = (reg >> 16) & 0x1f; 621 mask = ((1 << size) - 1) << offset; 622 data = ((data << offset) & mask) | 623 (emuxki_read(sc, chano, reg & 0xffff) & ~mask); 624 } 625 626 s = splaudio(); 627 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_PTR, ptr); 628 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_DATA, data); 629 splx(s); 630 } 631 632 /* Microcode should this go in /sys/dev/microcode ? */ 633 634 static void 635 emuxki_write_micro(struct emuxki_softc *sc, uint32_t pc, uint32_t data) 636 { 637 638 emuxki_write(sc, 0, 639 (sc->sc_type & EMUXKI_AUDIGY ? 640 EMU_A_MICROCODEBASE : EMU_MICROCODEBASE) + pc, 641 data); 642 } 643 644 static void 645 emuxki_dsp_addop(struct emuxki_softc *sc, uint16_t *pc, uint8_t op, 646 uint16_t r, uint16_t a, uint16_t x, uint16_t y) 647 { 648 649 if (sc->sc_type & EMUXKI_AUDIGY) { 650 emuxki_write_micro(sc, *pc << 1, 651 ((x << 12) & EMU_A_DSP_LOWORD_OPX_MASK) | 652 (y & EMU_A_DSP_LOWORD_OPY_MASK)); 653 emuxki_write_micro(sc, (*pc << 1) + 1, 654 ((op << 24) & EMU_A_DSP_HIWORD_OPCODE_MASK) | 655 ((r << 12) & EMU_A_DSP_HIWORD_RESULT_MASK) | 656 (a & EMU_A_DSP_HIWORD_OPA_MASK)); 657 } else { 658 emuxki_write_micro(sc, *pc << 1, 659 ((x << 10) & EMU_DSP_LOWORD_OPX_MASK) | 660 (y & EMU_DSP_LOWORD_OPY_MASK)); 661 emuxki_write_micro(sc, (*pc << 1) + 1, 662 ((op << 20) & EMU_DSP_HIWORD_OPCODE_MASK) | 663 ((r << 10) & EMU_DSP_HIWORD_RESULT_MASK) | 664 (a & EMU_DSP_HIWORD_OPA_MASK)); 665 } 666 (*pc)++; 667 } 668 669 /* init and shutdown */ 670 671 static void 672 emuxki_initfx(struct emuxki_softc *sc) 673 { 674 uint16_t pc; 675 676 /* Set all GPRs to 0 */ 677 for (pc = 0; pc < 256; pc++) 678 emuxki_write(sc, 0, EMU_DSP_GPR(pc), 0); 679 for (pc = 0; pc < 160; pc++) { 680 emuxki_write(sc, 0, EMU_TANKMEMDATAREGBASE + pc, 0); 681 emuxki_write(sc, 0, EMU_TANKMEMADDRREGBASE + pc, 0); 682 } 683 pc = 0; 684 685 if (sc->sc_type & EMUXKI_AUDIGY) { 686 /* AC97 Out (l/r) = AC97 In (l/r) + FX[0/1] * 4 */ 687 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 688 EMU_A_DSP_OUTL(EMU_A_DSP_OUT_A_FRONT), 689 EMU_A_DSP_CST(0), 690 EMU_DSP_FX(0), EMU_A_DSP_CST(4)); 691 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 692 EMU_A_DSP_OUTR(EMU_A_DSP_OUT_A_FRONT), 693 EMU_A_DSP_CST(0), 694 EMU_DSP_FX(1), EMU_A_DSP_CST(4)); 695 696 /* Rear channel OUT (l/r) = FX[2/3] * 4 */ 697 #if 0 698 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 699 EMU_A_DSP_OUTL(EMU_A_DSP_OUT_A_REAR), 700 EMU_A_DSP_OUTL(EMU_A_DSP_OUT_A_FRONT), 701 EMU_DSP_FX(0), EMU_A_DSP_CST(4)); 702 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 703 EMU_A_DSP_OUTR(EMU_A_DSP_OUT_A_REAR), 704 EMU_A_DSP_OUTR(EMU_A_DSP_OUT_A_FRONT), 705 EMU_DSP_FX(1), EMU_A_DSP_CST(4)); 706 #endif 707 /* ADC recording (l/r) = AC97 In (l/r) */ 708 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3, 709 EMU_A_DSP_OUTL(EMU_A_DSP_OUT_ADC), 710 EMU_A_DSP_INL(EMU_DSP_IN_AC97), 711 EMU_A_DSP_CST(0), EMU_A_DSP_CST(0)); 712 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3, 713 EMU_A_DSP_OUTR(EMU_A_DSP_OUT_ADC), 714 EMU_A_DSP_INR(EMU_DSP_IN_AC97), 715 EMU_A_DSP_CST(0), EMU_A_DSP_CST(0)); 716 717 /* zero out the rest of the microcode */ 718 while (pc < 512) 719 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3, 720 EMU_A_DSP_CST(0), EMU_A_DSP_CST(0), 721 EMU_A_DSP_CST(0), EMU_A_DSP_CST(0)); 722 723 emuxki_write(sc, 0, EMU_A_DBG, 0); /* Is it really necessary ? */ 724 } else { 725 /* AC97 Out (l/r) = AC97 In (l/r) + FX[0/1] * 4 */ 726 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 727 EMU_DSP_OUTL(EMU_DSP_OUT_A_FRONT), 728 EMU_DSP_CST(0), 729 EMU_DSP_FX(0), EMU_DSP_CST(4)); 730 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 731 EMU_DSP_OUTR(EMU_DSP_OUT_A_FRONT), 732 EMU_DSP_CST(0), 733 EMU_DSP_FX(1), EMU_DSP_CST(4)); 734 735 /* Rear channel OUT (l/r) = FX[2/3] * 4 */ 736 #if 0 737 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 738 EMU_DSP_OUTL(EMU_DSP_OUT_AD_REAR), 739 EMU_DSP_OUTL(EMU_DSP_OUT_A_FRONT), 740 EMU_DSP_FX(0), EMU_DSP_CST(4)); 741 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 742 EMU_DSP_OUTR(EMU_DSP_OUT_AD_REAR), 743 EMU_DSP_OUTR(EMU_DSP_OUT_A_FRONT), 744 EMU_DSP_FX(1), EMU_DSP_CST(4)); 745 #endif 746 /* ADC recording (l/r) = AC97 In (l/r) */ 747 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3, 748 EMU_DSP_OUTL(EMU_DSP_OUT_ADC), 749 EMU_DSP_INL(EMU_DSP_IN_AC97), 750 EMU_DSP_CST(0), EMU_DSP_CST(0)); 751 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3, 752 EMU_DSP_OUTR(EMU_DSP_OUT_ADC), 753 EMU_DSP_INR(EMU_DSP_IN_AC97), 754 EMU_DSP_CST(0), EMU_DSP_CST(0)); 755 756 /* zero out the rest of the microcode */ 757 while (pc < 512) 758 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3, 759 EMU_DSP_CST(0), EMU_DSP_CST(0), 760 EMU_DSP_CST(0), EMU_DSP_CST(0)); 761 762 emuxki_write(sc, 0, EMU_DBG, 0); /* Is it really necessary ? */ 763 } 764 } 765 766 static int 767 emuxki_init(struct emuxki_softc *sc) 768 { 769 uint16_t i; 770 uint32_t spcs, *ptb; 771 bus_addr_t silentpage; 772 773 /* disable any channel interrupt */ 774 emuxki_write(sc, 0, EMU_CLIEL, 0); 775 emuxki_write(sc, 0, EMU_CLIEH, 0); 776 emuxki_write(sc, 0, EMU_SOLEL, 0); 777 emuxki_write(sc, 0, EMU_SOLEH, 0); 778 779 /* Set recording buffers sizes to zero */ 780 emuxki_write(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE); 781 emuxki_write(sc, 0, EMU_MICBA, 0); 782 emuxki_write(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE); 783 emuxki_write(sc, 0, EMU_FXBA, 0); 784 emuxki_write(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE); 785 emuxki_write(sc, 0, EMU_ADCBA, 0); 786 787 if(sc->sc_type & EMUXKI_AUDIGY) { 788 emuxki_write(sc, 0, EMU_SPBYPASS, EMU_SPBYPASS_24_BITS); 789 emuxki_write(sc, 0, EMU_AC97SLOT, EMU_AC97SLOT_CENTER | EMU_AC97SLOT_LFE); 790 } 791 792 /* Initialize all channels to stopped and no effects */ 793 for (i = 0; i < EMU_NUMCHAN; i++) { 794 emuxki_write(sc, i, EMU_CHAN_DCYSUSV, 0); 795 emuxki_write(sc, i, EMU_CHAN_IP, 0); 796 emuxki_write(sc, i, EMU_CHAN_VTFT, 0xffff); 797 emuxki_write(sc, i, EMU_CHAN_CVCF, 0xffff); 798 emuxki_write(sc, i, EMU_CHAN_PTRX, 0); 799 emuxki_write(sc, i, EMU_CHAN_CPF, 0); 800 emuxki_write(sc, i, EMU_CHAN_CCR, 0); 801 emuxki_write(sc, i, EMU_CHAN_PSST, 0); 802 emuxki_write(sc, i, EMU_CHAN_DSL, 0x10); /* Why 16 ? */ 803 emuxki_write(sc, i, EMU_CHAN_CCCA, 0); 804 emuxki_write(sc, i, EMU_CHAN_Z1, 0); 805 emuxki_write(sc, i, EMU_CHAN_Z2, 0); 806 emuxki_write(sc, i, EMU_CHAN_FXRT, 0x32100000); 807 emuxki_write(sc, i, EMU_CHAN_ATKHLDM, 0); 808 emuxki_write(sc, i, EMU_CHAN_DCYSUSM, 0); 809 emuxki_write(sc, i, EMU_CHAN_IFATN, 0xffff); 810 emuxki_write(sc, i, EMU_CHAN_PEFE, 0); 811 emuxki_write(sc, i, EMU_CHAN_FMMOD, 0); 812 emuxki_write(sc, i, EMU_CHAN_TREMFRQ, 24); 813 emuxki_write(sc, i, EMU_CHAN_FM2FRQ2, 24); 814 emuxki_write(sc, i, EMU_CHAN_TEMPENV, 0); 815 816 /* these are last so OFF prevents writing */ 817 emuxki_write(sc, i, EMU_CHAN_LFOVAL2, 0); 818 emuxki_write(sc, i, EMU_CHAN_LFOVAL1, 0); 819 emuxki_write(sc, i, EMU_CHAN_ATKHLDV, 0); 820 emuxki_write(sc, i, EMU_CHAN_ENVVOL, 0); 821 emuxki_write(sc, i, EMU_CHAN_ENVVAL, 0); 822 } 823 824 /* set digital outputs format */ 825 spcs = (EMU_SPCS_CLKACCY_1000PPM | EMU_SPCS_SAMPLERATE_48 | 826 EMU_SPCS_CHANNELNUM_LEFT | EMU_SPCS_SOURCENUM_UNSPEC | 827 EMU_SPCS_GENERATIONSTATUS | 0x00001200 /* Cat code. */ | 828 0x00000000 /* IEC-958 Mode */ | EMU_SPCS_EMPHASIS_NONE | 829 EMU_SPCS_COPYRIGHT); 830 emuxki_write(sc, 0, EMU_SPCS0, spcs); 831 emuxki_write(sc, 0, EMU_SPCS1, spcs); 832 emuxki_write(sc, 0, EMU_SPCS2, spcs); 833 834 if(sc->sc_type & EMUXKI_AUDIGY2) { 835 emuxki_write(sc, 0, EMU_A2_SPDIF_SAMPLERATE, EMU_A2_SPDIF_UNKNOWN); 836 837 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A2_PTR, EMU_A2_SRCSEL); 838 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A2_DATA, 839 EMU_A2_SRCSEL_ENABLE_SPDIF | EMU_A2_SRCSEL_ENABLE_SRCMULTI); 840 841 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A2_PTR, EMU_A2_SRCMULTI); 842 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A2_DATA, EMU_A2_SRCMULTI_ENABLE_INPUT); 843 } 844 845 846 /* Let's play with sound processor */ 847 emuxki_initfx(sc); 848 849 /* Here is our Page Table */ 850 if ((sc->ptb = dmamem_alloc(sc->sc_dmat, 851 EMU_MAXPTE * sizeof(u_int32_t), 852 EMU_DMA_ALIGN, EMU_DMAMEM_NSEG, 853 M_DEVBUF, M_WAITOK)) == NULL) 854 return ENOMEM; 855 856 /* This is necessary unless you like Metallic noise... */ 857 if ((sc->silentpage = dmamem_alloc(sc->sc_dmat, EMU_PTESIZE, 858 EMU_DMA_ALIGN, EMU_DMAMEM_NSEG, M_DEVBUF, M_WAITOK))==NULL){ 859 dmamem_free(sc->ptb, M_DEVBUF); 860 return ENOMEM; 861 } 862 863 /* Zero out the silent page */ 864 /* This might not be always true, it might be 128 for 8bit channels */ 865 memset(KERNADDR(sc->silentpage), 0, DMASIZE(sc->silentpage)); 866 867 /* 868 * Set all the PTB Entries to the silent page We shift the physical 869 * address by one and OR it with the page number. I don't know what 870 * the ORed index is for, might be a very useful unused feature... 871 */ 872 silentpage = DMAADDR(sc->silentpage) << 1; 873 ptb = KERNADDR(sc->ptb); 874 for (i = 0; i < EMU_MAXPTE; i++) 875 ptb[i] = htole32(silentpage | i); 876 877 /* Write PTB address and set TCB to none */ 878 emuxki_write(sc, 0, EMU_PTB, DMAADDR(sc->ptb)); 879 emuxki_write(sc, 0, EMU_TCBS, 0); /* This means 16K TCB */ 880 emuxki_write(sc, 0, EMU_TCB, 0); /* No TCB use for now */ 881 882 /* 883 * Set channels MAPs to the silent page. 884 * I don't know what MAPs are for. 885 */ 886 silentpage |= EMU_CHAN_MAP_PTI_MASK; 887 for (i = 0; i < EMU_NUMCHAN; i++) { 888 emuxki_write(sc, i, EMU_CHAN_MAPA, silentpage); 889 emuxki_write(sc, i, EMU_CHAN_MAPB, silentpage); 890 sc->channel[i] = NULL; 891 } 892 893 /* Init voices list */ 894 LIST_INIT(&(sc->voices)); 895 896 /* Timer is stopped */ 897 sc->timerstate &= ~EMU_TIMER_STATE_ENABLED; 898 return 0; 899 } 900 901 static void 902 emuxki_shutdown(struct emuxki_softc *sc) 903 { 904 uint32_t i; 905 906 /* Disable any Channels interrupts */ 907 emuxki_write(sc, 0, EMU_CLIEL, 0); 908 emuxki_write(sc, 0, EMU_CLIEH, 0); 909 emuxki_write(sc, 0, EMU_SOLEL, 0); 910 emuxki_write(sc, 0, EMU_SOLEH, 0); 911 912 /* 913 * Should do some voice(stream) stopping stuff here, that's what will 914 * stop and deallocate all channels. 915 */ 916 917 /* Stop all channels */ 918 /* XXX This shouldn't be necessary, I'll remove once everything works */ 919 for (i = 0; i < EMU_NUMCHAN; i++) 920 emuxki_write(sc, i, EMU_CHAN_DCYSUSV, 0); 921 for (i = 0; i < EMU_NUMCHAN; i++) { 922 emuxki_write(sc, i, EMU_CHAN_VTFT, 0); 923 emuxki_write(sc, i, EMU_CHAN_CVCF, 0); 924 emuxki_write(sc, i, EMU_CHAN_PTRX, 0); 925 emuxki_write(sc, i, EMU_CHAN_CPF, 0); 926 } 927 928 /* 929 * Deallocate Emu10k1 caches and recording buffers. Again it will be 930 * removed because it will be done in voice shutdown. 931 */ 932 emuxki_write(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE); 933 emuxki_write(sc, 0, EMU_MICBA, 0); 934 emuxki_write(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE); 935 emuxki_write(sc, 0, EMU_FXBA, 0); 936 if(sc->sc_type & EMUXKI_AUDIGY) { 937 emuxki_write(sc, 0, EMU_A_FXWC1, 0); 938 emuxki_write(sc, 0, EMU_A_FXWC2, 0); 939 } else { 940 emuxki_write(sc, 0, EMU_FXWC, 0); 941 } 942 emuxki_write(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE); 943 emuxki_write(sc, 0, EMU_ADCBA, 0); 944 945 /* 946 * XXX I don't know yet how I will handle tank cache buffer, 947 * I don't even clearly know what it is for. 948 */ 949 emuxki_write(sc, 0, EMU_TCB, 0); /* 16K again */ 950 emuxki_write(sc, 0, EMU_TCBS, 0); 951 952 emuxki_write(sc, 0, EMU_DBG, 0x8000); /* necessary ? */ 953 954 dmamem_free(sc->silentpage, M_DEVBUF); 955 dmamem_free(sc->ptb, M_DEVBUF); 956 } 957 958 /* Emu10k1 Memory management */ 959 960 static struct emuxki_mem * 961 emuxki_mem_new(struct emuxki_softc *sc, int ptbidx, 962 size_t size, struct malloc_type *type, int flags) 963 { 964 struct emuxki_mem *mem; 965 966 if ((mem = malloc(sizeof(*mem), type, flags)) == NULL) 967 return NULL; 968 969 mem->ptbidx = ptbidx; 970 if ((mem->dmamem = dmamem_alloc(sc->sc_dmat, size, EMU_DMA_ALIGN, 971 EMU_DMAMEM_NSEG, type, flags)) == NULL) { 972 free(mem, type); 973 return NULL; 974 } 975 return mem; 976 } 977 978 static void 979 emuxki_mem_delete(struct emuxki_mem *mem, struct malloc_type *type) 980 { 981 982 dmamem_free(mem->dmamem, type); 983 free(mem, type); 984 } 985 986 static void * 987 emuxki_pmem_alloc(struct emuxki_softc *sc, size_t size, 988 struct malloc_type *type, int flags) 989 { 990 int i, j, s; 991 size_t numblocks; 992 struct emuxki_mem *mem; 993 uint32_t *ptb, silentpage; 994 995 ptb = KERNADDR(sc->ptb); 996 silentpage = DMAADDR(sc->silentpage) << 1; 997 numblocks = size / EMU_PTESIZE; 998 if (size % EMU_PTESIZE) 999 numblocks++; 1000 1001 for (i = 0; i < EMU_MAXPTE; i++) 1002 if ((le32toh(ptb[i]) & EMU_CHAN_MAP_PTE_MASK) == silentpage) { 1003 /* We look for a free PTE */ 1004 s = splaudio(); 1005 for (j = 0; j < numblocks; j++) 1006 if ((le32toh(ptb[i + j]) 1007 & EMU_CHAN_MAP_PTE_MASK) != silentpage) 1008 break; 1009 if (j == numblocks) { 1010 if ((mem = emuxki_mem_new(sc, i, 1011 size, type, flags)) == NULL) { 1012 splx(s); 1013 return NULL; 1014 } 1015 for (j = 0; j < numblocks; j++) 1016 ptb[i + j] = 1017 htole32((((DMAADDR(mem->dmamem) + 1018 j * EMU_PTESIZE)) << 1) | (i + j)); 1019 LIST_INSERT_HEAD(&(sc->mem), mem, next); 1020 splx(s); 1021 return (KERNADDR(mem->dmamem)); 1022 } else 1023 i += j; 1024 splx(s); 1025 } 1026 return NULL; 1027 } 1028 1029 static void * 1030 emuxki_rmem_alloc(struct emuxki_softc *sc, size_t size, 1031 struct malloc_type *type, int flags) 1032 { 1033 struct emuxki_mem *mem; 1034 int s; 1035 1036 mem = emuxki_mem_new(sc, EMU_RMEM, size, type, flags); 1037 if (mem == NULL) 1038 return NULL; 1039 1040 s = splaudio(); 1041 LIST_INSERT_HEAD(&(sc->mem), mem, next); 1042 splx(s); 1043 1044 return KERNADDR(mem->dmamem); 1045 } 1046 1047 /* 1048 * emuxki_channel_* : Channel management functions 1049 * emuxki_chanparms_* : Channel parameters modification functions 1050 */ 1051 1052 /* 1053 * is splaudio necessary here, can the same voice be manipulated by two 1054 * different threads at a time ? 1055 */ 1056 static void 1057 emuxki_chanparms_set_defaults(struct emuxki_channel *chan) 1058 { 1059 1060 chan->fxsend.a.level = chan->fxsend.b.level = 1061 chan->fxsend.c.level = chan->fxsend.d.level = 1062 /* for audigy */ 1063 chan->fxsend.e.level = chan->fxsend.f.level = 1064 chan->fxsend.g.level = chan->fxsend.h.level = 1065 chan->voice->sc->sc_type & EMUXKI_AUDIGY ? 1066 0xc0 : 0xff; /* not max */ 1067 1068 chan->fxsend.a.dest = 0x0; 1069 chan->fxsend.b.dest = 0x1; 1070 chan->fxsend.c.dest = 0x2; 1071 chan->fxsend.d.dest = 0x3; 1072 /* for audigy */ 1073 chan->fxsend.e.dest = 0x4; 1074 chan->fxsend.f.dest = 0x5; 1075 chan->fxsend.g.dest = 0x6; 1076 chan->fxsend.h.dest = 0x7; 1077 1078 chan->pitch.initial = 0x0000; /* shouldn't it be 0xE000 ? */ 1079 chan->pitch.current = 0x0000; /* should it be 0x0400 */ 1080 chan->pitch.target = 0x0000; /* the unity pitch shift ? */ 1081 chan->pitch.envelope_amount = 0x00; /* none */ 1082 1083 chan->initial_attenuation = 0x00; /* no attenuation */ 1084 chan->volume.current = 0x0000; /* no volume */ 1085 chan->volume.target = 0xffff; 1086 chan->volume.envelope.current_state = 0x8000; /* 0 msec delay */ 1087 chan->volume.envelope.hold_time = 0x7f; /* 0 msec */ 1088 chan->volume.envelope.attack_time = 0x7F; /* 5.5msec */ 1089 chan->volume.envelope.sustain_level = 0x7F; /* full */ 1090 chan->volume.envelope.decay_time = 0x7F; /* 22msec */ 1091 1092 chan->filter.initial_cutoff_frequency = 0xff; /* no filter */ 1093 chan->filter.current_cutoff_frequency = 0xffff; /* no filtering */ 1094 chan->filter.target_cutoff_frequency = 0xffff; /* no filtering */ 1095 chan->filter.lowpass_resonance_height = 0x0; 1096 chan->filter.interpolation_ROM = 0x1; /* full band */ 1097 chan->filter.envelope_amount = 0x7f; /* none */ 1098 chan->filter.LFO_modulation_depth = 0x00; /* none */ 1099 1100 chan->loop.start = 0x000000; 1101 chan->loop.end = 0x000010; /* Why ? */ 1102 1103 chan->modulation.envelope.current_state = 0x8000; 1104 chan->modulation.envelope.hold_time = 0x00; /* 127 better ? */ 1105 chan->modulation.envelope.attack_time = 0x00; /* infinite */ 1106 chan->modulation.envelope.sustain_level = 0x00; /* off */ 1107 chan->modulation.envelope.decay_time = 0x7f; /* 22 msec */ 1108 chan->modulation.LFO_state = 0x8000; 1109 1110 chan->vibrato_LFO.state = 0x8000; 1111 chan->vibrato_LFO.modulation_depth = 0x00; /* none */ 1112 chan->vibrato_LFO.vibrato_depth = 0x00; 1113 chan->vibrato_LFO.frequency = 0x00; /* Why set to 24 when 1114 * initialized ? */ 1115 1116 chan->tremolo_depth = 0x00; 1117 } 1118 1119 /* only call it at splaudio */ 1120 static struct emuxki_channel * 1121 emuxki_channel_new(struct emuxki_voice *voice, u_int8_t num) 1122 { 1123 struct emuxki_channel *chan; 1124 1125 chan = malloc(sizeof(struct emuxki_channel), M_DEVBUF, M_WAITOK); 1126 if (chan == NULL) 1127 return NULL; 1128 1129 chan->voice = voice; 1130 chan->num = num; 1131 emuxki_chanparms_set_defaults(chan); 1132 chan->voice->sc->channel[num] = chan; 1133 return chan; 1134 } 1135 1136 /* only call it at splaudio */ 1137 static void 1138 emuxki_channel_delete(struct emuxki_channel *chan) 1139 { 1140 1141 chan->voice->sc->channel[chan->num] = NULL; 1142 free(chan, M_DEVBUF); 1143 } 1144 1145 static void 1146 emuxki_channel_set_fxsend(struct emuxki_channel *chan, 1147 struct emuxki_chanparms_fxsend *fxsend) 1148 { 1149 /* Could do a memcpy ...*/ 1150 chan->fxsend.a.level = fxsend->a.level; 1151 chan->fxsend.b.level = fxsend->b.level; 1152 chan->fxsend.c.level = fxsend->c.level; 1153 chan->fxsend.d.level = fxsend->d.level; 1154 chan->fxsend.a.dest = fxsend->a.dest; 1155 chan->fxsend.b.dest = fxsend->b.dest; 1156 chan->fxsend.c.dest = fxsend->c.dest; 1157 chan->fxsend.d.dest = fxsend->d.dest; 1158 1159 /* for audigy */ 1160 chan->fxsend.e.level = fxsend->e.level; 1161 chan->fxsend.f.level = fxsend->f.level; 1162 chan->fxsend.g.level = fxsend->g.level; 1163 chan->fxsend.h.level = fxsend->h.level; 1164 chan->fxsend.e.dest = fxsend->e.dest; 1165 chan->fxsend.f.dest = fxsend->f.dest; 1166 chan->fxsend.g.dest = fxsend->g.dest; 1167 chan->fxsend.h.dest = fxsend->h.dest; 1168 } 1169 1170 static void 1171 emuxki_channel_set_srate(struct emuxki_channel *chan, uint32_t srate) 1172 { 1173 1174 chan->pitch.target = (srate << 8) / 375; 1175 chan->pitch.target = (chan->pitch.target >> 1) + 1176 (chan->pitch.target & 1); 1177 chan->pitch.target &= 0xffff; 1178 chan->pitch.current = chan->pitch.target; 1179 chan->pitch.initial = 1180 (emuxki_rate_to_pitch(srate) >> 8) & EMU_CHAN_IP_MASK; 1181 } 1182 1183 /* voice params must be set before calling this */ 1184 static void 1185 emuxki_channel_set_bufparms(struct emuxki_channel *chan, 1186 uint32_t start, uint32_t end) 1187 { 1188 1189 chan->loop.start = start & EMU_CHAN_PSST_LOOPSTARTADDR_MASK; 1190 chan->loop.end = end & EMU_CHAN_DSL_LOOPENDADDR_MASK; 1191 } 1192 1193 static void 1194 emuxki_channel_commit_fx(struct emuxki_channel *chan) 1195 { 1196 struct emuxki_softc *sc; 1197 u_int8_t chano; 1198 1199 sc = chan->voice->sc; 1200 chano = chan->num; 1201 if(sc->sc_type & EMUXKI_AUDIGY) { 1202 emuxki_write(sc, chano, EMU_A_CHAN_FXRT1, 1203 (chan->fxsend.d.dest << 24) | 1204 (chan->fxsend.c.dest << 16) | 1205 (chan->fxsend.b.dest << 8) | 1206 (chan->fxsend.a.dest)); 1207 emuxki_write(sc, chano, EMU_A_CHAN_FXRT2, 1208 (chan->fxsend.h.dest << 24) | 1209 (chan->fxsend.g.dest << 16) | 1210 (chan->fxsend.f.dest << 8) | 1211 (chan->fxsend.e.dest)); 1212 emuxki_write(sc, chano, EMU_A_CHAN_SENDAMOUNTS, 1213 (chan->fxsend.e.level << 24) | 1214 (chan->fxsend.f.level << 16) | 1215 (chan->fxsend.g.level << 8) | 1216 (chan->fxsend.h.level)); 1217 } else { 1218 emuxki_write(sc, chano, EMU_CHAN_FXRT, 1219 (chan->fxsend.d.dest << 28) | 1220 (chan->fxsend.c.dest << 24) | 1221 (chan->fxsend.b.dest << 20) | 1222 (chan->fxsend.a.dest << 16)); 1223 } 1224 1225 emuxki_write(sc, chano, 0x10000000 | EMU_CHAN_PTRX, 1226 (chan->fxsend.a.level << 8) | chan->fxsend.b.level); 1227 emuxki_write(sc, chano, EMU_CHAN_DSL, 1228 (chan->fxsend.d.level << 24) | chan->loop.end); 1229 emuxki_write(sc, chano, EMU_CHAN_PSST, 1230 (chan->fxsend.c.level << 24) | chan->loop.start); 1231 } 1232 1233 static void 1234 emuxki_channel_commit_parms(struct emuxki_channel *chan) 1235 { 1236 struct emuxki_voice *voice; 1237 struct emuxki_softc *sc; 1238 uint32_t start, mapval; 1239 uint8_t chano; 1240 int s; 1241 1242 voice = chan->voice; 1243 sc = voice->sc; 1244 chano = chan->num; 1245 start = chan->loop.start + 1246 (voice->stereo ? 28 : 30) * (voice->b16 + 1); 1247 mapval = DMAADDR(sc->silentpage) << 1 | EMU_CHAN_MAP_PTI_MASK; 1248 1249 s = splaudio(); 1250 emuxki_write(sc, chano, EMU_CHAN_CPF_STEREO, voice->stereo); 1251 1252 emuxki_channel_commit_fx(chan); 1253 1254 emuxki_write(sc, chano, EMU_CHAN_CCCA, 1255 (chan->filter.lowpass_resonance_height << 28) | 1256 (chan->filter.interpolation_ROM << 25) | 1257 (voice->b16 ? 0 : EMU_CHAN_CCCA_8BITSELECT) | start); 1258 emuxki_write(sc, chano, EMU_CHAN_Z1, 0); 1259 emuxki_write(sc, chano, EMU_CHAN_Z2, 0); 1260 emuxki_write(sc, chano, EMU_CHAN_MAPA, mapval); 1261 emuxki_write(sc, chano, EMU_CHAN_MAPB, mapval); 1262 emuxki_write(sc, chano, EMU_CHAN_CVCF_CURRFILTER, 1263 chan->filter.current_cutoff_frequency); 1264 emuxki_write(sc, chano, EMU_CHAN_VTFT_FILTERTARGET, 1265 chan->filter.target_cutoff_frequency); 1266 emuxki_write(sc, chano, EMU_CHAN_ATKHLDM, 1267 (chan->modulation.envelope.hold_time << 8) | 1268 chan->modulation.envelope.attack_time); 1269 emuxki_write(sc, chano, EMU_CHAN_DCYSUSM, 1270 (chan->modulation.envelope.sustain_level << 8) | 1271 chan->modulation.envelope.decay_time); 1272 emuxki_write(sc, chano, EMU_CHAN_LFOVAL1, 1273 chan->modulation.LFO_state); 1274 emuxki_write(sc, chano, EMU_CHAN_LFOVAL2, 1275 chan->vibrato_LFO.state); 1276 emuxki_write(sc, chano, EMU_CHAN_FMMOD, 1277 (chan->vibrato_LFO.modulation_depth << 8) | 1278 chan->filter.LFO_modulation_depth); 1279 emuxki_write(sc, chano, EMU_CHAN_TREMFRQ, 1280 (chan->tremolo_depth << 8)); 1281 emuxki_write(sc, chano, EMU_CHAN_FM2FRQ2, 1282 (chan->vibrato_LFO.vibrato_depth << 8) | 1283 chan->vibrato_LFO.frequency); 1284 emuxki_write(sc, chano, EMU_CHAN_ENVVAL, 1285 chan->modulation.envelope.current_state); 1286 emuxki_write(sc, chano, EMU_CHAN_ATKHLDV, 1287 (chan->volume.envelope.hold_time << 8) | 1288 chan->volume.envelope.attack_time); 1289 emuxki_write(sc, chano, EMU_CHAN_ENVVOL, 1290 chan->volume.envelope.current_state); 1291 emuxki_write(sc, chano, EMU_CHAN_PEFE, 1292 (chan->pitch.envelope_amount << 8) | 1293 chan->filter.envelope_amount); 1294 splx(s); 1295 } 1296 1297 static void 1298 emuxki_channel_start(struct emuxki_channel *chan) 1299 { 1300 struct emuxki_voice *voice; 1301 struct emuxki_softc *sc; 1302 u_int8_t cache_sample, cache_invalid_size, chano; 1303 u_int32_t sample; 1304 int s; 1305 1306 voice = chan->voice; 1307 sc = voice->sc; 1308 chano = chan->num; 1309 cache_sample = voice->stereo ? 4 : 2; 1310 sample = voice->b16 ? 0x00000000 : 0x80808080; 1311 cache_invalid_size = (voice->stereo ? 28 : 30) * (voice->b16 + 1); 1312 1313 s = splaudio(); 1314 while (cache_sample--) { 1315 emuxki_write(sc, chano, EMU_CHAN_CD0 + cache_sample, 1316 sample); 1317 } 1318 emuxki_write(sc, chano, EMU_CHAN_CCR_CACHEINVALIDSIZE, 0); 1319 emuxki_write(sc, chano, EMU_CHAN_CCR_READADDRESS, 64); 1320 emuxki_write(sc, chano, EMU_CHAN_CCR_CACHEINVALIDSIZE, 1321 cache_invalid_size); 1322 emuxki_write(sc, chano, EMU_CHAN_IFATN, 1323 (chan->filter.target_cutoff_frequency << 8) | 1324 chan->initial_attenuation); 1325 emuxki_write(sc, chano, EMU_CHAN_VTFT_VOLUMETARGET, 1326 chan->volume.target); 1327 emuxki_write(sc, chano, EMU_CHAN_CVCF_CURRVOL, 1328 chan->volume.current); 1329 emuxki_write(sc, 0, 1330 EMU_MKSUBREG(1, chano, EMU_SOLEL + (chano >> 5)), 1331 0); /* Clear stop on loop */ 1332 emuxki_write(sc, 0, 1333 EMU_MKSUBREG(1, chano, EMU_CLIEL + (chano >> 5)), 1334 0); /* Clear loop interrupt */ 1335 emuxki_write(sc, chano, EMU_CHAN_DCYSUSV, 1336 (chan->volume.envelope.sustain_level << 8) | 1337 chan->volume.envelope.decay_time); 1338 emuxki_write(sc, chano, EMU_CHAN_PTRX_PITCHTARGET, 1339 chan->pitch.target); 1340 emuxki_write(sc, chano, EMU_CHAN_CPF_PITCH, 1341 chan->pitch.current); 1342 emuxki_write(sc, chano, EMU_CHAN_IP, chan->pitch.initial); 1343 1344 splx(s); 1345 } 1346 1347 static void 1348 emuxki_channel_stop(struct emuxki_channel *chan) 1349 { 1350 struct emuxki_softc *sc; 1351 int s; 1352 u_int8_t chano; 1353 1354 sc = chan->voice->sc; 1355 chano = chan->num; 1356 s = splaudio(); 1357 emuxki_write(sc, chano, EMU_CHAN_PTRX_PITCHTARGET, 0); 1358 emuxki_write(sc, chano, EMU_CHAN_CPF_PITCH, 0); 1359 emuxki_write(sc, chano, EMU_CHAN_IFATN_ATTENUATION, 0xff); 1360 emuxki_write(sc, chano, EMU_CHAN_VTFT_VOLUMETARGET, 0); 1361 emuxki_write(sc, chano, EMU_CHAN_CVCF_CURRVOL, 0); 1362 emuxki_write(sc, chano, EMU_CHAN_IP, 0); 1363 splx(s); 1364 } 1365 1366 /* 1367 * Voices management 1368 * emuxki_voice_dataloc : use(play or rec) independent dataloc union helpers 1369 * emuxki_voice_channel_* : play part of dataloc union helpers 1370 * emuxki_voice_recsrc_* : rec part of dataloc union helpers 1371 */ 1372 1373 /* Allocate channels for voice in case of play voice */ 1374 static int 1375 emuxki_voice_channel_create(struct emuxki_voice *voice) 1376 { 1377 struct emuxki_channel **channel; 1378 int s; 1379 uint8_t i, stereo; 1380 1381 channel = voice->sc->channel; 1382 stereo = voice->stereo; 1383 for (i = 0; i < EMU_NUMCHAN - stereo; i += stereo + 1) { 1384 if ((stereo && (channel[i + 1] != NULL)) || 1385 (channel[i] != NULL)) /* Looking for free channels */ 1386 continue; 1387 s = splaudio(); 1388 if (stereo) { 1389 voice->dataloc.chan[1] = 1390 emuxki_channel_new(voice, i + 1); 1391 if (voice->dataloc.chan[1] == NULL) { 1392 splx(s); 1393 return ENOMEM; 1394 } 1395 } 1396 voice->dataloc.chan[0] = emuxki_channel_new(voice, i); 1397 if (voice->dataloc.chan[0] == NULL) { 1398 if (stereo) { 1399 emuxki_channel_delete(voice->dataloc.chan[1]); 1400 voice->dataloc.chan[1] = NULL; 1401 } 1402 splx(s); 1403 return ENOMEM; 1404 } 1405 splx(s); 1406 return 0; 1407 } 1408 return EAGAIN; 1409 } 1410 1411 /* When calling this function we assume no one can access the voice */ 1412 static void 1413 emuxki_voice_channel_destroy(struct emuxki_voice *voice) 1414 { 1415 1416 emuxki_channel_delete(voice->dataloc.chan[0]); 1417 voice->dataloc.chan[0] = NULL; 1418 if (voice->stereo) 1419 emuxki_channel_delete(voice->dataloc.chan[1]); 1420 voice->dataloc.chan[1] = NULL; 1421 } 1422 1423 /* 1424 * Will come back when used in voice_dataloc_create 1425 */ 1426 static int 1427 emuxki_recsrc_reserve(struct emuxki_voice *voice, emuxki_recsrc_t source) 1428 { 1429 1430 if (source < 0 || source >= EMU_NUMRECSRCS) { 1431 #ifdef EMUXKI_DEBUG 1432 printf("Tried to reserve invalid source: %d\n", source); 1433 #endif 1434 return EINVAL; 1435 } 1436 if (voice->sc->recsrc[source] == voice) 1437 return 0; /* XXX */ 1438 if (voice->sc->recsrc[source] != NULL) 1439 return EBUSY; 1440 voice->sc->recsrc[source] = voice; 1441 return 0; 1442 } 1443 1444 /* When calling this function we assume the voice is stopped */ 1445 static void 1446 emuxki_voice_recsrc_release(struct emuxki_softc *sc, emuxki_recsrc_t source) 1447 { 1448 1449 sc->recsrc[source] = NULL; 1450 } 1451 1452 static int 1453 emuxki_voice_dataloc_create(struct emuxki_voice *voice) 1454 { 1455 int error; 1456 1457 if (voice->use & EMU_VOICE_USE_PLAY) { 1458 if ((error = emuxki_voice_channel_create(voice))) 1459 return error; 1460 } else { 1461 if ((error = 1462 emuxki_recsrc_reserve(voice, voice->dataloc.source))) 1463 return error; 1464 } 1465 return 0; 1466 } 1467 1468 static void 1469 emuxki_voice_dataloc_destroy(struct emuxki_voice *voice) 1470 { 1471 1472 if (voice->use & EMU_VOICE_USE_PLAY) { 1473 if (voice->dataloc.chan[0] != NULL) 1474 emuxki_voice_channel_destroy(voice); 1475 } else { 1476 if (voice->dataloc.source != EMU_RECSRC_NOTSET) { 1477 emuxki_voice_recsrc_release(voice->sc, 1478 voice->dataloc.source); 1479 voice->dataloc.source = EMU_RECSRC_NOTSET; 1480 } 1481 } 1482 } 1483 1484 static struct emuxki_voice * 1485 emuxki_voice_new(struct emuxki_softc *sc, uint8_t use) 1486 { 1487 struct emuxki_voice *voice; 1488 int s; 1489 1490 s = splaudio(); 1491 voice = sc->lvoice; 1492 sc->lvoice = NULL; 1493 splx(s); 1494 1495 if (!voice) { 1496 if (!(voice = malloc(sizeof(*voice), M_DEVBUF, M_WAITOK))) 1497 return NULL; 1498 } else if (voice->use != use) 1499 emuxki_voice_dataloc_destroy(voice); 1500 else 1501 goto skip_initialize; 1502 1503 voice->sc = sc; 1504 voice->state = !EMU_VOICE_STATE_STARTED; 1505 voice->stereo = EMU_VOICE_STEREO_NOTSET; 1506 voice->b16 = 0; 1507 voice->sample_rate = 0; 1508 if (use & EMU_VOICE_USE_PLAY) 1509 voice->dataloc.chan[0] = voice->dataloc.chan[1] = NULL; 1510 else 1511 voice->dataloc.source = EMU_RECSRC_NOTSET; 1512 voice->buffer = NULL; 1513 voice->blksize = 0; 1514 voice->trigblk = 0; 1515 voice->blkmod = 0; 1516 voice->inth = NULL; 1517 voice->inthparam = NULL; 1518 voice->use = use; 1519 1520 skip_initialize: 1521 s = splaudio(); 1522 LIST_INSERT_HEAD((&sc->voices), voice, next); 1523 splx(s); 1524 1525 return voice; 1526 } 1527 1528 static void 1529 emuxki_voice_delete(struct emuxki_voice *voice) 1530 { 1531 struct emuxki_softc *sc; 1532 struct emuxki_voice *lvoice; 1533 int s; 1534 1535 sc = voice->sc; 1536 if (voice->state & EMU_VOICE_STATE_STARTED) 1537 emuxki_voice_halt(voice); 1538 1539 s = splaudio(); 1540 LIST_REMOVE(voice, next); 1541 lvoice = sc->lvoice; 1542 sc->lvoice = voice; 1543 splx(s); 1544 1545 if (lvoice) { 1546 emuxki_voice_dataloc_destroy(lvoice); 1547 free(lvoice, M_DEVBUF); 1548 } 1549 } 1550 1551 static int 1552 emuxki_voice_set_stereo(struct emuxki_voice *voice, uint8_t stereo) 1553 { 1554 int error; 1555 emuxki_recsrc_t source; 1556 struct emuxki_chanparms_fxsend fxsend; 1557 1558 source = 0; /* XXX: gcc */ 1559 if (! (voice->use & EMU_VOICE_USE_PLAY)) 1560 source = voice->dataloc.source; 1561 emuxki_voice_dataloc_destroy(voice); 1562 if (! (voice->use & EMU_VOICE_USE_PLAY)) 1563 voice->dataloc.source = source; 1564 voice->stereo = stereo; 1565 if ((error = emuxki_voice_dataloc_create(voice))) 1566 return error; 1567 if (voice->use & EMU_VOICE_USE_PLAY) { 1568 fxsend.a.dest = 0x0; 1569 fxsend.b.dest = 0x1; 1570 fxsend.c.dest = 0x2; 1571 fxsend.d.dest = 0x3; 1572 /* for audigy */ 1573 fxsend.e.dest = 0x4; 1574 fxsend.f.dest = 0x5; 1575 fxsend.g.dest = 0x6; 1576 fxsend.h.dest = 0x7; 1577 if (voice->stereo) { 1578 fxsend.a.level = fxsend.c.level = 0xc0; 1579 fxsend.b.level = fxsend.d.level = 0x00; 1580 fxsend.e.level = fxsend.g.level = 0xc0; 1581 fxsend.f.level = fxsend.h.level = 0x00; 1582 emuxki_channel_set_fxsend(voice->dataloc.chan[0], 1583 &fxsend); 1584 fxsend.a.level = fxsend.c.level = 0x00; 1585 fxsend.b.level = fxsend.d.level = 0xc0; 1586 fxsend.e.level = fxsend.g.level = 0x00; 1587 fxsend.f.level = fxsend.h.level = 0xc0; 1588 emuxki_channel_set_fxsend(voice->dataloc.chan[1], 1589 &fxsend); 1590 } /* No else : default is good for mono */ 1591 } 1592 return 0; 1593 } 1594 1595 static int 1596 emuxki_voice_set_srate(struct emuxki_voice *voice, uint32_t srate) 1597 { 1598 1599 if (voice->use & EMU_VOICE_USE_PLAY) { 1600 if ((srate < 4000) || (srate > 48000)) 1601 return EINVAL; 1602 voice->sample_rate = srate; 1603 emuxki_channel_set_srate(voice->dataloc.chan[0], srate); 1604 if (voice->stereo) 1605 emuxki_channel_set_srate(voice->dataloc.chan[1], 1606 srate); 1607 } else { 1608 if ((srate < 8000) || (srate > 48000)) 1609 return EINVAL; 1610 voice->sample_rate = srate; 1611 if (emuxki_voice_adc_rate(voice) < 0) { 1612 voice->sample_rate = 0; 1613 return EINVAL; 1614 } 1615 } 1616 return 0; 1617 } 1618 1619 static int 1620 emuxki_voice_set_audioparms(struct emuxki_voice *voice, uint8_t stereo, 1621 uint8_t b16, uint32_t srate) 1622 { 1623 int error; 1624 1625 if (voice->stereo == stereo && voice->b16 == b16 && 1626 voice->sample_rate == srate) 1627 return 0; 1628 1629 #ifdef EMUXKI_DEBUG 1630 printf("Setting %s voice params : %s, %u bits, %u Hz\n", 1631 (voice->use & EMU_VOICE_USE_PLAY) ? "play" : "record", 1632 stereo ? "stereo" : "mono", (b16 + 1) * 8, srate); 1633 #endif 1634 error = 0; 1635 if (voice->stereo != stereo) { 1636 if ((error = emuxki_voice_set_stereo(voice, stereo))) 1637 return error; 1638 } 1639 voice->b16 = b16; 1640 if (voice->sample_rate != srate) 1641 error = emuxki_voice_set_srate(voice, srate); 1642 return error; 1643 } 1644 1645 /* voice audio parms (see just before) must be set prior to this */ 1646 static int 1647 emuxki_voice_set_bufparms(struct emuxki_voice *voice, void *ptr, 1648 uint32_t bufsize, uint16_t blksize) 1649 { 1650 struct emuxki_mem *mem; 1651 struct emuxki_channel **chan; 1652 uint32_t start, end; 1653 uint8_t sample_size; 1654 int idx; 1655 int error; 1656 1657 error = EFAULT; 1658 LIST_FOREACH(mem, &voice->sc->mem, next) { 1659 if (KERNADDR(mem->dmamem) != ptr) 1660 continue; 1661 1662 voice->buffer = mem; 1663 sample_size = (voice->b16 + 1) * (voice->stereo + 1); 1664 voice->trigblk = 0; /* This shouldn't be needed */ 1665 voice->blkmod = bufsize / blksize; 1666 if (bufsize % blksize) /* This should not happen */ 1667 voice->blkmod++; 1668 error = 0; 1669 1670 if (voice->use & EMU_VOICE_USE_PLAY) { 1671 voice->blksize = blksize / sample_size; 1672 chan = voice->dataloc.chan; 1673 start = mem->ptbidx << 12; 1674 end = start + bufsize / sample_size; 1675 emuxki_channel_set_bufparms(chan[0], 1676 start, end); 1677 if (voice->stereo) 1678 emuxki_channel_set_bufparms(chan[1], 1679 start, end); 1680 voice->timerate = (uint32_t) 48000 * 1681 voice->blksize / voice->sample_rate; 1682 if (voice->timerate < 5) 1683 error = EINVAL; 1684 } else { 1685 voice->blksize = blksize; 1686 for(idx = sizeof(emuxki_recbuf_sz) / 1687 sizeof(emuxki_recbuf_sz[0]); --idx >= 0;) 1688 if (emuxki_recbuf_sz[idx] == bufsize) 1689 break; 1690 if (idx < 0) { 1691 #ifdef EMUXKI_DEBUG 1692 printf("Invalid bufsize: %d\n", bufsize); 1693 #endif 1694 return EINVAL; 1695 } 1696 emuxki_write(voice->sc, 0, 1697 emuxki_recsrc_szreg[voice->dataloc.source], idx); 1698 emuxki_write(voice->sc, 0, 1699 emuxki_recsrc_bufaddrreg[voice->dataloc.source], 1700 DMAADDR(mem->dmamem)); 1701 1702 /* Use timer to emulate DMA completion interrupt */ 1703 voice->timerate = (u_int32_t) 48000 * blksize / 1704 (voice->sample_rate * sample_size); 1705 if (voice->timerate < 5) { 1706 #ifdef EMUXKI_DEBUG 1707 printf("Invalid timerate: %d, blksize %d\n", 1708 voice->timerate, blksize); 1709 #endif 1710 error = EINVAL; 1711 } 1712 } 1713 1714 break; 1715 } 1716 1717 return error; 1718 } 1719 1720 static void 1721 emuxki_voice_commit_parms(struct emuxki_voice *voice) 1722 { 1723 if (voice->use & EMU_VOICE_USE_PLAY) { 1724 emuxki_channel_commit_parms(voice->dataloc.chan[0]); 1725 if (voice->stereo) 1726 emuxki_channel_commit_parms(voice->dataloc.chan[1]); 1727 } 1728 } 1729 1730 static uint32_t 1731 emuxki_voice_curaddr(struct emuxki_voice *voice) 1732 { 1733 int idxreg; 1734 1735 /* XXX different semantics in these cases */ 1736 if (voice->use & EMU_VOICE_USE_PLAY) { 1737 /* returns number of samples (an l/r pair counts 1) */ 1738 return emuxki_read(voice->sc, 1739 voice->dataloc.chan[0]->num, EMU_CHAN_CCCA_CURRADDR) - 1740 voice->dataloc.chan[0]->loop.start; 1741 } else { 1742 idxreg = 0; 1743 /* returns number of bytes */ 1744 switch (voice->dataloc.source) { 1745 case EMU_RECSRC_MIC: 1746 idxreg = (voice->sc->sc_type & EMUXKI_AUDIGY) ? 1747 EMU_A_MICIDX : EMU_MICIDX; 1748 break; 1749 case EMU_RECSRC_ADC: 1750 idxreg = (voice->sc->sc_type & EMUXKI_AUDIGY) ? 1751 EMU_A_ADCIDX : EMU_ADCIDX; 1752 break; 1753 case EMU_RECSRC_FX: 1754 idxreg = EMU_FXIDX; 1755 break; 1756 default: 1757 #ifdef EMUXKI_DEBUG 1758 printf("emu: bad recording source!\n"); 1759 #endif 1760 break; 1761 } 1762 return emuxki_read(voice->sc, 0, EMU_RECIDX(idxreg) 1763 & EMU_RECIDX_MASK); 1764 } 1765 return 0; 1766 } 1767 1768 static void 1769 emuxki_resched_timer(struct emuxki_softc *sc) 1770 { 1771 struct emuxki_voice *voice; 1772 uint16_t timerate; 1773 uint8_t active; 1774 int s; 1775 1776 timerate = 1024; 1777 active = 0; 1778 s = splaudio(); 1779 LIST_FOREACH(voice, &sc->voices, next) { 1780 if ((voice->state & EMU_VOICE_STATE_STARTED) == 0) 1781 continue; 1782 active = 1; 1783 if (voice->timerate < timerate) 1784 timerate = voice->timerate; 1785 } 1786 1787 if (timerate & ~EMU_TIMER_RATE_MASK) 1788 timerate = 0; 1789 bus_space_write_2(sc->sc_iot, sc->sc_ioh, EMU_TIMER, timerate); 1790 if (!active && (sc->timerstate & EMU_TIMER_STATE_ENABLED)) { 1791 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE, 1792 bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_INTE) & 1793 ~EMU_INTE_INTERTIMERENB); 1794 sc->timerstate &= ~EMU_TIMER_STATE_ENABLED; 1795 } else if (active && !(sc->timerstate & EMU_TIMER_STATE_ENABLED)) { 1796 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE, 1797 bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_INTE) | 1798 EMU_INTE_INTERTIMERENB); 1799 sc->timerstate |= EMU_TIMER_STATE_ENABLED; 1800 } 1801 splx(s); 1802 } 1803 1804 static int 1805 emuxki_voice_adc_rate(struct emuxki_voice *voice) 1806 { 1807 1808 switch(voice->sample_rate) { 1809 case 48000: 1810 return EMU_ADCCR_SAMPLERATE_48; 1811 break; 1812 case 44100: 1813 return EMU_ADCCR_SAMPLERATE_44; 1814 break; 1815 case 32000: 1816 return EMU_ADCCR_SAMPLERATE_32; 1817 break; 1818 case 24000: 1819 return EMU_ADCCR_SAMPLERATE_24; 1820 break; 1821 case 22050: 1822 return EMU_ADCCR_SAMPLERATE_22; 1823 break; 1824 case 16000: 1825 return EMU_ADCCR_SAMPLERATE_16; 1826 break; 1827 case 12000: 1828 if(voice->sc->sc_type & EMUXKI_AUDIGY) 1829 return EMU_A_ADCCR_SAMPLERATE_12; 1830 else { 1831 #ifdef EMUXKI_DEBUG 1832 printf("recording sample_rate not supported : %u\n", voice->sample_rate); 1833 #endif 1834 return -1; 1835 } 1836 break; 1837 case 11000: 1838 if(voice->sc->sc_type & EMUXKI_AUDIGY) 1839 return EMU_A_ADCCR_SAMPLERATE_11; 1840 else 1841 return EMU_ADCCR_SAMPLERATE_11; 1842 break; 1843 case 8000: 1844 if(voice->sc->sc_type & EMUXKI_AUDIGY) 1845 return EMU_A_ADCCR_SAMPLERATE_8; 1846 else 1847 return EMU_ADCCR_SAMPLERATE_8; 1848 break; 1849 default: 1850 #ifdef EMUXKI_DEBUG 1851 printf("recording sample_rate not supported : %u\n", voice->sample_rate); 1852 #endif 1853 return -1; 1854 } 1855 return -1; /* shouldn't get here */ 1856 } 1857 1858 1859 static void 1860 emuxki_voice_start(struct emuxki_voice *voice, 1861 void (*inth) (void *), void *inthparam) 1862 { 1863 uint32_t val; 1864 1865 voice->inth = inth; 1866 voice->inthparam = inthparam; 1867 if (voice->use & EMU_VOICE_USE_PLAY) { 1868 voice->trigblk = 1; 1869 emuxki_channel_start(voice->dataloc.chan[0]); 1870 if (voice->stereo) 1871 emuxki_channel_start(voice->dataloc.chan[1]); 1872 } else { 1873 voice->trigblk = 1; 1874 switch (voice->dataloc.source) { 1875 case EMU_RECSRC_ADC: 1876 /* XXX need to program DSP to output L+R 1877 * XXX in monaural case? */ 1878 if (voice->sc->sc_type & EMUXKI_AUDIGY) { 1879 val = EMU_A_ADCCR_LCHANENABLE; 1880 if (voice->stereo) 1881 val |= EMU_A_ADCCR_RCHANENABLE; 1882 } else { 1883 val = EMU_ADCCR_LCHANENABLE; 1884 if (voice->stereo) 1885 val |= EMU_ADCCR_RCHANENABLE; 1886 } 1887 val |= emuxki_voice_adc_rate(voice); 1888 emuxki_write(voice->sc, 0, EMU_ADCCR, 0); 1889 emuxki_write(voice->sc, 0, EMU_ADCCR, val); 1890 break; 1891 case EMU_RECSRC_MIC: 1892 case EMU_RECSRC_FX: 1893 printf("unimplemented\n"); 1894 break; 1895 case EMU_RECSRC_NOTSET: 1896 default: 1897 printf("Bad dataloc.source %d\n", 1898 voice->dataloc.source); 1899 break; 1900 } 1901 #if 0 1902 switch (voice->dataloc.source) { 1903 case EMU_RECSRC_ADC: 1904 case EMU_RECSRC_FX: 1905 case EMU_RECSRC_MIC: 1906 /* DMA completion interrupt is useless; use timer */ 1907 int s; 1908 s = splaudio(); 1909 val = emu_rd(sc, INTE, 4); 1910 val |= emuxki_recsrc_intrmasks[voice->dataloc.source]; 1911 emu_wr(sc, INTE, val, 4); 1912 splx(s); 1913 break; 1914 default: 1915 break; 1916 } 1917 #endif 1918 } 1919 voice->state |= EMU_VOICE_STATE_STARTED; 1920 emuxki_resched_timer(voice->sc); 1921 } 1922 1923 static void 1924 emuxki_voice_halt(struct emuxki_voice *voice) 1925 { 1926 1927 if (voice->use & EMU_VOICE_USE_PLAY) { 1928 emuxki_channel_stop(voice->dataloc.chan[0]); 1929 if (voice->stereo) 1930 emuxki_channel_stop(voice->dataloc.chan[1]); 1931 } else { 1932 switch (voice->dataloc.source) { 1933 case EMU_RECSRC_ADC: 1934 emuxki_write(voice->sc, 0, EMU_ADCCR, 0); 1935 break; 1936 case EMU_RECSRC_FX: 1937 case EMU_RECSRC_MIC: 1938 printf("unimplemented\n"); 1939 break; 1940 default: 1941 case EMU_RECSRC_NOTSET: 1942 printf("Bad dataloc.source %d\n", 1943 voice->dataloc.source); 1944 break; 1945 } 1946 1947 switch (voice->dataloc.source) { 1948 case EMU_RECSRC_ADC: 1949 case EMU_RECSRC_FX: 1950 case EMU_RECSRC_MIC: 1951 /* This should reset buffer pointer */ 1952 emuxki_write(voice->sc, 0, 1953 emuxki_recsrc_szreg[voice->dataloc.source], 1954 EMU_RECBS_BUFSIZE_NONE); 1955 #if 0 1956 int s; 1957 s = splaudio(); 1958 val = emu_rd(sc, INTE, 4); 1959 val &= ~emuxki_recsrc_intrmasks[voice->dataloc.source]; 1960 emu_wr(sc, INTE, val, 4); 1961 splx(s); 1962 #endif 1963 break; 1964 default: 1965 break; 1966 } 1967 } 1968 voice->state &= ~EMU_VOICE_STATE_STARTED; 1969 emuxki_resched_timer(voice->sc); 1970 } 1971 1972 /* 1973 * The interrupt handler 1974 */ 1975 static int 1976 emuxki_intr(void *arg) 1977 { 1978 struct emuxki_softc *sc; 1979 struct emuxki_voice *voice; 1980 uint32_t ipr, curblk; 1981 int claim; 1982 1983 sc = arg; 1984 claim = 0; 1985 while ((ipr = bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_IPR))) { 1986 if (ipr & EMU_IPR_INTERVALTIMER) { 1987 LIST_FOREACH(voice, &sc->voices, next) { 1988 if ((voice->state & 1989 EMU_VOICE_STATE_STARTED) == 0) 1990 continue; 1991 1992 curblk = emuxki_voice_curaddr(voice) / 1993 voice->blksize; 1994 #if 0 1995 if (curblk == voice->trigblk) { 1996 voice->inth(voice->inthparam); 1997 voice->trigblk++; 1998 voice->trigblk %= voice->blkmod; 1999 } 2000 #else 2001 while ((curblk >= voice->trigblk && 2002 curblk < (voice->trigblk + voice->blkmod / 2)) || 2003 ((int)voice->trigblk - (int)curblk) > 2004 (voice->blkmod / 2 + 1)) { 2005 voice->inth(voice->inthparam); 2006 voice->trigblk++; 2007 voice->trigblk %= voice->blkmod; 2008 } 2009 #endif 2010 } 2011 } 2012 2013 /* Got interrupt */ 2014 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_IPR, ipr); 2015 2016 claim = 1; 2017 } 2018 2019 return claim; 2020 } 2021 2022 2023 /* 2024 * Audio Architecture callbacks 2025 */ 2026 2027 static int 2028 emuxki_open(void *addr, int flags) 2029 { 2030 struct emuxki_softc *sc; 2031 2032 sc = addr; 2033 #ifdef EMUXKI_DEBUG 2034 printf("%s: emuxki_open called\n", sc->sc_dev.dv_xname); 2035 #endif 2036 2037 /* 2038 * Multiple voice support would be added as soon as I find a way to 2039 * trick the audio arch into supporting multiple voices. 2040 * Or I might integrate a modified audio arch supporting 2041 * multiple voices. 2042 */ 2043 2044 /* 2045 * I did this because i have problems identifying the selected 2046 * recording source(s) which is necessary when setting recording 2047 * params This will be addressed very soon 2048 */ 2049 if (flags & AUOPEN_READ) { 2050 sc->rvoice = emuxki_voice_new(sc, 0 /* EMU_VOICE_USE_RECORD */); 2051 if (sc->rvoice == NULL) 2052 return EBUSY; 2053 2054 /* XXX Hardcode RECSRC_ADC for now */ 2055 sc->rvoice->dataloc.source = EMU_RECSRC_ADC; 2056 } 2057 2058 if (flags & AUOPEN_WRITE) { 2059 sc->pvoice = emuxki_voice_new(sc, EMU_VOICE_USE_PLAY); 2060 if (sc->pvoice == NULL) { 2061 if (sc->rvoice) { 2062 emuxki_voice_delete(sc->rvoice); 2063 sc->rvoice = NULL; 2064 } 2065 return EBUSY; 2066 } 2067 } 2068 2069 return 0; 2070 } 2071 2072 static void 2073 emuxki_close(void *addr) 2074 { 2075 struct emuxki_softc *sc; 2076 2077 sc = addr; 2078 #ifdef EMUXKI_DEBUG 2079 printf("%s: emu10K1_close called\n", sc->sc_dev.dv_xname); 2080 #endif 2081 2082 /* No multiple voice support for now */ 2083 if (sc->rvoice != NULL) { 2084 emuxki_voice_delete(sc->rvoice); 2085 sc->rvoice = NULL; 2086 } 2087 if (sc->pvoice != NULL) { 2088 emuxki_voice_delete(sc->pvoice); 2089 sc->pvoice = NULL; 2090 } 2091 } 2092 2093 static int 2094 emuxki_query_encoding(void *addr, struct audio_encoding *fp) 2095 { 2096 #ifdef EMUXKI_DEBUG 2097 struct emuxki_softc *sc; 2098 2099 sc = addr; 2100 printf("%s: emuxki_query_encoding called\n", sc->sc_dev.dv_xname); 2101 #endif 2102 2103 switch (fp->index) { 2104 case 0: 2105 strcpy(fp->name, AudioEulinear); 2106 fp->encoding = AUDIO_ENCODING_ULINEAR; 2107 fp->precision = 8; 2108 fp->flags = 0; 2109 break; 2110 case 1: 2111 strcpy(fp->name, AudioEmulaw); 2112 fp->encoding = AUDIO_ENCODING_ULAW; 2113 fp->precision = 8; 2114 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 2115 break; 2116 case 2: 2117 strcpy(fp->name, AudioEalaw); 2118 fp->encoding = AUDIO_ENCODING_ALAW; 2119 fp->precision = 8; 2120 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 2121 break; 2122 case 3: 2123 strcpy(fp->name, AudioEslinear); 2124 fp->encoding = AUDIO_ENCODING_SLINEAR; 2125 fp->precision = 8; 2126 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 2127 break; 2128 case 4: 2129 strcpy(fp->name, AudioEslinear_le); 2130 fp->encoding = AUDIO_ENCODING_SLINEAR_LE; 2131 fp->precision = 16; 2132 fp->flags = 0; 2133 break; 2134 case 5: 2135 strcpy(fp->name, AudioEulinear_le); 2136 fp->encoding = AUDIO_ENCODING_ULINEAR_LE; 2137 fp->precision = 16; 2138 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 2139 break; 2140 case 6: 2141 strcpy(fp->name, AudioEslinear_be); 2142 fp->encoding = AUDIO_ENCODING_SLINEAR_BE; 2143 fp->precision = 16; 2144 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 2145 break; 2146 case 7: 2147 strcpy(fp->name, AudioEulinear_be); 2148 fp->encoding = AUDIO_ENCODING_ULINEAR_BE; 2149 fp->precision = 16; 2150 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 2151 break; 2152 default: 2153 return EINVAL; 2154 } 2155 return 0; 2156 } 2157 2158 static int 2159 emuxki_set_vparms(struct emuxki_voice *voice, const audio_params_t *p, 2160 stream_filter_list_t *fil) 2161 { 2162 int mode, i; 2163 2164 mode = (voice->use & EMU_VOICE_USE_PLAY) ? 2165 AUMODE_PLAY : AUMODE_RECORD; 2166 i = auconv_set_converter(emuxki_formats, EMUXKI_NFORMATS, 2167 mode, p, FALSE, fil); 2168 if (i < 0) 2169 return EINVAL; 2170 if (fil->req_size > 0) 2171 p = &fil->filters[0].param; 2172 return emuxki_voice_set_audioparms 2173 (voice, p->channels == 2, p->precision == 16, p->sample_rate); 2174 } 2175 2176 static int 2177 emuxki_set_params(void *addr, int setmode, int usemode, audio_params_t *play, 2178 audio_params_t *rec, stream_filter_list_t *pfil, stream_filter_list_t *rfil) 2179 { 2180 struct emuxki_softc *sc; 2181 struct audio_params *p; 2182 struct emuxki_voice *v; 2183 stream_filter_list_t *fil; 2184 int mode, error; 2185 2186 sc = addr; 2187 for (mode = AUMODE_RECORD; mode != -1; 2188 mode = mode == AUMODE_RECORD ? AUMODE_PLAY : -1) { 2189 if ((usemode & setmode & mode) == 0) 2190 continue; 2191 2192 if (mode == AUMODE_PLAY) { 2193 p = play; 2194 fil = pfil; 2195 v = sc->pvoice; 2196 } else { 2197 p = rec; 2198 fil = rfil; 2199 v = sc->rvoice; 2200 } 2201 2202 if (v == NULL) { 2203 continue; 2204 } 2205 2206 /* No multiple voice support for now */ 2207 if ((error = emuxki_set_vparms(v, p, fil))) 2208 return error; 2209 } 2210 2211 return 0; 2212 } 2213 2214 static int 2215 emuxki_halt_output(void *addr) 2216 { 2217 struct emuxki_softc *sc; 2218 2219 sc = addr; 2220 /* No multiple voice support for now */ 2221 if (sc->pvoice == NULL) 2222 return ENXIO; 2223 2224 emuxki_voice_halt(sc->pvoice); 2225 return 0; 2226 } 2227 2228 static int 2229 emuxki_halt_input(void *addr) 2230 { 2231 struct emuxki_softc *sc; 2232 2233 sc = addr; 2234 #ifdef EMUXKI_DEBUG 2235 printf("%s: emuxki_halt_input called\n", sc->sc_dev.dv_xname); 2236 #endif 2237 2238 /* No multiple voice support for now */ 2239 if (sc->rvoice == NULL) 2240 return ENXIO; 2241 emuxki_voice_halt(sc->rvoice); 2242 return 0; 2243 } 2244 2245 static int 2246 emuxki_getdev(void *addr, struct audio_device *dev) 2247 { 2248 struct emuxki_softc *sc; 2249 2250 sc = addr; 2251 *dev = sc->sc_audv; 2252 return 0; 2253 } 2254 2255 static int 2256 emuxki_set_port(void *addr, mixer_ctrl_t *mctl) 2257 { 2258 struct emuxki_softc *sc; 2259 2260 sc = addr; 2261 return sc->codecif->vtbl->mixer_set_port(sc->codecif, mctl); 2262 } 2263 2264 static int 2265 emuxki_get_port(void *addr, mixer_ctrl_t *mctl) 2266 { 2267 struct emuxki_softc *sc; 2268 2269 sc = addr; 2270 return sc->codecif->vtbl->mixer_get_port(sc->codecif, mctl); 2271 } 2272 2273 static int 2274 emuxki_query_devinfo(void *addr, mixer_devinfo_t *minfo) 2275 { 2276 struct emuxki_softc *sc; 2277 2278 sc = addr; 2279 return sc->codecif->vtbl->query_devinfo(sc->codecif, minfo); 2280 } 2281 2282 static void * 2283 emuxki_allocm(void *addr, int direction, size_t size, 2284 struct malloc_type *type, int flags) 2285 { 2286 if (direction == AUMODE_PLAY) 2287 return emuxki_pmem_alloc(addr, size, type, flags); 2288 else 2289 return emuxki_rmem_alloc(addr, size, type, flags); 2290 } 2291 2292 static void 2293 emuxki_freem(void *addr, void *ptr, struct malloc_type *type) 2294 { 2295 struct emuxki_softc *sc; 2296 struct emuxki_mem *mem; 2297 uint32_t *ptb, silentpage; 2298 size_t numblocks; 2299 int i, s; 2300 2301 sc = addr; 2302 ptb = KERNADDR(sc->ptb); 2303 silentpage = DMAADDR(sc->silentpage) << 1; 2304 LIST_FOREACH(mem, &sc->mem, next) { 2305 if (KERNADDR(mem->dmamem) != ptr) 2306 continue; 2307 2308 s = splaudio(); 2309 if (mem->ptbidx != EMU_RMEM) { 2310 numblocks = DMASIZE(mem->dmamem) / EMU_PTESIZE; 2311 if (DMASIZE(mem->dmamem) % EMU_PTESIZE) 2312 numblocks++; 2313 for (i = 0; i < numblocks; i++) 2314 ptb[mem->ptbidx + i] = 2315 htole32(silentpage | (mem->ptbidx + i)); 2316 } 2317 LIST_REMOVE(mem, next); 2318 splx(s); 2319 2320 emuxki_mem_delete(mem, type); 2321 break; 2322 } 2323 } 2324 2325 /* blocksize should be a divisor of allowable buffersize */ 2326 /* XXX probably this could be done better */ 2327 static int 2328 emuxki_round_blocksize(void *addr, int blksize, 2329 int mode, const audio_params_t* param) 2330 { 2331 #if 0 2332 struct emuxki_softc *sc; 2333 struct audio_softc *au; 2334 #endif 2335 int bufsize; 2336 #if 0 2337 sc = addr; 2338 if (sc == NULL) 2339 return blksize; 2340 2341 au = (void *)sc->sc_audev; 2342 if (au == NULL) 2343 return blksize; 2344 2345 bufsize = emuxki_round_buffersize(sc, AUMODE_RECORD, 2346 au->sc_rr.bufsize); 2347 #else 2348 bufsize = 65536; 2349 #endif 2350 2351 while (bufsize > blksize) 2352 bufsize /= 2; 2353 2354 return bufsize; 2355 } 2356 2357 static size_t 2358 emuxki_round_buffersize(void *addr, int direction, size_t bsize) 2359 { 2360 2361 if (direction == AUMODE_PLAY) { 2362 if (bsize < EMU_PTESIZE) 2363 bsize = EMU_PTESIZE; 2364 else if (bsize > (EMU_PTESIZE * EMU_MAXPTE)) 2365 bsize = EMU_PTESIZE * EMU_MAXPTE; 2366 /* Would be better if set to max available */ 2367 else if (bsize % EMU_PTESIZE) 2368 bsize = bsize - 2369 (bsize % EMU_PTESIZE) + 2370 EMU_PTESIZE; 2371 } else { 2372 int idx; 2373 2374 /* find nearest lower recbuf size */ 2375 for(idx = sizeof(emuxki_recbuf_sz) / 2376 sizeof(emuxki_recbuf_sz[0]); --idx >= 0; ) { 2377 if (bsize >= emuxki_recbuf_sz[idx]) { 2378 bsize = emuxki_recbuf_sz[idx]; 2379 break; 2380 } 2381 } 2382 2383 if (bsize == 0) 2384 bsize = 384; 2385 } 2386 2387 return bsize; 2388 } 2389 2390 static paddr_t 2391 emuxki_mappage(void *addr, void *ptr, off_t off, int prot) 2392 { 2393 struct emuxki_softc *sc; 2394 struct emuxki_mem *mem; 2395 2396 sc = addr; 2397 LIST_FOREACH(mem, &sc->mem, next) { 2398 if (KERNADDR(mem->dmamem) == ptr) { 2399 struct dmamem *dm = mem->dmamem; 2400 2401 return bus_dmamem_mmap(dm->dmat, dm->segs, dm->nsegs, 2402 off, prot, BUS_DMA_WAITOK); 2403 } 2404 } 2405 2406 return -1; 2407 } 2408 2409 static int 2410 emuxki_get_props(void *addr) 2411 { 2412 return AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT | 2413 AUDIO_PROP_FULLDUPLEX; 2414 } 2415 2416 static int 2417 emuxki_trigger_output(void *addr, void *start, void *end, int blksize, 2418 void (*inth) (void *), void *inthparam, const audio_params_t *params) 2419 { 2420 struct emuxki_softc *sc; 2421 /* No multiple voice support for now */ 2422 struct emuxki_voice *voice; 2423 int error; 2424 2425 sc = addr; 2426 voice = sc->pvoice; 2427 if (voice == NULL) 2428 return ENXIO; 2429 if ((error = emuxki_voice_set_audioparms(voice, params->channels == 2, 2430 params->precision == 16, params->sample_rate))) 2431 return error; 2432 if ((error = emuxki_voice_set_bufparms(voice, start, 2433 (caddr_t)end - (caddr_t)start, blksize))) 2434 return error; 2435 emuxki_voice_commit_parms(voice); 2436 emuxki_voice_start(voice, inth, inthparam); 2437 2438 return 0; 2439 } 2440 2441 static int 2442 emuxki_trigger_input(void *addr, void *start, void *end, int blksize, 2443 void (*inth) (void *), void *inthparam, const audio_params_t *params) 2444 { 2445 struct emuxki_softc *sc; 2446 /* No multiple voice support for now */ 2447 struct emuxki_voice *voice; 2448 int error; 2449 2450 sc = addr; 2451 voice = sc->rvoice; 2452 if (voice == NULL) 2453 return ENXIO; 2454 if ((error = emuxki_voice_set_audioparms(voice, params->channels == 2, 2455 params->precision == 16, params->sample_rate))) 2456 return error; 2457 if ((error = emuxki_voice_set_bufparms(voice, start, 2458 (caddr_t)end - (caddr_t)start, blksize))) 2459 return error; 2460 emuxki_voice_start(voice, inth, inthparam); 2461 2462 return 0; 2463 } 2464 2465 /* 2466 * AC97 callbacks 2467 */ 2468 2469 static int 2470 emuxki_ac97_attach(void *arg, struct ac97_codec_if *codecif) 2471 { 2472 struct emuxki_softc *sc; 2473 2474 sc = arg; 2475 sc->codecif = codecif; 2476 return 0; 2477 } 2478 2479 static int 2480 emuxki_ac97_read(void *arg, uint8_t reg, uint16_t *val) 2481 { 2482 struct emuxki_softc *sc; 2483 int s; 2484 2485 sc = arg; 2486 s = splaudio(); 2487 bus_space_write_1(sc->sc_iot, sc->sc_ioh, EMU_AC97ADDR, reg); 2488 *val = bus_space_read_2(sc->sc_iot, sc->sc_ioh, EMU_AC97DATA); 2489 splx(s); 2490 2491 return 0; 2492 } 2493 2494 static int 2495 emuxki_ac97_write(void *arg, uint8_t reg, uint16_t val) 2496 { 2497 struct emuxki_softc *sc; 2498 int s; 2499 2500 sc = arg; 2501 s = splaudio(); 2502 bus_space_write_1(sc->sc_iot, sc->sc_ioh, EMU_AC97ADDR, reg); 2503 bus_space_write_2(sc->sc_iot, sc->sc_ioh, EMU_AC97DATA, val); 2504 splx(s); 2505 2506 return 0; 2507 } 2508 2509 static int 2510 emuxki_ac97_reset(void *arg) 2511 { 2512 2513 return 0; 2514 } 2515 2516 enum ac97_host_flags 2517 emuxki_ac97_flags(void *arg) 2518 { 2519 2520 return AC97_HOST_SWAPPED_CHANNELS; 2521 } 2522