Home | History | Annotate | Line # | Download | only in vr
vraiu.c revision 1.1.8.3
      1  1.1.8.3  jdolecek /*	$NetBSD: vraiu.c,v 1.1.8.3 2002/10/10 18:33:01 jdolecek Exp $	*/
      2  1.1.8.2  jdolecek 
      3  1.1.8.2  jdolecek /*
      4  1.1.8.2  jdolecek  * Copyright (c) 2001 HAMAJIMA Katsuomi. All rights reserved.
      5  1.1.8.2  jdolecek  *
      6  1.1.8.2  jdolecek  * Redistribution and use in source and binary forms, with or without
      7  1.1.8.2  jdolecek  * modification, are permitted provided that the following conditions
      8  1.1.8.2  jdolecek  * are met:
      9  1.1.8.2  jdolecek  * 1. Redistributions of source code must retain the above copyright
     10  1.1.8.2  jdolecek  *    notice, this list of conditions and the following disclaimer.
     11  1.1.8.2  jdolecek  * 2. Redistributions in binary form must reproduce the above copyright
     12  1.1.8.2  jdolecek  *    notice, this list of conditions and the following disclaimer in the
     13  1.1.8.2  jdolecek  *    documentation and/or other materials provided with the distribution.
     14  1.1.8.2  jdolecek  *
     15  1.1.8.2  jdolecek  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     16  1.1.8.2  jdolecek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     17  1.1.8.2  jdolecek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     18  1.1.8.2  jdolecek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     19  1.1.8.2  jdolecek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     20  1.1.8.2  jdolecek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     21  1.1.8.2  jdolecek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     22  1.1.8.2  jdolecek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     23  1.1.8.2  jdolecek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     24  1.1.8.2  jdolecek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     25  1.1.8.2  jdolecek  * SUCH DAMAGE.
     26  1.1.8.2  jdolecek  */
     27  1.1.8.2  jdolecek 
     28  1.1.8.2  jdolecek #include <sys/param.h>
     29  1.1.8.2  jdolecek #include <sys/systm.h>
     30  1.1.8.2  jdolecek #include <sys/device.h>
     31  1.1.8.2  jdolecek #include <sys/malloc.h>
     32  1.1.8.2  jdolecek #include <sys/bswap.h>
     33  1.1.8.2  jdolecek 
     34  1.1.8.2  jdolecek #include <machine/cpu.h>
     35  1.1.8.2  jdolecek #include <machine/intr.h>
     36  1.1.8.2  jdolecek #include <machine/bus.h>
     37  1.1.8.2  jdolecek #include <machine/platid.h>
     38  1.1.8.2  jdolecek #include <machine/platid_mask.h>
     39  1.1.8.2  jdolecek #include <machine/config_hook.h>
     40  1.1.8.2  jdolecek 
     41  1.1.8.2  jdolecek #include <sys/audioio.h>
     42  1.1.8.2  jdolecek #include <dev/audio_if.h>
     43  1.1.8.2  jdolecek 
     44  1.1.8.2  jdolecek #include <hpcmips/vr/vr.h>
     45  1.1.8.2  jdolecek #include <hpcmips/vr/vripif.h>
     46  1.1.8.2  jdolecek #include <hpcmips/vr/icureg.h>
     47  1.1.8.2  jdolecek #include <hpcmips/vr/cmureg.h>
     48  1.1.8.2  jdolecek #include <hpcmips/vr/vraiureg.h>
     49  1.1.8.2  jdolecek 
     50  1.1.8.2  jdolecek #ifdef VRAIU_DEBUG
     51  1.1.8.2  jdolecek int vraiu_debug = VRAIU_DEBUG;
     52  1.1.8.2  jdolecek #define DPRINTFN(n,x) if (vraiu_debug>(n)) printf x;
     53  1.1.8.2  jdolecek #else
     54  1.1.8.2  jdolecek #define DPRINTFN(n,x)
     55  1.1.8.2  jdolecek #endif
     56  1.1.8.2  jdolecek 
     57  1.1.8.2  jdolecek #define AUDIO_BUF_SIZE 2048
     58  1.1.8.2  jdolecek 
     59  1.1.8.2  jdolecek struct vraiu_softc {
     60  1.1.8.2  jdolecek 	struct device		sc_dev;
     61  1.1.8.2  jdolecek 	bus_space_tag_t		sc_iot;
     62  1.1.8.2  jdolecek 	bus_space_handle_t	sc_ioh;
     63  1.1.8.2  jdolecek 	bus_dma_tag_t		sc_dmat;
     64  1.1.8.2  jdolecek 	bus_dmamap_t		sc_dmap;
     65  1.1.8.2  jdolecek 	vrip_chipset_tag_t	sc_vrip;
     66  1.1.8.2  jdolecek 	vrdcu_chipset_tag_t	sc_dc;
     67  1.1.8.2  jdolecek 	vrdmaau_chipset_tag_t	sc_ac;
     68  1.1.8.2  jdolecek 	vrcmu_chipset_tag_t	sc_cc;
     69  1.1.8.2  jdolecek 	void			*sc_handler;
     70  1.1.8.2  jdolecek 	u_short	*sc_buf;	/* dma buffer pointer */
     71  1.1.8.2  jdolecek 	int	sc_status;	/* status */
     72  1.1.8.2  jdolecek 	u_int	sc_rate;	/* sampling rate */
     73  1.1.8.2  jdolecek 	u_int	sc_channels;	/* # of channels used */
     74  1.1.8.2  jdolecek 	u_int	sc_encoding;	/* encoding type */
     75  1.1.8.2  jdolecek 	int	sc_precision;	/* 8 or 16 bits */
     76  1.1.8.2  jdolecek 				/* pointer to format conversion routine */
     77  1.1.8.2  jdolecek 	void	(*sc_decodefunc)(struct vraiu_softc *, u_short *, void *, int);
     78  1.1.8.2  jdolecek 	void	(*sc_intr)(void *);	/* interrupt routine */
     79  1.1.8.2  jdolecek 	void	*sc_intrdata;		/* interrupt data */
     80  1.1.8.2  jdolecek };
     81  1.1.8.2  jdolecek 
     82  1.1.8.2  jdolecek int vraiu_match(struct device *, struct cfdata *, void *);
     83  1.1.8.2  jdolecek void vraiu_attach(struct device *, struct device *, void *);
     84  1.1.8.2  jdolecek int vraiu_intr(void *);
     85  1.1.8.2  jdolecek 
     86  1.1.8.3  jdolecek CFATTACH_DECL(vraiu, sizeof(struct vraiu_softc),
     87  1.1.8.3  jdolecek     vraiu_match, vraiu_attach, NULL, NULL);
     88  1.1.8.2  jdolecek 
     89  1.1.8.2  jdolecek struct audio_device aiu_device = {
     90  1.1.8.2  jdolecek 	"VR4121 AIU",
     91  1.1.8.2  jdolecek 	"0.1",
     92  1.1.8.2  jdolecek 	"aiu"
     93  1.1.8.2  jdolecek };
     94  1.1.8.2  jdolecek 
     95  1.1.8.2  jdolecek /*
     96  1.1.8.2  jdolecek  * Define our interface to the higher level audio driver.
     97  1.1.8.2  jdolecek  */
     98  1.1.8.2  jdolecek int vraiu_open(void *, int);
     99  1.1.8.2  jdolecek void vraiu_close(void *);
    100  1.1.8.2  jdolecek int vraiu_query_encoding(void *, struct audio_encoding *);
    101  1.1.8.2  jdolecek int vraiu_round_blocksize(void *, int);
    102  1.1.8.2  jdolecek int vraiu_commit_settings(void *);
    103  1.1.8.2  jdolecek int vraiu_init_output(void *, void*, int);
    104  1.1.8.2  jdolecek int vraiu_start_output(void *, void *, int, void (*)(void *), void *);
    105  1.1.8.2  jdolecek int vraiu_start_input(void *, void *, int, void (*)(void *), void *);
    106  1.1.8.2  jdolecek int vraiu_halt_output(void *);
    107  1.1.8.2  jdolecek int vraiu_halt_input(void *);
    108  1.1.8.2  jdolecek int vraiu_getdev(void *, struct audio_device *);
    109  1.1.8.2  jdolecek int vraiu_set_port(void *, mixer_ctrl_t *);
    110  1.1.8.2  jdolecek int vraiu_get_port(void *, mixer_ctrl_t *);
    111  1.1.8.2  jdolecek int vraiu_query_devinfo(void *, mixer_devinfo_t *);
    112  1.1.8.2  jdolecek int vraiu_set_params(void *, int, int, struct audio_params *,
    113  1.1.8.2  jdolecek 		     struct audio_params *);
    114  1.1.8.2  jdolecek int vraiu_get_props(void *);
    115  1.1.8.2  jdolecek 
    116  1.1.8.2  jdolecek struct audio_hw_if vraiu_hw_if = {
    117  1.1.8.2  jdolecek 	vraiu_open,
    118  1.1.8.2  jdolecek 	vraiu_close,
    119  1.1.8.2  jdolecek 	NULL,
    120  1.1.8.2  jdolecek 	vraiu_query_encoding,
    121  1.1.8.2  jdolecek 	vraiu_set_params,
    122  1.1.8.2  jdolecek 	vraiu_round_blocksize,
    123  1.1.8.2  jdolecek 	vraiu_commit_settings,
    124  1.1.8.2  jdolecek 	vraiu_init_output,
    125  1.1.8.2  jdolecek 	NULL,
    126  1.1.8.2  jdolecek 	vraiu_start_output,
    127  1.1.8.2  jdolecek 	vraiu_start_input,
    128  1.1.8.2  jdolecek 	vraiu_halt_output,
    129  1.1.8.2  jdolecek 	vraiu_halt_input,
    130  1.1.8.2  jdolecek 	NULL,
    131  1.1.8.2  jdolecek 	vraiu_getdev,
    132  1.1.8.2  jdolecek 	NULL,
    133  1.1.8.2  jdolecek 	vraiu_set_port,
    134  1.1.8.2  jdolecek 	vraiu_get_port,
    135  1.1.8.2  jdolecek 	vraiu_query_devinfo,
    136  1.1.8.2  jdolecek 	NULL,
    137  1.1.8.2  jdolecek 	NULL,
    138  1.1.8.2  jdolecek 	NULL,
    139  1.1.8.2  jdolecek 	NULL,
    140  1.1.8.2  jdolecek 	vraiu_get_props,
    141  1.1.8.2  jdolecek };
    142  1.1.8.2  jdolecek 
    143  1.1.8.2  jdolecek /*
    144  1.1.8.2  jdolecek  * convert to 1ch 10bit unsigned PCM data.
    145  1.1.8.2  jdolecek  */
    146  1.1.8.2  jdolecek static void vraiu_slinear8_1(struct vraiu_softc *, u_short *, void *, int);
    147  1.1.8.2  jdolecek static void vraiu_slinear8_2(struct vraiu_softc *, u_short *, void *, int);
    148  1.1.8.2  jdolecek static void vraiu_ulinear8_1(struct vraiu_softc *, u_short *, void *, int);
    149  1.1.8.2  jdolecek static void vraiu_ulinear8_2(struct vraiu_softc *, u_short *, void *, int);
    150  1.1.8.2  jdolecek static void vraiu_ulaw_1(struct vraiu_softc *, u_short *, void *, int);
    151  1.1.8.2  jdolecek static void vraiu_ulaw_2(struct vraiu_softc *, u_short *, void *, int);
    152  1.1.8.2  jdolecek static void vraiu_slinear16_1(struct vraiu_softc *, u_short *, void *, int);
    153  1.1.8.2  jdolecek static void vraiu_slinear16_2(struct vraiu_softc *, u_short *, void *, int);
    154  1.1.8.2  jdolecek static void vraiu_slinear16sw_1(struct vraiu_softc *, u_short *, void *, int);
    155  1.1.8.2  jdolecek static void vraiu_slinear16sw_2(struct vraiu_softc *, u_short *, void *, int);
    156  1.1.8.2  jdolecek 
    157  1.1.8.2  jdolecek int
    158  1.1.8.2  jdolecek vraiu_match(struct device *parent, struct cfdata *cf, void *aux)
    159  1.1.8.2  jdolecek {
    160  1.1.8.2  jdolecek 	return 1;
    161  1.1.8.2  jdolecek }
    162  1.1.8.2  jdolecek 
    163  1.1.8.2  jdolecek void
    164  1.1.8.2  jdolecek vraiu_attach(struct device *parent, struct device *self, void *aux)
    165  1.1.8.2  jdolecek {
    166  1.1.8.2  jdolecek 	struct vrip_attach_args *va = aux;
    167  1.1.8.2  jdolecek 	struct vraiu_softc *sc = (void*)self;
    168  1.1.8.2  jdolecek 	bus_dma_segment_t segs;
    169  1.1.8.2  jdolecek 	int rsegs;
    170  1.1.8.2  jdolecek 
    171  1.1.8.2  jdolecek 	sc->sc_status = ENXIO;
    172  1.1.8.2  jdolecek 	sc->sc_intr = NULL;
    173  1.1.8.2  jdolecek 	sc->sc_iot = va->va_iot;
    174  1.1.8.2  jdolecek 	sc->sc_vrip = va->va_vc;
    175  1.1.8.2  jdolecek 	sc->sc_cc = va->va_cc;
    176  1.1.8.2  jdolecek 	sc->sc_dc = va->va_dc;
    177  1.1.8.2  jdolecek 	sc->sc_ac = va->va_ac;
    178  1.1.8.2  jdolecek 	sc->sc_dmat = &vrdcu_bus_dma_tag;
    179  1.1.8.2  jdolecek 
    180  1.1.8.2  jdolecek 	if (!sc->sc_cc) {
    181  1.1.8.2  jdolecek 		printf(" not configured: cmu not found\n");
    182  1.1.8.2  jdolecek 		return;
    183  1.1.8.2  jdolecek 	}
    184  1.1.8.2  jdolecek 	if (!sc->sc_dc) {
    185  1.1.8.2  jdolecek 		printf(" not configured: dcu not found\n");
    186  1.1.8.2  jdolecek 		return;
    187  1.1.8.2  jdolecek 	}
    188  1.1.8.2  jdolecek 	if (!sc->sc_ac) {
    189  1.1.8.2  jdolecek 		printf(" not configured: dmaau not found\n");
    190  1.1.8.2  jdolecek 		return;
    191  1.1.8.2  jdolecek 	}
    192  1.1.8.2  jdolecek 	if (bus_space_map(sc->sc_iot, va->va_addr, va->va_size,
    193  1.1.8.2  jdolecek 			  0 /* no flags */, &sc->sc_ioh)) {
    194  1.1.8.2  jdolecek 		printf(": can't map i/o space\n");
    195  1.1.8.2  jdolecek 		return;
    196  1.1.8.2  jdolecek 	}
    197  1.1.8.2  jdolecek 
    198  1.1.8.2  jdolecek 	/* install interrupt handler and enable interrupt */
    199  1.1.8.2  jdolecek 	if (!(sc->sc_handler = vrip_intr_establish(va->va_vc, va->va_unit,
    200  1.1.8.2  jdolecek 						   0, IPL_AUDIO,
    201  1.1.8.2  jdolecek 						   vraiu_intr, sc))) {
    202  1.1.8.2  jdolecek 		printf(": can't map interrupt line.\n");
    203  1.1.8.2  jdolecek 		return;
    204  1.1.8.2  jdolecek 	}
    205  1.1.8.2  jdolecek 	vrip_intr_setmask2(sc->sc_vrip, sc->sc_handler, (AIUINT_INTMEND | \
    206  1.1.8.2  jdolecek 							 AIUINT_INTM | \
    207  1.1.8.2  jdolecek 							 AIUINT_INTMIDLE | \
    208  1.1.8.2  jdolecek 							 AIUINT_INTMST | \
    209  1.1.8.2  jdolecek 							 AIUINT_INTSEND | \
    210  1.1.8.2  jdolecek 							 AIUINT_INTS | \
    211  1.1.8.2  jdolecek 							 AIUINT_INTSIDLE), 0);
    212  1.1.8.2  jdolecek 
    213  1.1.8.2  jdolecek 	if (bus_dmamem_alloc(sc->sc_dmat, AUDIO_BUF_SIZE, 0, 0, &segs, 1,
    214  1.1.8.2  jdolecek 			     &rsegs, BUS_DMA_NOWAIT)) {
    215  1.1.8.2  jdolecek 		printf(": can't allocate memory.\n");
    216  1.1.8.2  jdolecek 		return;
    217  1.1.8.2  jdolecek 	}
    218  1.1.8.2  jdolecek 	if (bus_dmamem_map(sc->sc_dmat, &segs, rsegs, AUDIO_BUF_SIZE,
    219  1.1.8.2  jdolecek 			   (caddr_t *)&sc->sc_buf,
    220  1.1.8.2  jdolecek 			   BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) {
    221  1.1.8.2  jdolecek 		printf(": can't map memory.\n");
    222  1.1.8.2  jdolecek 		bus_dmamem_free(sc->sc_dmat, &segs, rsegs);
    223  1.1.8.2  jdolecek 		return;
    224  1.1.8.2  jdolecek 	}
    225  1.1.8.2  jdolecek 	if (bus_dmamap_create(sc->sc_dmat, AUDIO_BUF_SIZE, 1, AUDIO_BUF_SIZE,
    226  1.1.8.2  jdolecek 			      0, BUS_DMA_NOWAIT, &sc->sc_dmap)) {
    227  1.1.8.2  jdolecek 		printf(": can't create DMA map.\n");
    228  1.1.8.2  jdolecek 		bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->sc_buf,
    229  1.1.8.2  jdolecek 				 AUDIO_BUF_SIZE);
    230  1.1.8.2  jdolecek 		bus_dmamem_free(sc->sc_dmat, &segs, rsegs);
    231  1.1.8.2  jdolecek 		return;
    232  1.1.8.2  jdolecek 	}
    233  1.1.8.2  jdolecek 	if (bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, sc->sc_buf,
    234  1.1.8.2  jdolecek 				   AUDIO_BUF_SIZE, NULL, BUS_DMA_NOWAIT)) {
    235  1.1.8.2  jdolecek 		printf(": can't load DMA map.\n");
    236  1.1.8.2  jdolecek 		bus_dmamap_destroy(sc->sc_dmat, sc->sc_dmap);
    237  1.1.8.2  jdolecek 		bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->sc_buf,
    238  1.1.8.2  jdolecek 				 AUDIO_BUF_SIZE);
    239  1.1.8.2  jdolecek 		bus_dmamem_free(sc->sc_dmat, &segs, rsegs);
    240  1.1.8.2  jdolecek 		return;
    241  1.1.8.2  jdolecek 	}
    242  1.1.8.2  jdolecek 	if (sc->sc_ac->ac_set_aiuout(sc->sc_ac, sc->sc_buf)) {
    243  1.1.8.2  jdolecek 		printf(": can't set DMA address.\n");
    244  1.1.8.2  jdolecek 		bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap);
    245  1.1.8.2  jdolecek 		bus_dmamap_destroy(sc->sc_dmat, sc->sc_dmap);
    246  1.1.8.2  jdolecek 		bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->sc_buf,
    247  1.1.8.2  jdolecek 				 AUDIO_BUF_SIZE);
    248  1.1.8.2  jdolecek 		bus_dmamem_free(sc->sc_dmat, &segs, rsegs);
    249  1.1.8.2  jdolecek 		return;
    250  1.1.8.2  jdolecek 	}
    251  1.1.8.2  jdolecek 	printf("\n");
    252  1.1.8.2  jdolecek 
    253  1.1.8.2  jdolecek 	sc->sc_status = 0;
    254  1.1.8.2  jdolecek 	sc->sc_rate = SPS8000;
    255  1.1.8.2  jdolecek 	sc->sc_channels = 1;
    256  1.1.8.2  jdolecek 	sc->sc_precision = 8;
    257  1.1.8.2  jdolecek 	sc->sc_encoding = AUDIO_ENCODING_ULAW;
    258  1.1.8.2  jdolecek 	sc->sc_decodefunc = vraiu_ulaw_1;
    259  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_attach: reset AIU\n"))
    260  1.1.8.2  jdolecek 	bus_space_write_2(sc->sc_iot, sc->sc_ioh, SEQ_REG_W, AIURST);
    261  1.1.8.2  jdolecek 	/* attach audio subsystem */
    262  1.1.8.2  jdolecek 	audio_attach_mi(&vraiu_hw_if, sc, &sc->sc_dev);
    263  1.1.8.2  jdolecek }
    264  1.1.8.2  jdolecek 
    265  1.1.8.2  jdolecek int
    266  1.1.8.2  jdolecek vraiu_open(void *self, int flags)
    267  1.1.8.2  jdolecek {
    268  1.1.8.2  jdolecek 	struct vraiu_softc *sc = (void*)self;
    269  1.1.8.2  jdolecek 
    270  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_open\n"));
    271  1.1.8.2  jdolecek 
    272  1.1.8.2  jdolecek 	if (sc->sc_status) {
    273  1.1.8.2  jdolecek 		DPRINTFN(0, ("vraiu_open: device error\n"));
    274  1.1.8.2  jdolecek 		return sc->sc_status;
    275  1.1.8.2  jdolecek 	}
    276  1.1.8.2  jdolecek 	sc->sc_status = EBUSY;
    277  1.1.8.2  jdolecek 	return 0;
    278  1.1.8.2  jdolecek }
    279  1.1.8.2  jdolecek 
    280  1.1.8.2  jdolecek void
    281  1.1.8.2  jdolecek vraiu_close(void *self)
    282  1.1.8.2  jdolecek {
    283  1.1.8.2  jdolecek 	struct vraiu_softc *sc = (void*)self;
    284  1.1.8.2  jdolecek 
    285  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_close\n"));
    286  1.1.8.2  jdolecek 
    287  1.1.8.2  jdolecek 	vraiu_halt_output(self);
    288  1.1.8.2  jdolecek 	sc->sc_status = 0;
    289  1.1.8.2  jdolecek }
    290  1.1.8.2  jdolecek 
    291  1.1.8.2  jdolecek int
    292  1.1.8.2  jdolecek vraiu_query_encoding(void *self, struct audio_encoding *ae)
    293  1.1.8.2  jdolecek {
    294  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_query_encoding\n"));
    295  1.1.8.2  jdolecek 
    296  1.1.8.2  jdolecek 	switch (ae->index) {
    297  1.1.8.2  jdolecek 		case 0:
    298  1.1.8.2  jdolecek 			strcpy(ae->name, AudioEslinear);
    299  1.1.8.2  jdolecek 			ae->encoding = AUDIO_ENCODING_SLINEAR;
    300  1.1.8.2  jdolecek 			ae->precision = 8;
    301  1.1.8.2  jdolecek 			ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
    302  1.1.8.2  jdolecek 			break;
    303  1.1.8.2  jdolecek 		case 1:
    304  1.1.8.2  jdolecek 			strcpy(ae->name, AudioEmulaw);
    305  1.1.8.2  jdolecek 			ae->encoding = AUDIO_ENCODING_ULAW;
    306  1.1.8.2  jdolecek 			ae->precision = 8;
    307  1.1.8.2  jdolecek 			ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
    308  1.1.8.2  jdolecek 			break;
    309  1.1.8.2  jdolecek 		case 2:
    310  1.1.8.2  jdolecek 			strcpy(ae->name, AudioEulinear);
    311  1.1.8.2  jdolecek 			ae->encoding = AUDIO_ENCODING_ULINEAR;
    312  1.1.8.2  jdolecek 			ae->precision = 8;
    313  1.1.8.2  jdolecek 			ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
    314  1.1.8.2  jdolecek 			break;
    315  1.1.8.2  jdolecek 		case 3:
    316  1.1.8.2  jdolecek 			strcpy(ae->name, AudioEslinear);
    317  1.1.8.2  jdolecek 			ae->encoding = AUDIO_ENCODING_SLINEAR;
    318  1.1.8.2  jdolecek 			ae->precision = 16;
    319  1.1.8.2  jdolecek 			ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
    320  1.1.8.2  jdolecek 			break;
    321  1.1.8.2  jdolecek 		case 4:
    322  1.1.8.2  jdolecek 			strcpy(ae->name, AudioEslinear_be);
    323  1.1.8.2  jdolecek 			ae->encoding = AUDIO_ENCODING_SLINEAR_BE;
    324  1.1.8.2  jdolecek 			ae->precision = 16;
    325  1.1.8.2  jdolecek 			ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
    326  1.1.8.2  jdolecek 			break;
    327  1.1.8.2  jdolecek 		case 5:
    328  1.1.8.2  jdolecek 			strcpy(ae->name, AudioEslinear_le);
    329  1.1.8.2  jdolecek 			ae->encoding = AUDIO_ENCODING_SLINEAR_LE;
    330  1.1.8.2  jdolecek 			ae->precision = 16;
    331  1.1.8.2  jdolecek 			ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
    332  1.1.8.2  jdolecek 			break;
    333  1.1.8.2  jdolecek 		case 6:
    334  1.1.8.2  jdolecek 			strcpy(ae->name, AudioEslinear);
    335  1.1.8.2  jdolecek 			ae->encoding = AUDIO_ENCODING_ULINEAR;
    336  1.1.8.2  jdolecek 			ae->precision = 16;
    337  1.1.8.2  jdolecek 			ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
    338  1.1.8.2  jdolecek 			break;
    339  1.1.8.2  jdolecek 		case 7:
    340  1.1.8.2  jdolecek 			strcpy(ae->name, AudioEslinear_be);
    341  1.1.8.2  jdolecek 			ae->encoding = AUDIO_ENCODING_ULINEAR_BE;
    342  1.1.8.2  jdolecek 			ae->precision = 16;
    343  1.1.8.2  jdolecek 			ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
    344  1.1.8.2  jdolecek 			break;
    345  1.1.8.2  jdolecek 		case 8:
    346  1.1.8.2  jdolecek 			strcpy(ae->name, AudioEslinear_le);
    347  1.1.8.2  jdolecek 			ae->encoding = AUDIO_ENCODING_ULINEAR_LE;
    348  1.1.8.2  jdolecek 			ae->precision = 16;
    349  1.1.8.2  jdolecek 			ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
    350  1.1.8.2  jdolecek 			break;
    351  1.1.8.2  jdolecek 		default:
    352  1.1.8.2  jdolecek 			DPRINTFN(0, ("vraiu_query_encoding: param error"
    353  1.1.8.2  jdolecek 				     " (%d)\n", ae->index));
    354  1.1.8.2  jdolecek 			return EINVAL;
    355  1.1.8.2  jdolecek 	}
    356  1.1.8.2  jdolecek 	return 0;
    357  1.1.8.2  jdolecek }
    358  1.1.8.2  jdolecek 
    359  1.1.8.2  jdolecek int
    360  1.1.8.2  jdolecek vraiu_set_params(void *self, int setmode, int usemode,
    361  1.1.8.2  jdolecek 		 struct audio_params *play, struct audio_params *rec)
    362  1.1.8.2  jdolecek {
    363  1.1.8.2  jdolecek 	struct vraiu_softc *sc = (void*)self;
    364  1.1.8.2  jdolecek 
    365  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_set_params: %dbit, %dch, %ldHz, encoding %d\n",
    366  1.1.8.2  jdolecek 		     play->precision, play->channels, play->sample_rate,
    367  1.1.8.2  jdolecek 		     play->encoding));
    368  1.1.8.2  jdolecek 
    369  1.1.8.2  jdolecek 	switch (play->sample_rate) {
    370  1.1.8.2  jdolecek 	case 8000:
    371  1.1.8.2  jdolecek 		sc->sc_rate = SPS8000;
    372  1.1.8.2  jdolecek 		break;
    373  1.1.8.2  jdolecek 	case 11025:
    374  1.1.8.2  jdolecek 		sc->sc_rate = SPS11025;
    375  1.1.8.2  jdolecek 		break;
    376  1.1.8.2  jdolecek 	case 22050:
    377  1.1.8.2  jdolecek 		sc->sc_rate = SPS22050;
    378  1.1.8.2  jdolecek 		break;
    379  1.1.8.2  jdolecek 	case 44100:
    380  1.1.8.2  jdolecek 		sc->sc_rate = SPS44100;
    381  1.1.8.2  jdolecek 		break;
    382  1.1.8.2  jdolecek 	default:
    383  1.1.8.2  jdolecek 		DPRINTFN(0, ("vraiu_set_params: rate error (%ld)\n",
    384  1.1.8.2  jdolecek 			     play->sample_rate));
    385  1.1.8.2  jdolecek 		return EINVAL;
    386  1.1.8.2  jdolecek 	}
    387  1.1.8.2  jdolecek 
    388  1.1.8.2  jdolecek 	switch (play->precision) {
    389  1.1.8.2  jdolecek 	case 8:
    390  1.1.8.2  jdolecek 		switch (play->encoding) {
    391  1.1.8.2  jdolecek 		case AUDIO_ENCODING_ULAW:
    392  1.1.8.2  jdolecek 			switch (play->channels) {
    393  1.1.8.2  jdolecek 			case 1:
    394  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_ulaw_1;
    395  1.1.8.2  jdolecek 				break;
    396  1.1.8.2  jdolecek 			case 2:
    397  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_ulaw_2;
    398  1.1.8.2  jdolecek 				break;
    399  1.1.8.2  jdolecek 			default:
    400  1.1.8.2  jdolecek 				DPRINTFN(0, ("vraiu_set_params: channel error"
    401  1.1.8.2  jdolecek 					     " (%d)\n", play->channels));
    402  1.1.8.2  jdolecek 				return EINVAL;
    403  1.1.8.2  jdolecek 			}
    404  1.1.8.2  jdolecek 			break;
    405  1.1.8.2  jdolecek 		case AUDIO_ENCODING_SLINEAR:
    406  1.1.8.2  jdolecek 		case AUDIO_ENCODING_SLINEAR_BE:
    407  1.1.8.2  jdolecek 		case AUDIO_ENCODING_SLINEAR_LE:
    408  1.1.8.2  jdolecek 			switch (play->channels) {
    409  1.1.8.2  jdolecek 			case 1:
    410  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_slinear8_1;
    411  1.1.8.2  jdolecek 				break;
    412  1.1.8.2  jdolecek 			case 2:
    413  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_slinear8_2;
    414  1.1.8.2  jdolecek 				break;
    415  1.1.8.2  jdolecek 			default:
    416  1.1.8.2  jdolecek 				DPRINTFN(0, ("vraiu_set_params: channel error"
    417  1.1.8.2  jdolecek 					     " (%d)\n", play->channels));
    418  1.1.8.2  jdolecek 				return EINVAL;
    419  1.1.8.2  jdolecek 			}
    420  1.1.8.2  jdolecek 			break;
    421  1.1.8.2  jdolecek 		case AUDIO_ENCODING_ULINEAR:
    422  1.1.8.2  jdolecek 		case AUDIO_ENCODING_ULINEAR_BE:
    423  1.1.8.2  jdolecek 		case AUDIO_ENCODING_ULINEAR_LE:
    424  1.1.8.2  jdolecek 			switch (play->channels) {
    425  1.1.8.2  jdolecek 			case 1:
    426  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_ulinear8_1;
    427  1.1.8.2  jdolecek 				break;
    428  1.1.8.2  jdolecek 			case 2:
    429  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_ulinear8_2;
    430  1.1.8.2  jdolecek 				break;
    431  1.1.8.2  jdolecek 			default:
    432  1.1.8.2  jdolecek 				DPRINTFN(0, ("vraiu_set_params: channel error"
    433  1.1.8.2  jdolecek 					     " (%d)\n", play->channels));
    434  1.1.8.2  jdolecek 				return EINVAL;
    435  1.1.8.2  jdolecek 			}
    436  1.1.8.2  jdolecek 			break;
    437  1.1.8.2  jdolecek 		default:
    438  1.1.8.2  jdolecek 			DPRINTFN(0, ("vraiu_set_params: encoding error"
    439  1.1.8.2  jdolecek 				     " (%d)\n", play->encoding));
    440  1.1.8.2  jdolecek 			return EINVAL;
    441  1.1.8.2  jdolecek 		}
    442  1.1.8.2  jdolecek 		break;
    443  1.1.8.2  jdolecek 	case 16:
    444  1.1.8.2  jdolecek 		switch (play->encoding) {
    445  1.1.8.2  jdolecek #if BYTE_ORDER == BIG_ENDIAN
    446  1.1.8.2  jdolecek 		case AUDIO_ENCODING_SLINEAR:
    447  1.1.8.2  jdolecek #endif
    448  1.1.8.2  jdolecek 		case AUDIO_ENCODING_SLINEAR_BE:
    449  1.1.8.2  jdolecek 			switch (play->channels) {
    450  1.1.8.2  jdolecek 			case 1:
    451  1.1.8.2  jdolecek #if BYTE_ORDER == BIG_ENDIAN
    452  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_slinear16_1;
    453  1.1.8.2  jdolecek #else
    454  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_slinear16sw_1;
    455  1.1.8.2  jdolecek #endif
    456  1.1.8.2  jdolecek 				break;
    457  1.1.8.2  jdolecek 			case 2:
    458  1.1.8.2  jdolecek #if BYTE_ORDER == BIG_ENDIAN
    459  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_slinear16_2;
    460  1.1.8.2  jdolecek #else
    461  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_slinear16sw_2;
    462  1.1.8.2  jdolecek #endif
    463  1.1.8.2  jdolecek 				break;
    464  1.1.8.2  jdolecek 			default:
    465  1.1.8.2  jdolecek 				DPRINTFN(0, ("vraiu_set_params: channel error"
    466  1.1.8.2  jdolecek 					     " (%d)\n", play->channels));
    467  1.1.8.2  jdolecek 				return EINVAL;
    468  1.1.8.2  jdolecek 			}
    469  1.1.8.2  jdolecek 			break;
    470  1.1.8.2  jdolecek #if BYTE_ORDER == LITTLE_ENDIAN
    471  1.1.8.2  jdolecek 		case AUDIO_ENCODING_SLINEAR:
    472  1.1.8.2  jdolecek #endif
    473  1.1.8.2  jdolecek 		case AUDIO_ENCODING_SLINEAR_LE:
    474  1.1.8.2  jdolecek 			switch (play->channels) {
    475  1.1.8.2  jdolecek 			case 1:
    476  1.1.8.2  jdolecek #if BYTE_ORDER == LITTLE_ENDIAN
    477  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_slinear16_1;
    478  1.1.8.2  jdolecek #else
    479  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_slinear16sw_1;
    480  1.1.8.2  jdolecek #endif
    481  1.1.8.2  jdolecek 				break;
    482  1.1.8.2  jdolecek 			case 2:
    483  1.1.8.2  jdolecek #if BYTE_ORDER == LITTLE_ENDIAN
    484  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_slinear16_2;
    485  1.1.8.2  jdolecek #else
    486  1.1.8.2  jdolecek 				sc->sc_decodefunc = vraiu_slinear16sw_2;
    487  1.1.8.2  jdolecek #endif
    488  1.1.8.2  jdolecek 				break;
    489  1.1.8.2  jdolecek 			default:
    490  1.1.8.2  jdolecek 				DPRINTFN(0, ("vraiu_set_params: channel error"
    491  1.1.8.2  jdolecek 					     " (%d)\n", play->channels));
    492  1.1.8.2  jdolecek 				return EINVAL;
    493  1.1.8.2  jdolecek 			}
    494  1.1.8.2  jdolecek 			break;
    495  1.1.8.2  jdolecek 		default:
    496  1.1.8.2  jdolecek 			DPRINTFN(0, ("vraiu_set_params: encoding error"
    497  1.1.8.2  jdolecek 				     " (%d)\n", play->encoding));
    498  1.1.8.2  jdolecek 			return EINVAL;
    499  1.1.8.2  jdolecek 		}
    500  1.1.8.2  jdolecek 		break;
    501  1.1.8.2  jdolecek 	default:
    502  1.1.8.2  jdolecek 		DPRINTFN(0, ("vraiu_set_params: precision error (%d)\n",
    503  1.1.8.2  jdolecek 			     play->precision));
    504  1.1.8.2  jdolecek 		return EINVAL;
    505  1.1.8.2  jdolecek 	}
    506  1.1.8.2  jdolecek 
    507  1.1.8.2  jdolecek 	sc->sc_encoding = play->encoding;
    508  1.1.8.2  jdolecek 	sc->sc_precision = play->precision;
    509  1.1.8.2  jdolecek 	sc->sc_channels = play->channels;
    510  1.1.8.2  jdolecek 	return 0;
    511  1.1.8.2  jdolecek }
    512  1.1.8.2  jdolecek 
    513  1.1.8.2  jdolecek int
    514  1.1.8.2  jdolecek vraiu_round_blocksize(void *self, int bs)
    515  1.1.8.2  jdolecek {
    516  1.1.8.2  jdolecek 	struct vraiu_softc *sc = (void*)self;
    517  1.1.8.2  jdolecek 	int n = AUDIO_BUF_SIZE;
    518  1.1.8.2  jdolecek 
    519  1.1.8.2  jdolecek 	if (sc->sc_precision == 8)
    520  1.1.8.2  jdolecek 		n /= 2;
    521  1.1.8.2  jdolecek 	n *= sc->sc_channels;
    522  1.1.8.2  jdolecek 
    523  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_round_blocksize: upper %d, lower %d\n",
    524  1.1.8.2  jdolecek 		     bs, n));
    525  1.1.8.2  jdolecek 
    526  1.1.8.2  jdolecek 	return n;
    527  1.1.8.2  jdolecek }
    528  1.1.8.2  jdolecek 
    529  1.1.8.2  jdolecek int
    530  1.1.8.2  jdolecek vraiu_commit_settings(void *self)
    531  1.1.8.2  jdolecek {
    532  1.1.8.2  jdolecek 	struct vraiu_softc *sc = (void*)self;
    533  1.1.8.2  jdolecek 	int err;
    534  1.1.8.2  jdolecek 
    535  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_commit_settings\n"));
    536  1.1.8.2  jdolecek 
    537  1.1.8.2  jdolecek 	if (sc->sc_status != EBUSY)
    538  1.1.8.2  jdolecek 		return sc->sc_status;
    539  1.1.8.2  jdolecek 
    540  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_commit_settings: set conversion rate %d\n",
    541  1.1.8.2  jdolecek 		     sc->sc_rate))
    542  1.1.8.2  jdolecek 	bus_space_write_2(sc->sc_iot, sc->sc_ioh, SCNVR_REG_W, sc->sc_rate);
    543  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_commit_settings: clock supply start\n"))
    544  1.1.8.2  jdolecek 	if ((err = sc->sc_cc->cc_clock(sc->sc_cc, VR4102_CMUMSKAIU, 1))) {
    545  1.1.8.2  jdolecek 		DPRINTFN(0, ("vraiu_commit_settings: clock supply error\n"));
    546  1.1.8.2  jdolecek 		return err;
    547  1.1.8.2  jdolecek 	}
    548  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_commit_settings: enable DMA\n"))
    549  1.1.8.2  jdolecek 	if ((err = sc->sc_dc->dc_enable_aiuout(sc->sc_dc))) {
    550  1.1.8.2  jdolecek 		sc->sc_cc->cc_clock(sc->sc_cc, VR4102_CMUMSKAIU, 0);
    551  1.1.8.2  jdolecek 		DPRINTFN(0, ("vraiu_commit_settings: enable dma error\n"));
    552  1.1.8.2  jdolecek 		return err;
    553  1.1.8.2  jdolecek 	}
    554  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_commit_settings: Vref on\n"))
    555  1.1.8.2  jdolecek 	bus_space_write_2(sc->sc_iot, sc->sc_ioh, SCNT_REG_W, DAENAIU);
    556  1.1.8.2  jdolecek 	return 0;
    557  1.1.8.2  jdolecek }
    558  1.1.8.2  jdolecek 
    559  1.1.8.2  jdolecek int
    560  1.1.8.2  jdolecek vraiu_init_output(void *self, void *buffer, int size)
    561  1.1.8.2  jdolecek {
    562  1.1.8.2  jdolecek 	struct vraiu_softc *sc = (void*)self;
    563  1.1.8.2  jdolecek 
    564  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_init_output: buffer %p, size %d\n", buffer, size));
    565  1.1.8.2  jdolecek 
    566  1.1.8.2  jdolecek 	sc->sc_intr = NULL;
    567  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_init_output: speaker power on\n"))
    568  1.1.8.2  jdolecek 	config_hook_call(CONFIG_HOOK_POWERCONTROL,
    569  1.1.8.2  jdolecek 			 CONFIG_HOOK_POWERCONTROL_SPEAKER, (void*)1);
    570  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_init_output: start output\n"))
    571  1.1.8.2  jdolecek 	bus_space_write_2(sc->sc_iot, sc->sc_ioh, SEQ_REG_W, AIUSEN);
    572  1.1.8.2  jdolecek 	return 0;
    573  1.1.8.2  jdolecek }
    574  1.1.8.2  jdolecek 
    575  1.1.8.2  jdolecek int
    576  1.1.8.2  jdolecek vraiu_start_output(void *self, void *block, int bsize,
    577  1.1.8.2  jdolecek 		   void (*intr)(void *), void *intrarg)
    578  1.1.8.2  jdolecek {
    579  1.1.8.2  jdolecek 	struct vraiu_softc *sc = (void*)self;
    580  1.1.8.2  jdolecek 
    581  1.1.8.2  jdolecek 	DPRINTFN(2, ("vraiu_start_output: block %p, bsize %d\n",
    582  1.1.8.2  jdolecek 		     block, bsize));
    583  1.1.8.2  jdolecek 	sc->sc_decodefunc(sc, sc->sc_buf, block, bsize);
    584  1.1.8.2  jdolecek 	bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, AUDIO_BUF_SIZE,
    585  1.1.8.2  jdolecek 			BUS_DMASYNC_PREWRITE);
    586  1.1.8.2  jdolecek 	sc->sc_intr = intr;
    587  1.1.8.2  jdolecek 	sc->sc_intrdata = intrarg;
    588  1.1.8.2  jdolecek 	/* clear interrupt status */
    589  1.1.8.2  jdolecek 	bus_space_write_2(sc->sc_iot, sc->sc_ioh, INT_REG_W,
    590  1.1.8.2  jdolecek 			  SENDINTR | SINTR | SIDLEINTR);
    591  1.1.8.2  jdolecek 	/* enable interrupt */
    592  1.1.8.2  jdolecek 	vrip_intr_setmask2(sc->sc_vrip, sc->sc_handler, AIUINT_INTSEND, 1);
    593  1.1.8.2  jdolecek 	return 0;
    594  1.1.8.2  jdolecek }
    595  1.1.8.2  jdolecek 
    596  1.1.8.2  jdolecek int
    597  1.1.8.2  jdolecek vraiu_start_input(void *self, void *block, int bsize,
    598  1.1.8.2  jdolecek 		  void (*intr)(void *), void *intrarg)
    599  1.1.8.2  jdolecek {
    600  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_start_input\n"));
    601  1.1.8.2  jdolecek 
    602  1.1.8.2  jdolecek 	/* no input */
    603  1.1.8.2  jdolecek 	return ENXIO;
    604  1.1.8.2  jdolecek }
    605  1.1.8.2  jdolecek 
    606  1.1.8.2  jdolecek int
    607  1.1.8.2  jdolecek vraiu_intr(void* self)
    608  1.1.8.2  jdolecek {
    609  1.1.8.2  jdolecek 	struct vraiu_softc *sc = (void*)self;
    610  1.1.8.2  jdolecek 	u_int32_t reg;
    611  1.1.8.2  jdolecek 
    612  1.1.8.2  jdolecek 	DPRINTFN(2, ("vraiu_intr"));
    613  1.1.8.2  jdolecek 
    614  1.1.8.2  jdolecek 	vrip_intr_setmask2(sc->sc_vrip, sc->sc_handler, AIUINT_INTSEND, 0);
    615  1.1.8.2  jdolecek 	vrip_intr_getstatus2(sc->sc_vrip, sc->sc_handler, &reg);
    616  1.1.8.2  jdolecek 	if (reg & AIUINT_INTSEND) {
    617  1.1.8.2  jdolecek 		DPRINTFN(2, (": AIUINT_INTSEND"));
    618  1.1.8.2  jdolecek 		if (sc->sc_intr) {
    619  1.1.8.2  jdolecek 			void (*intr)(void *) = sc->sc_intr;
    620  1.1.8.2  jdolecek 			sc->sc_intr = NULL;
    621  1.1.8.2  jdolecek 			(*(intr))(sc->sc_intrdata);
    622  1.1.8.2  jdolecek 		}
    623  1.1.8.2  jdolecek 		bus_space_write_2(sc->sc_iot, sc->sc_ioh, INT_REG_W, SENDINTR);
    624  1.1.8.2  jdolecek 	}
    625  1.1.8.2  jdolecek 	DPRINTFN(2, ("\n"));
    626  1.1.8.2  jdolecek 	return 0;
    627  1.1.8.2  jdolecek }
    628  1.1.8.2  jdolecek 
    629  1.1.8.2  jdolecek int
    630  1.1.8.2  jdolecek vraiu_halt_output(void *self)
    631  1.1.8.2  jdolecek {
    632  1.1.8.2  jdolecek 	struct vraiu_softc *sc = (void*)self;
    633  1.1.8.2  jdolecek 
    634  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_halt_output\n"));
    635  1.1.8.2  jdolecek 
    636  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_halt_output: disable interrupt\n"))
    637  1.1.8.2  jdolecek 	vrip_intr_setmask2(sc->sc_vrip, sc->sc_handler, AIUINT_INTSEND, 0);
    638  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_halt_output: stop output\n"))
    639  1.1.8.2  jdolecek 	bus_space_write_2(sc->sc_iot, sc->sc_ioh, SEQ_REG_W, 0);
    640  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_halt_output: speaker power off\n"))
    641  1.1.8.2  jdolecek 	config_hook_call(CONFIG_HOOK_POWERCONTROL,
    642  1.1.8.2  jdolecek 			 CONFIG_HOOK_POWERCONTROL_SPEAKER, (void*)0);
    643  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_halt_output: Vref off\n"))
    644  1.1.8.2  jdolecek 	bus_space_write_2(sc->sc_iot, sc->sc_ioh, SCNT_REG_W, 0);
    645  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_halt_output: disable DMA\n"))
    646  1.1.8.2  jdolecek 	sc->sc_dc->dc_disable(sc->sc_dc);
    647  1.1.8.2  jdolecek 	DPRINTFN(1, ("vraiu_halt_output: clock supply stop\n"))
    648  1.1.8.2  jdolecek 	sc->sc_cc->cc_clock(sc->sc_cc, VR4102_CMUMSKAIU, 0);
    649  1.1.8.2  jdolecek 	sc->sc_intr = NULL;
    650  1.1.8.2  jdolecek 	return 0;
    651  1.1.8.2  jdolecek }
    652  1.1.8.2  jdolecek 
    653  1.1.8.2  jdolecek int
    654  1.1.8.2  jdolecek vraiu_halt_input(void *self)
    655  1.1.8.2  jdolecek {
    656  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_halt_input\n"));
    657  1.1.8.2  jdolecek 
    658  1.1.8.2  jdolecek 	/* no input */
    659  1.1.8.2  jdolecek 	return ENXIO;
    660  1.1.8.2  jdolecek }
    661  1.1.8.2  jdolecek 
    662  1.1.8.2  jdolecek 
    663  1.1.8.2  jdolecek int
    664  1.1.8.2  jdolecek vraiu_getdev(void *self, struct audio_device *ret)
    665  1.1.8.2  jdolecek {
    666  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_getdev\n"));
    667  1.1.8.2  jdolecek 
    668  1.1.8.2  jdolecek 	*ret = aiu_device;
    669  1.1.8.2  jdolecek 	return 0;
    670  1.1.8.2  jdolecek }
    671  1.1.8.2  jdolecek 
    672  1.1.8.2  jdolecek int
    673  1.1.8.2  jdolecek vraiu_set_port(void *self, mixer_ctrl_t *mc)
    674  1.1.8.2  jdolecek {
    675  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_set_port\n"));
    676  1.1.8.2  jdolecek 
    677  1.1.8.2  jdolecek 	/* no mixer */
    678  1.1.8.2  jdolecek 	return EINVAL;
    679  1.1.8.2  jdolecek }
    680  1.1.8.2  jdolecek 
    681  1.1.8.2  jdolecek int
    682  1.1.8.2  jdolecek vraiu_get_port(void *self, mixer_ctrl_t *mc)
    683  1.1.8.2  jdolecek {
    684  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_get_port\n"));
    685  1.1.8.2  jdolecek 
    686  1.1.8.2  jdolecek 	/* no mixer */
    687  1.1.8.2  jdolecek 	return EINVAL;
    688  1.1.8.2  jdolecek }
    689  1.1.8.2  jdolecek 
    690  1.1.8.2  jdolecek int
    691  1.1.8.2  jdolecek vraiu_query_devinfo(void *self, mixer_devinfo_t *di)
    692  1.1.8.2  jdolecek {
    693  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_query_devinfo\n"));
    694  1.1.8.2  jdolecek 
    695  1.1.8.2  jdolecek 	/* no mixer */
    696  1.1.8.2  jdolecek 	return ENXIO;
    697  1.1.8.2  jdolecek }
    698  1.1.8.2  jdolecek 
    699  1.1.8.2  jdolecek int
    700  1.1.8.2  jdolecek vraiu_get_props(void *self)
    701  1.1.8.2  jdolecek {
    702  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_get_props\n"));
    703  1.1.8.2  jdolecek 
    704  1.1.8.2  jdolecek 	return 0;
    705  1.1.8.2  jdolecek }
    706  1.1.8.2  jdolecek 
    707  1.1.8.2  jdolecek unsigned char ulaw_to_lin[] = {
    708  1.1.8.2  jdolecek 	0x02, 0x06, 0x0a, 0x0e, 0x12, 0x16, 0x1a, 0x1e,
    709  1.1.8.2  jdolecek 	0x22, 0x26, 0x2a, 0x2e, 0x32, 0x36, 0x3a, 0x3e,
    710  1.1.8.2  jdolecek 	0x41, 0x43, 0x45, 0x47, 0x49, 0x4b, 0x4d, 0x4f,
    711  1.1.8.2  jdolecek 	0x51, 0x53, 0x55, 0x57, 0x59, 0x5b, 0x5d, 0x5f,
    712  1.1.8.2  jdolecek 	0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
    713  1.1.8.2  jdolecek 	0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70,
    714  1.1.8.2  jdolecek 	0x70, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x74,
    715  1.1.8.2  jdolecek 	0x74, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77, 0x78,
    716  1.1.8.2  jdolecek 	0x78, 0x78, 0x79, 0x79, 0x79, 0x79, 0x7a, 0x7a,
    717  1.1.8.2  jdolecek 	0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c,
    718  1.1.8.2  jdolecek 	0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d,
    719  1.1.8.2  jdolecek 	0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e,
    720  1.1.8.2  jdolecek 	0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e,
    721  1.1.8.2  jdolecek 	0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
    722  1.1.8.2  jdolecek 	0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
    723  1.1.8.2  jdolecek 	0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80,
    724  1.1.8.2  jdolecek 	0xfd, 0xf9, 0xf5, 0xf1, 0xed, 0xe9, 0xe5, 0xe1,
    725  1.1.8.2  jdolecek 	0xdd, 0xd9, 0xd5, 0xd1, 0xcd, 0xc9, 0xc5, 0xc1,
    726  1.1.8.2  jdolecek 	0xbe, 0xbc, 0xba, 0xb8, 0xb6, 0xb4, 0xb2, 0xb0,
    727  1.1.8.2  jdolecek 	0xae, 0xac, 0xaa, 0xa8, 0xa6, 0xa4, 0xa2, 0xa0,
    728  1.1.8.2  jdolecek 	0x9e, 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98, 0x97,
    729  1.1.8.2  jdolecek 	0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8f,
    730  1.1.8.2  jdolecek 	0x8f, 0x8e, 0x8e, 0x8d, 0x8d, 0x8c, 0x8c, 0x8b,
    731  1.1.8.2  jdolecek 	0x8b, 0x8a, 0x8a, 0x89, 0x89, 0x88, 0x88, 0x87,
    732  1.1.8.2  jdolecek 	0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x85, 0x85,
    733  1.1.8.2  jdolecek 	0x85, 0x85, 0x84, 0x84, 0x84, 0x84, 0x83, 0x83,
    734  1.1.8.2  jdolecek 	0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82,
    735  1.1.8.2  jdolecek 	0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81,
    736  1.1.8.2  jdolecek 	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
    737  1.1.8.2  jdolecek 	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
    738  1.1.8.2  jdolecek 	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
    739  1.1.8.2  jdolecek 	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
    740  1.1.8.2  jdolecek };
    741  1.1.8.2  jdolecek 
    742  1.1.8.2  jdolecek static void
    743  1.1.8.2  jdolecek vraiu_slinear8_1(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
    744  1.1.8.2  jdolecek {
    745  1.1.8.2  jdolecek 	char *q = (char*)p;
    746  1.1.8.2  jdolecek 
    747  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_slinear8_1\n"));
    748  1.1.8.2  jdolecek 
    749  1.1.8.2  jdolecek #ifdef DIAGNOSTIC
    750  1.1.8.2  jdolecek 	if (n > AUDIO_BUF_SIZE/2) {
    751  1.1.8.2  jdolecek 		printf("%s: output data too large (%d > %d)\n",
    752  1.1.8.2  jdolecek 		       sc->sc_dev.dv_xname, n, AUDIO_BUF_SIZE/2);
    753  1.1.8.2  jdolecek 		n = AUDIO_BUF_SIZE/2;
    754  1.1.8.2  jdolecek 	}
    755  1.1.8.2  jdolecek #endif
    756  1.1.8.2  jdolecek 	while (n--) {
    757  1.1.8.2  jdolecek 		short i = *q++;
    758  1.1.8.2  jdolecek 		*dmap++ = (i << 2) + 0x200;
    759  1.1.8.2  jdolecek 	}
    760  1.1.8.2  jdolecek }
    761  1.1.8.2  jdolecek 
    762  1.1.8.2  jdolecek static void
    763  1.1.8.2  jdolecek vraiu_slinear8_2(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
    764  1.1.8.2  jdolecek {
    765  1.1.8.2  jdolecek 	char *q = (char*)p;
    766  1.1.8.2  jdolecek 
    767  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_slinear8_2\n"));
    768  1.1.8.2  jdolecek 
    769  1.1.8.2  jdolecek #ifdef DIAGNOSTIC
    770  1.1.8.2  jdolecek 	if (n > AUDIO_BUF_SIZE) {
    771  1.1.8.2  jdolecek 		printf("%s: output data too large (%d > %d)\n",
    772  1.1.8.2  jdolecek 		       sc->sc_dev.dv_xname, n, AUDIO_BUF_SIZE);
    773  1.1.8.2  jdolecek 		n = AUDIO_BUF_SIZE;
    774  1.1.8.2  jdolecek 	}
    775  1.1.8.2  jdolecek #endif
    776  1.1.8.2  jdolecek 	n /= 2;
    777  1.1.8.2  jdolecek 	while (n--) {
    778  1.1.8.2  jdolecek 		short i = *q++;
    779  1.1.8.2  jdolecek 		short j = *q++;
    780  1.1.8.2  jdolecek 		*dmap++ = ((i + j) << 1) + 0x200;
    781  1.1.8.2  jdolecek 	}
    782  1.1.8.2  jdolecek }
    783  1.1.8.2  jdolecek 
    784  1.1.8.2  jdolecek static void
    785  1.1.8.2  jdolecek vraiu_ulinear8_1(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
    786  1.1.8.2  jdolecek {
    787  1.1.8.2  jdolecek 	u_char *q = (u_char*)p;
    788  1.1.8.2  jdolecek 
    789  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_ulinear8_1\n"));
    790  1.1.8.2  jdolecek 
    791  1.1.8.2  jdolecek #ifdef DIAGNOSTIC
    792  1.1.8.2  jdolecek 	if (n > AUDIO_BUF_SIZE/2) {
    793  1.1.8.2  jdolecek 		printf("%s: output data too large (%d > %d)\n",
    794  1.1.8.2  jdolecek 		       sc->sc_dev.dv_xname, n, AUDIO_BUF_SIZE/2);
    795  1.1.8.2  jdolecek 		n = AUDIO_BUF_SIZE/2;
    796  1.1.8.2  jdolecek 	}
    797  1.1.8.2  jdolecek #endif
    798  1.1.8.2  jdolecek 	while (n--) {
    799  1.1.8.2  jdolecek 		short i = *q++;
    800  1.1.8.2  jdolecek 		*dmap++ = i << 2;
    801  1.1.8.2  jdolecek 	}
    802  1.1.8.2  jdolecek }
    803  1.1.8.2  jdolecek 
    804  1.1.8.2  jdolecek static void
    805  1.1.8.2  jdolecek vraiu_ulinear8_2(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
    806  1.1.8.2  jdolecek {
    807  1.1.8.2  jdolecek 	u_char *q = (u_char*)p;
    808  1.1.8.2  jdolecek 
    809  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_ulinear8_2\n"));
    810  1.1.8.2  jdolecek 
    811  1.1.8.2  jdolecek #ifdef DIAGNOSTIC
    812  1.1.8.2  jdolecek 	if (n > AUDIO_BUF_SIZE) {
    813  1.1.8.2  jdolecek 		printf("%s: output data too large (%d > %d)\n",
    814  1.1.8.2  jdolecek 		       sc->sc_dev.dv_xname, n, AUDIO_BUF_SIZE);
    815  1.1.8.2  jdolecek 		n = AUDIO_BUF_SIZE;
    816  1.1.8.2  jdolecek 	}
    817  1.1.8.2  jdolecek #endif
    818  1.1.8.2  jdolecek 	n /= 2;
    819  1.1.8.2  jdolecek 	while (n--) {
    820  1.1.8.2  jdolecek 		short i = *q++;
    821  1.1.8.2  jdolecek 		short j = *q++;
    822  1.1.8.2  jdolecek 		*dmap++ = (i + j) << 1;
    823  1.1.8.2  jdolecek 	}
    824  1.1.8.2  jdolecek }
    825  1.1.8.2  jdolecek 
    826  1.1.8.2  jdolecek static void
    827  1.1.8.2  jdolecek vraiu_ulaw_1(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
    828  1.1.8.2  jdolecek {
    829  1.1.8.2  jdolecek 	u_char *q = (u_char*)p;
    830  1.1.8.2  jdolecek 
    831  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_ulaw_1\n"));
    832  1.1.8.2  jdolecek 
    833  1.1.8.2  jdolecek #ifdef DIAGNOSTIC
    834  1.1.8.2  jdolecek 	if (n > AUDIO_BUF_SIZE/2) {
    835  1.1.8.2  jdolecek 		printf("%s: output data too large (%d > %d)\n",
    836  1.1.8.2  jdolecek 		       sc->sc_dev.dv_xname, n, AUDIO_BUF_SIZE/2);
    837  1.1.8.2  jdolecek 		n = AUDIO_BUF_SIZE/2;
    838  1.1.8.2  jdolecek 	}
    839  1.1.8.2  jdolecek #endif
    840  1.1.8.2  jdolecek 	while (n--) {
    841  1.1.8.2  jdolecek 		short i = ulaw_to_lin[*q++];
    842  1.1.8.2  jdolecek 		*dmap++ = i << 2;
    843  1.1.8.2  jdolecek 	}
    844  1.1.8.2  jdolecek }
    845  1.1.8.2  jdolecek 
    846  1.1.8.2  jdolecek static void
    847  1.1.8.2  jdolecek vraiu_ulaw_2(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
    848  1.1.8.2  jdolecek {
    849  1.1.8.2  jdolecek 	u_char *q = (u_char*)p;
    850  1.1.8.2  jdolecek 
    851  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_ulaw_2\n"));
    852  1.1.8.2  jdolecek 
    853  1.1.8.2  jdolecek #ifdef DIAGNOSTIC
    854  1.1.8.2  jdolecek 	if (n > AUDIO_BUF_SIZE) {
    855  1.1.8.2  jdolecek 		printf("%s: output data too large (%d > %d)\n",
    856  1.1.8.2  jdolecek 		       sc->sc_dev.dv_xname, n, AUDIO_BUF_SIZE);
    857  1.1.8.2  jdolecek 		n = AUDIO_BUF_SIZE;
    858  1.1.8.2  jdolecek 	}
    859  1.1.8.2  jdolecek #endif
    860  1.1.8.2  jdolecek 	n /= 2;
    861  1.1.8.2  jdolecek 	while (n--) {
    862  1.1.8.2  jdolecek 		short i = ulaw_to_lin[*q++];
    863  1.1.8.2  jdolecek 		short j = ulaw_to_lin[*q++];
    864  1.1.8.2  jdolecek 		*dmap++ = (i + j) << 1;
    865  1.1.8.2  jdolecek 	}
    866  1.1.8.2  jdolecek }
    867  1.1.8.2  jdolecek 
    868  1.1.8.2  jdolecek static void
    869  1.1.8.2  jdolecek vraiu_slinear16_1(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
    870  1.1.8.2  jdolecek {
    871  1.1.8.2  jdolecek 	short *q = (short*)p;
    872  1.1.8.2  jdolecek 
    873  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_slinear16_1\n"));
    874  1.1.8.2  jdolecek 
    875  1.1.8.2  jdolecek #ifdef DIAGNOSTIC
    876  1.1.8.2  jdolecek 	if (n > AUDIO_BUF_SIZE) {
    877  1.1.8.2  jdolecek 		printf("%s: output data too large (%d > %d)\n",
    878  1.1.8.2  jdolecek 		       sc->sc_dev.dv_xname, n, AUDIO_BUF_SIZE);
    879  1.1.8.2  jdolecek 		n = AUDIO_BUF_SIZE;
    880  1.1.8.2  jdolecek 	}
    881  1.1.8.2  jdolecek #endif
    882  1.1.8.2  jdolecek 	n /= 2;
    883  1.1.8.2  jdolecek 	while (n--) {
    884  1.1.8.2  jdolecek 		short i = *q++;
    885  1.1.8.2  jdolecek 		*dmap++ = (i >> 6) + 0x200;
    886  1.1.8.2  jdolecek 	}
    887  1.1.8.2  jdolecek }
    888  1.1.8.2  jdolecek 
    889  1.1.8.2  jdolecek static void
    890  1.1.8.2  jdolecek vraiu_slinear16_2(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
    891  1.1.8.2  jdolecek {
    892  1.1.8.2  jdolecek 	short *q = (short*)p;
    893  1.1.8.2  jdolecek 
    894  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_slinear16_2\n"));
    895  1.1.8.2  jdolecek 
    896  1.1.8.2  jdolecek #ifdef DIAGNOSTIC
    897  1.1.8.2  jdolecek 	if (n > AUDIO_BUF_SIZE*2) {
    898  1.1.8.2  jdolecek 		printf("%s: output data too large (%d > %d)\n",
    899  1.1.8.2  jdolecek 		       sc->sc_dev.dv_xname, n, AUDIO_BUF_SIZE*2);
    900  1.1.8.2  jdolecek 		n = AUDIO_BUF_SIZE*2;
    901  1.1.8.2  jdolecek 	}
    902  1.1.8.2  jdolecek #endif
    903  1.1.8.2  jdolecek 	n /= 4;
    904  1.1.8.2  jdolecek 	while (n--) {
    905  1.1.8.2  jdolecek 		short i = *q++;
    906  1.1.8.2  jdolecek 		short j = *q++;
    907  1.1.8.2  jdolecek 		*dmap++ = (i >> 7) + (j >> 7) + 0x200;
    908  1.1.8.2  jdolecek 	}
    909  1.1.8.2  jdolecek }
    910  1.1.8.2  jdolecek 
    911  1.1.8.2  jdolecek static void
    912  1.1.8.2  jdolecek vraiu_slinear16sw_1(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
    913  1.1.8.2  jdolecek {
    914  1.1.8.2  jdolecek 	short *q = (short*)p;
    915  1.1.8.2  jdolecek 
    916  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_slinear16sw_1\n"));
    917  1.1.8.2  jdolecek 
    918  1.1.8.2  jdolecek #ifdef DIAGNOSTIC
    919  1.1.8.2  jdolecek 	if (n > AUDIO_BUF_SIZE) {
    920  1.1.8.2  jdolecek 		printf("%s: output data too large (%d > %d)\n",
    921  1.1.8.2  jdolecek 		       sc->sc_dev.dv_xname, n, AUDIO_BUF_SIZE);
    922  1.1.8.2  jdolecek 		n = AUDIO_BUF_SIZE;
    923  1.1.8.2  jdolecek 	}
    924  1.1.8.2  jdolecek #endif
    925  1.1.8.2  jdolecek 	n /= 2;
    926  1.1.8.2  jdolecek 	while (n--) {
    927  1.1.8.2  jdolecek 		short i = bswap16(*q++);
    928  1.1.8.2  jdolecek 		*dmap++ = (i >> 6) + 0x200;
    929  1.1.8.2  jdolecek 	}
    930  1.1.8.2  jdolecek }
    931  1.1.8.2  jdolecek 
    932  1.1.8.2  jdolecek static void
    933  1.1.8.2  jdolecek vraiu_slinear16sw_2(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
    934  1.1.8.2  jdolecek {
    935  1.1.8.2  jdolecek 	short *q = (short*)p;
    936  1.1.8.2  jdolecek 
    937  1.1.8.2  jdolecek 	DPRINTFN(3, ("vraiu_slinear16sw_2\n"));
    938  1.1.8.2  jdolecek 
    939  1.1.8.2  jdolecek #ifdef DIAGNOSTIC
    940  1.1.8.2  jdolecek 	if (n > AUDIO_BUF_SIZE*2) {
    941  1.1.8.2  jdolecek 		printf("%s: output data too large (%d > %d)\n",
    942  1.1.8.2  jdolecek 		       sc->sc_dev.dv_xname, n, AUDIO_BUF_SIZE*2);
    943  1.1.8.2  jdolecek 		n = AUDIO_BUF_SIZE*2;
    944  1.1.8.2  jdolecek 	}
    945  1.1.8.2  jdolecek #endif
    946  1.1.8.2  jdolecek 	n /= 4;
    947  1.1.8.2  jdolecek 	while (n--) {
    948  1.1.8.2  jdolecek 		short i = bswap16(*q++);
    949  1.1.8.2  jdolecek 		short j = bswap16(*q++);
    950  1.1.8.2  jdolecek 		*dmap++ = (i >> 7) + (j >> 7) + 0x200;
    951  1.1.8.2  jdolecek 	}
    952  1.1.8.2  jdolecek }
    953