Home | History | Annotate | Line # | Download | only in dev
aucc.c revision 1.23
      1  1.23  augustss /*	$NetBSD: aucc.c,v 1.23 1998/08/17 21:16:09 augustss Exp $	*/
      2  1.20  augustss 
      3   1.1        is /*
      4   1.1        is  * Copyright (c) 1997 Stephan Thesing
      5   1.1        is  * All rights reserved.
      6   1.1        is  *
      7   1.1        is  * Redistribution and use in source and binary forms, with or without
      8   1.1        is  * modification, are permitted provided that the following conditions
      9   1.1        is  * are met:
     10   1.1        is  * 1. Redistributions of source code must retain the above copyright
     11   1.1        is  *    notice, this list of conditions and the following disclaimer.
     12   1.1        is  * 2. Redistributions in binary form must reproduce the above copyright
     13   1.1        is  *    notice, this list of conditions and the following disclaimer in the
     14   1.1        is  *    documentation and/or other materials provided with the distribution.
     15   1.1        is  * 3. All advertising materials mentioning features or use of this software
     16   1.1        is  *    must display the following acknowledgement:
     17   1.1        is  *      This product includes software developed by Stephan Thesing.
     18   1.1        is  * 4. The name of the author may not be used to endorse or promote products
     19   1.1        is  *    derived from this software without specific prior written permission
     20   1.1        is  *
     21   1.1        is  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     22   1.1        is  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     23   1.1        is  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     24   1.1        is  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     25   1.1        is  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     26   1.1        is  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27   1.1        is  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28   1.1        is  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29   1.1        is  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     30   1.1        is  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31   1.1        is  */
     32   1.1        is 
     33   1.1        is #include "aucc.h"
     34   1.1        is #if NAUCC > 0
     35   1.5        is 
     36   1.1        is #include <sys/param.h>
     37   1.1        is #include <sys/systm.h>
     38   1.1        is #include <sys/errno.h>
     39   1.1        is #include <sys/ioctl.h>
     40   1.1        is #include <sys/device.h>
     41   1.1        is #include <sys/proc.h>
     42   1.1        is #include <machine/cpu.h>
     43   1.1        is 
     44   1.1        is #include <sys/audioio.h>
     45   1.1        is #include <dev/audio_if.h>
     46   1.1        is #include <amiga/amiga/cc.h>
     47   1.1        is #include <amiga/amiga/custom.h>
     48   1.1        is #include <amiga/amiga/device.h>
     49   1.1        is #include <amiga/dev/auccvar.h>
     50   1.1        is 
     51   1.7        is 
     52   1.7        is #ifdef LEV6_DEFER
     53   1.7        is #define AUCC_MAXINT 3
     54   1.7        is #define AUCC_ALLINTF (INTF_AUD0|INTF_AUD1|INTF_AUD2)
     55   1.7        is #else
     56   1.7        is #define AUCC_MAXINT 4
     57   1.7        is #define AUCC_ALLINTF (INTF_AUD0|INTF_AUD1|INTF_AUD2|INTF_AUD3)
     58   1.7        is #endif
     59   1.7        is /* this unconditionally; we may use AUD3 as slave channel with LEV6_DEFER */
     60   1.7        is #define AUCC_ALLDMAF (DMAF_AUD0|DMAF_AUD1|DMAF_AUD2|DMAF_AUD3)
     61   1.7        is 
     62   1.1        is #ifdef AUDIO_DEBUG
     63   1.1        is /*extern printf __P((const char *,...));*/
     64   1.1        is int     auccdebug = 1;
     65   1.1        is #define DPRINTF(x)      if (auccdebug) printf x
     66   1.1        is #else
     67   1.1        is #define DPRINTF(x)
     68   1.1        is #endif
     69   1.1        is 
     70   1.1        is #ifdef splaudio
     71   1.1        is #undef splaudio
     72   1.1        is #endif
     73   1.1        is 
     74   1.1        is #define splaudio() spl4();
     75   1.1        is 
     76   1.1        is /* clock frequency.. */
     77   1.1        is extern int eclockfreq;
     78   1.1        is 
     79   1.1        is 
     80   1.1        is /* hw audio ch */
     81   1.1        is extern struct audio_channel channel[4];
     82   1.1        is 
     83   1.1        is 
     84   1.1        is /*
     85   1.1        is  * Software state.
     86   1.1        is  */
     87   1.1        is struct aucc_softc {
     88   1.1        is 	struct	device sc_dev;		/* base device */
     89   1.1        is 
     90   1.1        is 	int	sc_open;		/* single use device */
     91   1.1        is 	aucc_data_t sc_channel[4];	/* per channel freq, ... */
     92   1.1        is 	u_int	sc_encoding;		/* encoding AUDIO_ENCODING_.*/
     93   1.1        is 	int	sc_channels;		/* # of channels used */
     94   1.1        is 
     95   1.1        is 	int	sc_intrcnt;		/* interrupt count */
     96   1.1        is 	int	sc_channelmask;  	/* which channels are used ? */
     97   1.1        is };
     98   1.1        is 
     99   1.1        is /* interrupt interfaces */
    100   1.1        is void aucc_inthdl __P((int));
    101   1.1        is 
    102   1.1        is /* forward declarations */
    103   1.1        is static int init_aucc __P((struct aucc_softc *));
    104   1.1        is static u_int freqtoper  __P((u_int));
    105   1.1        is static u_int pertofreq  __P((u_int));
    106   1.1        is 
    107   1.1        is /* autoconfiguration driver */
    108   1.1        is void	auccattach __P((struct device *, struct device *, void *));
    109   1.1        is int	auccmatch __P((struct device *, struct cfdata *, void *));
    110   1.1        is 
    111   1.1        is struct cfattach aucc_ca = {
    112   1.1        is 	sizeof(struct aucc_softc),
    113   1.1        is 	auccmatch,
    114   1.1        is 	auccattach
    115   1.1        is };
    116   1.1        is 
    117   1.1        is struct audio_device aucc_device = {
    118   1.1        is 	"Amiga-audio",
    119   1.1        is 	"x",
    120   1.1        is 	"aucc"
    121   1.1        is };
    122   1.1        is 
    123   1.1        is 
    124   1.1        is struct aucc_softc *aucc=NULL;
    125   1.1        is 
    126   1.1        is 
    127   1.1        is unsigned char ulaw_to_lin[] = {
    128   1.2        is 	0x82, 0x86, 0x8a, 0x8e, 0x92, 0x96, 0x9a, 0x9e,
    129   1.2        is 	0xa2, 0xa6, 0xaa, 0xae, 0xb2, 0xb6, 0xba, 0xbe,
    130   1.2        is 	0xc1, 0xc3, 0xc5, 0xc7, 0xc9, 0xcb, 0xcd, 0xcf,
    131   1.2        is 	0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf,
    132   1.2        is 	0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8,
    133   1.2        is 	0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0,
    134   1.2        is 	0xf0, 0xf1, 0xf1, 0xf2, 0xf2, 0xf3, 0xf3, 0xf4,
    135   1.2        is 	0xf4, 0xf5, 0xf5, 0xf6, 0xf6, 0xf7, 0xf7, 0xf8,
    136   1.2        is 	0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa,
    137   1.2        is 	0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc,
    138   1.2        is 	0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd,
    139   1.2        is 	0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe,
    140   1.2        is 	0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
    141   1.2        is 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    142   1.2        is 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    143   1.2        is 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
    144   1.2        is 	0x7d, 0x79, 0x75, 0x71, 0x6d, 0x69, 0x65, 0x61,
    145   1.2        is 	0x5d, 0x59, 0x55, 0x51, 0x4d, 0x49, 0x45, 0x41,
    146   1.2        is 	0x3e, 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x32, 0x30,
    147   1.2        is 	0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20,
    148   1.2        is 	0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17,
    149   1.2        is 	0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f,
    150   1.2        is 	0x0f, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0b,
    151   1.2        is 	0x0b, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x07,
    152   1.2        is 	0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05,
    153   1.2        is 	0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03,
    154   1.2        is 	0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02,
    155   1.2        is 	0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
    156   1.2        is 	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
    157   1.2        is 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    158   1.2        is 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    159   1.2        is 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    160   1.1        is };
    161   1.1        is 
    162   1.1        is /*
    163   1.1        is  * Define our interface to the higher level audio driver.
    164   1.1        is  */
    165  1.16  augustss int	aucc_open __P((void *, int));
    166   1.1        is void	aucc_close __P((void *));
    167   1.1        is int	aucc_set_out_sr __P((void *, u_long));
    168   1.1        is int	aucc_query_encoding __P((void *, struct audio_encoding *));
    169   1.1        is int	aucc_round_blocksize __P((void *, int));
    170   1.1        is int	aucc_commit_settings __P((void *));
    171   1.1        is int	aucc_start_output __P((void *, void *, int, void (*)(void *),
    172   1.1        is 				  void *));
    173   1.1        is int	aucc_start_input __P((void *, void *, int, void (*)(void *),
    174   1.1        is 				 void *));
    175   1.1        is int	aucc_halt_output __P((void *));
    176   1.1        is int	aucc_halt_input __P((void *));
    177   1.1        is int	aucc_getdev __P((void *, struct audio_device *));
    178   1.1        is int	aucc_set_port __P((void *, mixer_ctrl_t *));
    179   1.1        is int	aucc_get_port __P((void *, mixer_ctrl_t *));
    180   1.1        is int	aucc_query_devinfo __P((void *, mixer_devinfo_t *));
    181   1.8        is void	aucc_encode __P((int, int, int, u_char *, u_short **));
    182  1.18  augustss int	aucc_set_params __P((void *, int, int,
    183  1.18  augustss 	    struct audio_params *, struct audio_params *));
    184  1.16  augustss int	aucc_get_props __P((void *));
    185   1.1        is 
    186   1.1        is struct audio_hw_if sa_hw_if = {
    187   1.1        is 	aucc_open,
    188   1.1        is 	aucc_close,
    189   1.1        is 	NULL,
    190   1.1        is 	aucc_query_encoding,
    191   1.1        is 	aucc_set_params,
    192   1.1        is 	aucc_round_blocksize,
    193   1.1        is 	aucc_commit_settings,
    194  1.14  augustss 	NULL,
    195  1.14  augustss 	NULL,
    196   1.1        is 	aucc_start_output,
    197   1.1        is 	aucc_start_input,
    198   1.1        is 	aucc_halt_output,
    199   1.1        is 	aucc_halt_input,
    200   1.1        is 	NULL,
    201   1.1        is 	aucc_getdev,
    202  1.13  augustss 	NULL,
    203   1.1        is 	aucc_set_port,
    204   1.1        is 	aucc_get_port,
    205   1.1        is 	aucc_query_devinfo,
    206  1.14  augustss 	NULL,
    207  1.14  augustss 	NULL,
    208  1.14  augustss 	NULL,
    209  1.15  augustss 	NULL,
    210  1.16  augustss 	aucc_get_props,
    211   1.1        is };
    212   1.1        is 
    213   1.1        is /* autoconfig routines */
    214   1.1        is 
    215   1.1        is int
    216   1.1        is auccmatch(pdp, cfp, aux)
    217   1.1        is 	struct device *pdp;
    218   1.1        is 	struct cfdata *cfp;
    219   1.1        is 	void *aux;
    220   1.1        is {
    221   1.1        is 	if (matchname((char *)aux, "aucc") &&
    222   1.1        is #ifdef DRACO
    223   1.1        is 	    !is_draco() &&
    224   1.1        is #endif
    225   1.1        is 	    (cfp->cf_unit == 0))
    226   1.1        is 		return 1;
    227   1.1        is 
    228   1.1        is 	return 0;
    229   1.1        is }
    230   1.1        is 
    231   1.1        is /*
    232   1.1        is  * Audio chip found.
    233   1.1        is  */
    234   1.1        is void
    235   1.1        is auccattach(parent, self, args)
    236   1.1        is 	struct device *parent, *self;
    237   1.1        is 	void *args;
    238   1.1        is {
    239   1.1        is 	register struct aucc_softc *sc = (struct aucc_softc *)self;
    240   1.1        is 	register int i;
    241   1.1        is 
    242   1.1        is 	printf("\n");
    243   1.1        is 
    244   1.1        is 	if((i=init_aucc(sc))) {
    245   1.1        is 		printf("audio: no chipmem\n");
    246   1.1        is 		return;
    247   1.1        is 	}
    248   1.1        is 
    249  1.23  augustss 	audio_attach_mi(&sa_hw_if, sc, &sc->sc_dev);
    250   1.1        is }
    251   1.1        is 
    252   1.1        is 
    253   1.1        is static int
    254   1.1        is init_aucc(sc)
    255   1.1        is 	struct aucc_softc *sc;
    256   1.1        is {
    257   1.1        is 	register int i, err=0;
    258   1.1        is 
    259   1.1        is 	/* init values per channel */
    260   1.1        is  	for (i=0;i<4;i++) {
    261   1.1        is 		sc->sc_channel[i].nd_freq=8000;
    262   1.1        is 		sc->sc_channel[i].nd_per=freqtoper(8000);
    263   1.1        is 		sc->sc_channel[i].nd_busy=0;
    264   1.1        is 		sc->sc_channel[i].nd_dma=alloc_chipmem(AUDIO_BUF_SIZE*2);
    265   1.1        is 		if (sc->sc_channel[i].nd_dma==NULL)
    266   1.1        is 			err=1;
    267   1.1        is 	 	sc->sc_channel[i].nd_dmalength=0;
    268   1.1        is 		sc->sc_channel[i].nd_volume=64;
    269   1.1        is 		sc->sc_channel[i].nd_intr=NULL;
    270   1.1        is 		sc->sc_channel[i].nd_intrdata=NULL;
    271   1.8        is 		sc->sc_channel[i].nd_doublebuf=0;
    272   1.1        is 		DPRINTF(("dma buffer for channel %d is %p\n", i,
    273   1.1        is 		    sc->sc_channel[i].nd_dma));
    274   1.1        is 
    275   1.1        is 	}
    276   1.1        is 
    277   1.1        is 	if (err) {
    278   1.1        is 		for(i=0;i<4;i++)
    279   1.1        is 			if (sc->sc_channel[i].nd_dma)
    280   1.1        is 				free_chipmem(sc->sc_channel[i].nd_dma);
    281   1.1        is 	}
    282   1.1        is 
    283   1.8        is 	sc->sc_channels=1;
    284   1.1        is 	sc->sc_channelmask=0xf;
    285   1.1        is 
    286   1.2        is 	/* clear interrupts and dma: */
    287   1.7        is 	custom.intena = AUCC_ALLINTF;
    288   1.7        is 	custom.dmacon = AUCC_ALLDMAF;;
    289   1.1        is 
    290   1.1        is 	sc->sc_encoding=AUDIO_ENCODING_ULAW;
    291   1.1        is 
    292   1.1        is 	return err;
    293   1.1        is 
    294   1.1        is }
    295   1.1        is 
    296   1.1        is int
    297  1.16  augustss aucc_open(addr, flags)
    298  1.16  augustss 	void *addr;
    299   1.1        is 	int flags;
    300   1.1        is {
    301  1.16  augustss 	struct aucc_softc *sc = addr;
    302  1.16  augustss 	int i;
    303   1.1        is 
    304  1.16  augustss 	DPRINTF(("sa_open: unit %p\n",sc));
    305   1.1        is 
    306   1.1        is 	if (sc->sc_open)
    307   1.1        is 		return (EBUSY);
    308   1.1        is 	sc->sc_open = 1;
    309   1.7        is 	for (i=0;i<AUCC_MAXINT;i++) {
    310   1.1        is 		sc->sc_channel[i].nd_intr=NULL;
    311   1.1        is 		sc->sc_channel[i].nd_intrdata=NULL;
    312   1.1        is 	}
    313   1.1        is 	aucc=sc;
    314   1.1        is 	sc->sc_channelmask=0xf;
    315   1.1        is 
    316   1.1        is 	DPRINTF(("saopen: ok -> sc=0x%p\n",sc));
    317   1.1        is 
    318   1.1        is 	return (0);
    319   1.1        is }
    320   1.1        is 
    321   1.1        is void
    322   1.1        is aucc_close(addr)
    323   1.1        is 	void *addr;
    324   1.1        is {
    325   1.1        is 	register struct aucc_softc *sc = addr;
    326   1.1        is 
    327   1.1        is 	DPRINTF(("sa_close: sc=0x%p\n", sc));
    328   1.1        is 	/*
    329   1.1        is 	 * halt i/o, clear open flag, and done.
    330   1.1        is 	 */
    331   1.1        is 	aucc_halt_output(sc);
    332   1.1        is 	sc->sc_open = 0;
    333   1.1        is 
    334   1.1        is 	DPRINTF(("sa_close: closed.\n"));
    335   1.1        is }
    336   1.1        is 
    337   1.1        is int
    338   1.1        is aucc_set_out_sr(addr, sr)
    339   1.1        is 	void *addr;
    340   1.1        is 	u_long sr;
    341   1.1        is {
    342   1.1        is 	struct aucc_softc *sc=addr;
    343   1.1        is 	u_long per;
    344   1.1        is 	register int i;
    345   1.1        is 
    346   1.1        is 	per=freqtoper(sr);
    347   1.1        is 	if (per>0xffff)
    348   1.1        is 		return EINVAL;
    349   1.1        is 	sr=pertofreq(per);
    350   1.1        is 
    351   1.1        is 	for (i=0;i<4;i++) {
    352   1.1        is 		sc->sc_channel[i].nd_freq=sr;
    353   1.1        is 		sc->sc_channel[i].nd_per=per;
    354   1.1        is 	}
    355   1.1        is 
    356   1.1        is 	return(0);
    357   1.1        is }
    358   1.1        is 
    359   1.1        is int
    360   1.1        is aucc_query_encoding(addr, fp)
    361   1.1        is 	void *addr;
    362   1.1        is 	struct audio_encoding *fp;
    363   1.1        is {
    364   1.1        is 	switch (fp->index) {
    365   1.1        is 	case 0:
    366  1.19   mycroft 		strcpy(fp->name, AudioEslinear);
    367  1.11  augustss 		fp->encoding = AUDIO_ENCODING_SLINEAR;
    368   1.1        is 		fp->precision = 8;
    369   1.1        is 		fp->flags = 0;
    370   1.1        is 		break;
    371   1.1        is 	case 1:
    372   1.1        is 		strcpy(fp->name, AudioEmulaw);
    373   1.1        is 		fp->encoding = AUDIO_ENCODING_ULAW;
    374   1.1        is 		fp->precision = 8;
    375   1.1        is 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
    376   1.1        is 		break;
    377   1.1        is 
    378   1.3        is 	case 2:
    379   1.3        is 		strcpy(fp->name, AudioEulinear);
    380   1.3        is 		fp->encoding = AUDIO_ENCODING_ULINEAR;
    381   1.3        is 		fp->precision = 8;
    382   1.3        is 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
    383   1.3        is 		break;
    384   1.3        is 
    385   1.1        is 	default:
    386   1.1        is 		return(EINVAL);
    387   1.1        is 		/*NOTREACHED*/
    388   1.1        is 	}
    389   1.1        is 	return(0);
    390   1.1        is }
    391   1.1        is 
    392   1.1        is int
    393  1.18  augustss aucc_set_params(addr, setmode, usemode, p, r)
    394   1.1        is 	void *addr;
    395  1.18  augustss 	int setmode, usemode;
    396  1.18  augustss 	struct  audio_params *p, *r;
    397   1.1        is {
    398  1.18  augustss 	struct aucc_softc *sc = addr;
    399   1.8        is 
    400  1.18  augustss 	/* if (setmode & AUMODE_RECORD)
    401   1.8        is 		return 0 ENXIO*/;
    402   1.8        is 
    403   1.9        is #ifdef AUCCDEBUG
    404  1.18  augustss 	printf("aucc_set_params(setmode 0x%x, usemode 0x%x, enc %d, bits %d, chn %d, sr %ld)\n",
    405  1.18  augustss 	    setmode, usemode, p->encoding, p->precision, p->channels, p->sample_rate);
    406   1.9        is #endif
    407   1.4        is 
    408   1.1        is 	switch (p->encoding) {
    409   1.1        is 	case AUDIO_ENCODING_ULAW:
    410  1.11  augustss 	case AUDIO_ENCODING_SLINEAR:
    411  1.11  augustss 	case AUDIO_ENCODING_SLINEAR_BE:
    412  1.11  augustss 	case AUDIO_ENCODING_SLINEAR_LE:
    413   1.8        is 	case AUDIO_ENCODING_ULINEAR_BE:
    414   1.8        is 	case AUDIO_ENCODING_ULINEAR_LE:
    415   1.1        is 		break;
    416   1.8        is 
    417   1.1        is 	default:
    418   1.1        is 		return EINVAL;
    419   1.1        is 		/* NOTREADCHED */
    420   1.1        is 	}
    421   1.1        is 
    422   1.1        is 	if (p->precision != 8)
    423   1.1        is 		return EINVAL;
    424   1.1        is 
    425   1.1        is 	if ((p->channels<1) || (p->channels>4))
    426   1.1        is 		return(EINVAL);
    427   1.1        is 
    428   1.8        is 	sc->sc_channels = p->channels;
    429   1.8        is 	sc->sc_encoding = p->encoding;
    430   1.8        is 
    431   1.8        is 	return aucc_set_out_sr(addr, p->sample_rate);
    432   1.1        is }
    433   1.1        is 
    434   1.1        is int
    435   1.1        is aucc_round_blocksize(addr, blk)
    436   1.1        is 	void *addr;
    437   1.1        is 	int blk;
    438   1.1        is {
    439   1.1        is 
    440   1.1        is 
    441   1.1        is 	return blk>AUDIO_BUF_SIZE?AUDIO_BUF_SIZE:blk; /* round up to even size */
    442   1.1        is }
    443   1.1        is 
    444   1.1        is int
    445   1.1        is aucc_commit_settings(addr)
    446   1.1        is 	void *addr;
    447   1.1        is {
    448   1.1        is 	register struct aucc_softc *sc = addr;
    449   1.1        is 	register int i;
    450   1.1        is 
    451   1.1        is 	DPRINTF(("sa_commit.\n"));
    452   1.1        is 
    453   1.1        is 	for (i=0;i<4;i++) {
    454   1.1        is 		custom.aud[i].vol=sc->sc_channel[i].nd_volume;
    455   1.1        is 		custom.aud[i].per=sc->sc_channel[i].nd_per;
    456   1.1        is 	}
    457   1.1        is 
    458   1.1        is 	DPRINTF(("commit done\n"));
    459   1.1        is 
    460   1.1        is 	return(0);
    461   1.1        is }
    462   1.1        is 
    463   1.1        is static int masks[4] = {1,3,7,15}; /* masks for n first channels */
    464   1.1        is static int masks2[4] = {1,2,4,8};
    465   1.1        is 
    466   1.1        is int
    467   1.1        is aucc_start_output(addr, p, cc, intr, arg)
    468   1.1        is 	void *addr;
    469   1.1        is 	void *p;
    470   1.1        is 	int cc;
    471   1.1        is 	void (*intr) __P((void *));
    472   1.1        is 	void *arg;
    473   1.1        is {
    474   1.8        is 	struct aucc_softc *sc;
    475   1.8        is 	int mask;
    476   1.8        is 	int i,j,k;
    477   1.8        is 	u_short *dmap[4];
    478   1.8        is 	u_char *pp;
    479   1.8        is 
    480   1.1        is 
    481   1.8        is 	sc = addr;
    482   1.8        is 	mask = sc->sc_channelmask;
    483   1.1        is 
    484   1.8        is 	dmap[0] = dmap[1] = dmap[2] = dmap[3] = NULL;
    485   1.1        is 
    486   1.1        is 	DPRINTF(("sa_start_output: cc=%d %p (%p)\n", cc, intr, arg));
    487   1.1        is 
    488  1.10        is 	if (sc->sc_channels > 1)
    489  1.10        is 		mask &=masks[sc->sc_channels-1];
    490  1.10        is 		/* we use first sc_channels channels */
    491   1.1        is 	if (mask==0) /* active and used channels are disjoint */
    492   1.1        is 		return EINVAL;
    493   1.1        is 
    494   1.1        is 	for (i=0;i<4;i++) { /* channels available ? */
    495   1.1        is 		if ((masks2[i]&mask)&&(sc->sc_channel[i].nd_busy))
    496   1.1        is 			return EBUSY; /* channel is busy */
    497   1.1        is 		if (channel[i].isaudio==-1)
    498   1.1        is 			return EBUSY; /* system uses them */
    499   1.1        is 	}
    500   1.1        is 
    501   1.1        is 	/* enable interrupt on 1st channel */
    502   1.8        is 	for (i=j=0;i<AUCC_MAXINT;i++) {
    503   1.1        is 		if (masks2[i]&mask) {
    504   1.1        is 			DPRINTF(("first channel is %d\n",i));
    505   1.1        is 			j=i;
    506   1.1        is 			sc->sc_channel[i].nd_intr=intr;
    507   1.1        is 			sc->sc_channel[i].nd_intrdata=arg;
    508   1.1        is 			break;
    509   1.1        is 		}
    510   1.1        is 	}
    511   1.1        is 
    512   1.8        is 	DPRINTF(("dmap is %p %p %p %p, mask=0x%x\n", dmap[0], dmap[1],
    513   1.8        is 		dmap[2], dmap[3], mask));
    514   1.8        is 
    515   1.8        is 	/* disable ints, dma for channels, until all parameters set */
    516   1.8        is 	/* XXX dont disable DMA! custom.dmacon=mask;*/
    517   1.8        is 	custom.intreq=mask<<INTB_AUD0;
    518   1.8        is 	custom.intena=mask<<INTB_AUD0;
    519   1.1        is 
    520   1.1        is 	/* copy data to dma buffer */
    521   1.1        is 
    522   1.1        is 
    523   1.1        is 	pp=(u_char *)p;
    524   1.1        is 
    525   1.8        is 	if (sc->sc_channels == 1) {
    526   1.8        is 		dmap[0] =
    527   1.8        is 		dmap[1] =
    528   1.8        is 		dmap[2] =
    529   1.8        is 		dmap[3] = sc->sc_channel[j].nd_dma;
    530   1.8        is 	} else {
    531   1.8        is 		for (k=0; k<4; k++) {
    532   1.8        is 			if (masks2[k+j]&mask)
    533   1.8        is 				dmap[k]=sc->sc_channel[k+j].nd_dma;
    534   1.8        is 		}
    535   1.8        is 	}
    536   1.8        is 
    537   1.8        is 	sc->sc_channel[j].nd_doublebuf ^= 1;
    538   1.8        is 	if (sc->sc_channel[j].nd_doublebuf) {
    539   1.8        is 		dmap[0] += AUDIO_BUF_SIZE/sizeof(u_short);
    540   1.8        is 		dmap[1] += AUDIO_BUF_SIZE/sizeof(u_short);
    541   1.8        is 		dmap[2] += AUDIO_BUF_SIZE/sizeof(u_short);
    542   1.8        is 		dmap[3] += AUDIO_BUF_SIZE/sizeof(u_short);
    543   1.8        is 	}
    544   1.1        is 
    545   1.8        is 	aucc_encode(sc->sc_encoding, sc->sc_channels, cc, pp, dmap);
    546   1.1        is 
    547   1.1        is 	/* dma buffers: we use same buffer 4 all channels */
    548   1.1        is 	/* write dma location and length */
    549   1.8        is 	for (i=k=0; i<4; i++) {
    550   1.8        is 		if (masks2[i] & mask) {
    551   1.1        is 			DPRINTF(("turning channel %d on\n",i));
    552   1.1        is 			/*  sc->sc_channel[i].nd_busy=1;*/
    553   1.1        is 			channel[i].isaudio=1;
    554   1.1        is 			channel[i].play_count=1;
    555   1.1        is 			channel[i].handler=NULL;
    556   1.1        is 			custom.aud[i].per=sc->sc_channel[i].nd_per;
    557   1.1        is 			custom.aud[i].vol=sc->sc_channel[i].nd_volume;
    558   1.8        is 			custom.aud[i].lc = PREP_DMA_MEM(dmap[k++]);
    559   1.9        is 			custom.aud[i].len=cc/(sc->sc_channels*2);
    560   1.1        is 			sc->sc_channel[i].nd_mask=mask;
    561   1.1        is 			DPRINTF(("per is %d, vol is %d, len is %d\n",\
    562   1.8        is 			    sc->sc_channel[i].nd_per,
    563   1.8        is 			    sc->sc_channel[i].nd_volume, cc>>1));
    564   1.1        is 
    565   1.1        is 		}
    566   1.1        is 	}
    567   1.1        is 
    568   1.1        is 	channel[j].handler=aucc_inthdl;
    569   1.1        is 
    570   1.1        is 	/* enable ints */
    571   1.7        is 	custom.intena=INTF_SETCLR|INTF_INTEN| (masks2[j]<<INTB_AUD0);
    572   1.1        is 
    573   1.7        is 	DPRINTF(("enabled ints: 0x%x\n",(masks2[j]<<INTB_AUD0)));
    574   1.1        is 
    575   1.1        is 	/* enable dma */
    576   1.1        is 	custom.dmacon=DMAF_SETCLR|DMAF_MASTER|mask;
    577   1.1        is 
    578   1.1        is 	DPRINTF(("enabled dma, mask=0x%x\n",mask));
    579   1.1        is 
    580   1.1        is 	return(0);
    581   1.1        is }
    582   1.1        is 
    583   1.1        is /* ARGSUSED */
    584   1.1        is int
    585   1.1        is aucc_start_input(addr, p, cc, intr, arg)
    586   1.1        is 	void *addr;
    587   1.1        is 	void *p;
    588   1.1        is 	int cc;
    589   1.1        is 	void (*intr) __P((void *));
    590   1.1        is 	void *arg;
    591   1.1        is {
    592   1.1        is 
    593   1.1        is 	return ENXIO; /* no input */
    594   1.1        is }
    595   1.1        is 
    596   1.1        is int
    597   1.1        is aucc_halt_output(addr)
    598   1.1        is 	void *addr;
    599   1.1        is {
    600   1.1        is 	register struct aucc_softc *sc = addr;
    601   1.1        is 	register int i;
    602   1.1        is 
    603   1.1        is 	/* XXX only halt, if input is also halted ?? */
    604   1.1        is 	/* stop dma, etc */
    605   1.7        is 	custom.intena = AUCC_ALLINTF;
    606   1.7        is 	custom.dmacon = AUCC_ALLDMAF;
    607   1.1        is 	/* mark every busy unit idle */
    608   1.1        is 	for (i=0;i<4;i++) {
    609   1.1        is 		sc->sc_channel[i].nd_busy=sc->sc_channel[i].nd_mask=0;
    610   1.1        is 		channel[i].isaudio=0;
    611   1.1        is 		channel[i].play_count=0;
    612   1.1        is 	}
    613   1.1        is 
    614   1.1        is 	return(0);
    615   1.1        is }
    616   1.1        is 
    617   1.1        is int
    618   1.1        is aucc_halt_input(addr)
    619   1.1        is 	void *addr;
    620   1.1        is {
    621   1.1        is 	/* no input */
    622   1.1        is 
    623   1.1        is 	return ENXIO;
    624   1.1        is }
    625   1.1        is 
    626   1.1        is int
    627   1.1        is aucc_getdev(addr, retp)
    628   1.1        is         void *addr;
    629   1.1        is         struct audio_device *retp;
    630   1.1        is {
    631   1.1        is         *retp = aucc_device;
    632   1.1        is         return 0;
    633   1.1        is }
    634   1.1        is 
    635   1.1        is int
    636   1.1        is aucc_set_port(addr, cp)
    637   1.1        is 	void *addr;
    638   1.1        is 	mixer_ctrl_t *cp;
    639   1.1        is {
    640   1.1        is 	register struct aucc_softc *sc = addr;
    641   1.1        is 	register int i,j;
    642   1.1        is 
    643   1.1        is 	DPRINTF(("aucc_set_port: port=%d", cp->dev));
    644   1.1        is 
    645   1.1        is 	switch (cp->type) {
    646   1.1        is 	case AUDIO_MIXER_SET:
    647   1.1        is 		if (cp->dev!=AUCC_CHANNELS)
    648   1.1        is 			return EINVAL;
    649   1.1        is 		i=cp->un.mask;
    650   1.1        is 		if ((i<1)||(i>15))
    651   1.1        is 			return EINVAL;
    652   1.1        is 		sc->sc_channelmask=i;
    653   1.1        is 		break;
    654   1.1        is 
    655   1.1        is 	case AUDIO_MIXER_VALUE:
    656   1.1        is 		i=cp->un.value.num_channels;
    657   1.1        is 		if ((i<1)||(i>4))
    658   1.1        is 			return EINVAL;
    659   1.1        is 
    660  1.10        is #ifdef __XXXwhatsthat
    661   1.1        is 		if (cp->dev!=AUCC_VOLUME)
    662   1.1        is 			return EINVAL;
    663  1.10        is #endif
    664   1.1        is 
    665   1.1        is 		/* set volume for channel 0..i-1 */
    666  1.21        is 
    667  1.21        is 		/* evil workaround for xanim bug, IMO */
    668  1.21        is 		if ((sc->sc_channels == 1) && (i == 2)) {
    669  1.21        is 			sc->sc_channel[0].nd_volume =
    670  1.21        is 			    sc->sc_channel[3].nd_volume =
    671  1.21        is 			    cp->un.value.level[0]>>2;
    672  1.21        is 			sc->sc_channel[1].nd_volume =
    673  1.21        is 			    sc->sc_channel[2].nd_volume =
    674  1.21        is 			    cp->un.value.level[1]>>2;
    675  1.21        is 		} else if (i>1) {
    676  1.10        is 			for (j=0;j<i;j++)
    677  1.10        is 	 			sc->sc_channel[j].nd_volume =
    678  1.10        is 				    cp->un.value.level[j]>>2;
    679  1.21        is 		} else if (sc->sc_channels > 1)
    680  1.10        is 			for (j=0; j<sc->sc_channels; j++)
    681  1.10        is 	 			sc->sc_channel[j].nd_volume =
    682  1.10        is 				    cp->un.value.level[0]>>2;
    683  1.10        is 		else
    684  1.10        is 			for (j=0; j<4; j++)
    685  1.10        is 	 			sc->sc_channel[j].nd_volume =
    686  1.10        is 				    cp->un.value.level[0]>>2;
    687  1.10        is 		break;
    688   1.1        is 
    689   1.1        is 	default:
    690   1.1        is 		return EINVAL;
    691   1.1        is 		break;
    692   1.1        is 	}
    693   1.1        is 	return 0;
    694   1.1        is }
    695   1.1        is 
    696   1.1        is 
    697   1.1        is int
    698   1.1        is aucc_get_port(addr, cp)
    699   1.1        is 	void *addr;
    700   1.1        is 	mixer_ctrl_t *cp;
    701   1.1        is {
    702   1.1        is 	register struct aucc_softc *sc = addr;
    703   1.1        is 	register int i,j;
    704   1.1        is 
    705   1.1        is 	DPRINTF(("aucc_get_port: port=%d", cp->dev));
    706   1.1        is 
    707   1.1        is 	switch (cp->type) {
    708   1.1        is 	case AUDIO_MIXER_SET:
    709   1.1        is 		if (cp->dev!=AUCC_CHANNELS)
    710   1.1        is 			return EINVAL;
    711   1.1        is 		cp->un.mask=sc->sc_channelmask;
    712   1.1        is 		break;
    713   1.1        is 
    714   1.1        is 	case AUDIO_MIXER_VALUE:
    715   1.1        is 		i = cp->un.value.num_channels;
    716   1.1        is 		if ((i<1)||(i>4))
    717   1.1        is 			return EINVAL;
    718   1.1        is 
    719   1.1        is 		for (j=0;j<i;j++)
    720  1.10        is 			cp->un.value.level[j] =
    721  1.10        is 			    (sc->sc_channel[j].nd_volume<<2) +
    722  1.10        is 			    (sc->sc_channel[j].nd_volume>>4);
    723   1.1        is 		break;
    724   1.1        is 
    725   1.1        is 	default:
    726   1.1        is 		return EINVAL;
    727   1.1        is 	}
    728   1.1        is 	return 0;
    729   1.1        is }
    730   1.1        is 
    731  1.16  augustss 
    732  1.16  augustss int
    733  1.16  augustss aucc_get_props(addr)
    734  1.16  augustss 	void *addr;
    735  1.16  augustss {
    736  1.16  augustss 	return 0;
    737  1.16  augustss }
    738   1.1        is 
    739   1.1        is int
    740   1.1        is aucc_query_devinfo(addr, dip)
    741   1.1        is 	void *addr;
    742   1.1        is 	register mixer_devinfo_t *dip;
    743   1.1        is {
    744   1.1        is 	register int i;
    745   1.1        is 
    746   1.1        is 	switch(dip->index) {
    747   1.1        is 	case AUCC_CHANNELS:
    748   1.1        is 		dip->type = AUDIO_MIXER_SET;
    749   1.1        is 		dip->mixer_class = AUCC_OUTPUT_CLASS;
    750   1.1        is 		dip->prev = dip->next = AUDIO_MIXER_LAST;
    751   1.1        is                 strcpy(dip->label.name, AudioNspeaker);
    752   1.1        is 		for (i=0;i<16;i++) {
    753   1.1        is 			sprintf(dip->un.s.member[i].label.name,
    754   1.1        is 			    "channelmask%d", i);
    755   1.1        is 			dip->un.s.member[i].mask = i;
    756   1.1        is 		}
    757   1.1        is 		dip->un.s.num_mem = 16;
    758   1.1        is 		break;
    759   1.1        is 
    760   1.1        is 	case AUCC_VOLUME:
    761   1.1        is 		dip->type = AUDIO_MIXER_VALUE;
    762   1.1        is 		dip->mixer_class = AUCC_OUTPUT_CLASS;
    763   1.1        is 		dip->prev = dip->next = AUDIO_MIXER_LAST;
    764  1.20  augustss 		strcpy(dip->label.name, AudioNmaster);
    765   1.1        is 		dip->un.v.num_channels = 4;
    766   1.1        is 		strcpy(dip->un.v.units.name, AudioNvolume);
    767   1.1        is 		break;
    768   1.1        is 
    769   1.1        is 	case AUCC_OUTPUT_CLASS:
    770   1.1        is 		dip->type = AUDIO_MIXER_CLASS;
    771   1.1        is 		dip->mixer_class = AUCC_OUTPUT_CLASS;
    772   1.1        is 		dip->next = dip->prev = AUDIO_MIXER_LAST;
    773  1.19   mycroft 		strcpy(dip->label.name, AudioCoutputs);
    774   1.1        is 		break;
    775  1.20  augustss 
    776   1.1        is 	default:
    777   1.1        is 		return ENXIO;
    778   1.1        is 	}
    779   1.1        is 
    780   1.1        is 	DPRINTF(("AUDIO_MIXER_DEVINFO: name=%s\n", dip->label.name));
    781   1.1        is 
    782   1.1        is 	return(0);
    783   1.1        is }
    784   1.1        is 
    785   1.1        is 
    786   1.1        is /* audio int handler */
    787   1.1        is void
    788   1.1        is aucc_inthdl(int ch)
    789   1.1        is {
    790   1.1        is 	register int i;
    791   1.1        is 	register int mask=aucc->sc_channel[ch].nd_mask;
    792   1.1        is 
    793   1.1        is 	/* for all channels in this maskgroup:
    794   1.1        is 	   disable dma, int
    795   1.1        is 	   mark idle */
    796   1.1        is 	DPRINTF(("inthandler called, channel %d, mask 0x%x\n",ch,mask));
    797   1.1        is 
    798   1.7        is 	custom.intreq=mask<<INTB_AUD0; /* clear request */
    799   1.1        is 	/* XXX: maybe we can leave ints and/or DMA on, if another sample has to be played?*/
    800   1.7        is 	custom.intena=mask<<INTB_AUD0;
    801   1.1        is 	/*
    802   1.1        is 	 * XXX custom.dmacon=mask; NO!!!
    803   1.1        is 	 */
    804   1.1        is 	for (i=0;i<4;i++) {
    805   1.1        is 		if (masks2[i]&&mask) {
    806   1.1        is 			DPRINTF(("marking channel %d idle\n",i));
    807   1.1        is 			aucc->sc_channel[i].nd_busy=0;
    808   1.1        is 			aucc->sc_channel[i].nd_mask=0;
    809   1.1        is 			channel[i].isaudio=channel[i].play_count=0;
    810   1.1        is 		}
    811   1.1        is 	}
    812   1.1        is 
    813   1.1        is 	/* call handler */
    814   1.1        is 	if (aucc->sc_channel[ch].nd_intr) {
    815   1.1        is 		DPRINTF(("calling %p\n",aucc->sc_channel[ch].nd_intr));
    816   1.1        is 		(*(aucc->sc_channel[ch].nd_intr))(aucc->sc_channel[ch].nd_intrdata);
    817   1.1        is 	}
    818   1.1        is 	else DPRINTF(("zero int handler\n"));
    819   1.1        is 	DPRINTF(("ints done\n"));
    820   1.1        is }
    821   1.1        is 
    822   1.1        is 
    823   1.1        is 
    824   1.1        is 
    825   1.1        is /* transform frequency to period, adjust bounds */
    826   1.1        is static u_int
    827   1.1        is freqtoper(u_int freq)
    828   1.1        is {
    829   1.1        is 	u_int per=eclockfreq*5/freq;
    830   1.1        is 
    831   1.1        is 	if (per<124)
    832   1.1        is 		per=124; /* must have at least 124 ticks between samples */
    833   1.1        is 
    834   1.1        is 	return per;
    835   1.1        is }
    836   1.1        is 
    837   1.1        is /* transform period to frequency */
    838   1.1        is static u_int
    839   1.1        is pertofreq(u_int per)
    840   1.1        is {
    841   1.1        is 	u_int freq=eclockfreq*5/per;
    842   1.1        is 
    843   1.1        is 
    844   1.1        is 	return freq;
    845   1.1        is }
    846   1.1        is 
    847   1.1        is 
    848   1.1        is 
    849   1.1        is void
    850   1.8        is aucc_encode(enc, channels, i, p, dmap)
    851   1.8        is 	int enc, channels, i;
    852   1.1        is 	u_char *p;
    853   1.8        is 	u_short **dmap;
    854   1.1        is {
    855   1.8        is 	char *q, *r, *s, *t;
    856   1.8        is 	int off;
    857   1.8        is 	u_char *tab;
    858   1.8        is 
    859   1.9        is #ifdef AUCCDEBUG
    860   1.8        is 	static int debctl = 6;
    861   1.9        is #endif
    862   1.1        is 
    863   1.8        is 	off = 0;
    864   1.8        is 	tab = NULL;
    865   1.1        is 
    866   1.9        is #ifdef AUCCDEBUG
    867   1.8        is 	if (--debctl >= 0)
    868   1.8        is 		printf("Enc: enc %d, chan %d, dmap %p %p %p %p\n",
    869   1.8        is 		    enc, channels, dmap[0], dmap[1], dmap[2], dmap[3]);
    870   1.9        is #endif
    871   1.1        is 
    872   1.1        is 	switch (enc) {
    873   1.1        is 	case AUDIO_ENCODING_ULAW:
    874   1.1        is 		tab=ulaw_to_lin;
    875   1.1        is 		break;
    876   1.8        is 	case AUDIO_ENCODING_ULINEAR_BE:
    877   1.8        is 	case AUDIO_ENCODING_ULINEAR_LE:
    878   1.1        is 		off=-128;
    879   1.8        is 		break;
    880  1.11  augustss 	case AUDIO_ENCODING_SLINEAR_BE:
    881  1.11  augustss 	case AUDIO_ENCODING_SLINEAR_LE:
    882   1.1        is 		break;
    883   1.1        is 	default:
    884   1.1        is 		return;
    885   1.1        is 	}
    886   1.1        is 
    887   1.8        is 	q = (char *)dmap[0];
    888   1.8        is 	r = (char *)dmap[1];
    889   1.8        is 	s = (char *)dmap[2];
    890   1.8        is 	t = (char *)dmap[3];
    891   1.8        is 
    892   1.1        is 	if (tab)
    893   1.9        is 		while (i) {
    894   1.8        is 			switch (channels) {
    895   1.8        is 			case 4: *t++ = tab[*p++];
    896   1.8        is 			case 3: *s++ = tab[*p++];
    897   1.8        is 			case 2: *r++ = tab[*p++];
    898   1.8        is 			case 1: *q++ = tab[*p++];
    899   1.8        is 			}
    900   1.9        is 			i -= channels;
    901   1.8        is 		}
    902   1.1        is 	else
    903   1.9        is 		while (i) {
    904   1.8        is 			switch (channels) {
    905   1.8        is 			case 4: *t++ = *p++ + off;
    906   1.8        is 			case 3: *s++ = *p++ + off;
    907   1.8        is 			case 2: *r++ = *p++ + off;
    908   1.8        is 			case 1: *q++ = *p++ + off;
    909   1.8        is 			}
    910   1.9        is 			i -= channels;
    911   1.8        is 		}
    912   1.1        is 
    913   1.1        is }
    914   1.1        is 
    915   1.1        is #endif /* NAUCC > 0 */
    916