The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/pci/emuxki.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 09624849ab5818b77fdd044d0760af73


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.