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