[BACK]Return to aria.c CVS log [TXT][DIR] Up to [local] / sys / dev / isa

Annotation of sys/dev/isa/aria.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: aria.c,v 1.13 2006/05/11 18:50:18 miod Exp $ */
                      2:
                      3: /*
                      4:  * Copyright (c) 1995, 1996 Roland C. Dowdeswell.  All rights reserved.
                      5:  *
                      6:  * Redistribution and use in source and binary forms, with or without
                      7:  * modification, are permitted provided that the following conditions
                      8:  * are met:
                      9:  * 1. Redistributions of source code must retain the above copyright
                     10:  *    notice, this list of conditions and the following disclaimer.
                     11:  * 2. Redistributions in binary form must reproduce the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer in the
                     13:  *    documentation and/or other materials provided with the distribution.
                     14:  * 3. All advertising materials mentioning features or use of this software
                     15:  *    must display the following acknowledgement:
                     16:  *      This product includes software developed by Roland C. Dowdeswell.
                     17:  * 4. The name of the authors may not be used to endorse or promote products
                     18:  *      derived from this software without specific prior written permission.
                     19:  *
                     20:  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
                     21:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     22:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     23:  * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
                     24:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     25:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     26:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     27:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     28:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     29:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     30:  */
                     31:
                     32: /*
                     33:  * TODO:
                     34:  *  o   Test the driver on cards other than a single
                     35:  *      Prometheus Aria 16.
                     36:  *  o   Look into where aria_prometheus_kludge() belongs.
                     37:  *  o   Add some dma code.  It accomplishes its goal by
                     38:  *      direct IO at the moment.
                     39:  *  o   Look into return values on aria_set_sr(), if there is
                     40:  *      no matching rate.  (I think that this behaves in the
                     41:  *      same way as sbdsp.c)
                     42:  *  o   Different programs should be able to open the device
                     43:  *      with O_RDONLY and O_WRONLY at the same time.  But I
                     44:  *      do not see support for this in /sys/dev/audio.c, so
                     45:  *     I cannot effectively code it.
                     46:  *  o   Separate the debugging code, with a #define.
                     47:  *      Write more into aria_printsc().
                     48:  *  o   Rework the mixer interface.
                     49:  *       o   Deal with the lvls better.  We need to do better mapping
                     50:  *           between logarithmic scales and the one byte that
                     51:  *           we are passed.
                     52:  *       o   Deal better with cards that have no mixer.
                     53:  *
                     54:  * roland@imrryr.org
                     55:  * update from http://www.imrryr.org/NetBSD/hacks/aria/
                     56:  */
                     57:
                     58: #include "aria.h"
                     59: #if NARIA > 0
                     60:
                     61: #include <sys/param.h>
                     62: #include <sys/systm.h>
                     63: #include <sys/errno.h>
                     64: #include <sys/ioctl.h>
                     65: #include <sys/syslog.h>
                     66: #include <sys/device.h>
                     67: #include <sys/proc.h>
                     68: #include <sys/buf.h>
                     69:
                     70: #include <machine/cpu.h>
                     71: #include <machine/pio.h>
                     72:
                     73: #include <sys/audioio.h>
                     74: #include <dev/audio_if.h>
                     75:
                     76: #include <dev/mulaw.h>
                     77: #include <dev/isa/isavar.h>
                     78: #include <dev/isa/isadmavar.h>
                     79:
                     80: #include <dev/isa/ariareg.h>
                     81:
                     82: #define FREAD 1
                     83: #define FWRITE 2
                     84:
                     85: #ifdef AUDIO_DEBUG
                     86: extern void Dprintf(const char *, ...);
                     87: #define DPRINTF(x)     if (ariadebug) Dprintf x
                     88: int    ariadebug = 0;
                     89: #else
                     90: #define DPRINTF(x)
                     91: #endif
                     92:
                     93: struct aria_mixdev_info {
                     94:        u_char  num_channels;
                     95:        u_char  level[2];
                     96:        u_char  mute;
                     97: };
                     98:
                     99: struct aria_mixmaster {
                    100:        u_char num_channels;
                    101:        u_char level[2];
                    102:        u_char treble[2];
                    103:        u_char bass[2];
                    104: };
                    105:
                    106: struct aria_softc {
                    107:        struct  device sc_dev;          /* base device */
                    108:        struct  isadev sc_id;           /* ISA device */
                    109:        void    *sc_ih;                 /* interrupt vectoring */
                    110:
                    111:        u_short sc_iobase;              /* I/O port base address */
                    112:        u_short sc_irq;                 /* interrupt */
                    113:        u_short sc_drq;                 /* dma chan */
                    114:
                    115:        u_short sc_open;                /* reference count of open calls */
                    116:        u_short sc_play;                /* non-paused play chans 2**chan */
                    117:        u_short sc_record;              /* non-paused record chans 2**chan */
                    118:        u_short sc_change;              /* to keep track of changes of a type */
                    119:        u_short gain[2];                /* left/right gain (play) */
                    120:        u_int   spkr_state;             /* non-null is on */
                    121:
                    122:        u_long  sc_rate;                /* Sample rate for input and output */
                    123:        u_int   sc_encoding;            /* audio encoding -- ulaw/linear */
                    124:        int     sc_chans;               /* # of channels */
                    125:        int     sc_precision;           /* # bits per sample */
                    126:
                    127:        u_long  sc_interrupts;          /* number of interrupts taken */
                    128:        void    (*sc_rintr)(void *);    /* record transfer completion intr handler */
                    129:        void    (*sc_pintr)(void *);    /* play transfer completion intr handler */
                    130:        void    *sc_rarg;               /* arg for sc_rintr() */
                    131:        void    *sc_parg;               /* arg for sc_pintr() */
                    132:
                    133:        int     sc_blocksize;           /* literal dio block size */
                    134:        void    *sc_rdiobuffer;         /* record: where the next samples should be */
                    135:        void    *sc_pdiobuffer;         /* play:   where the next samples are */
                    136:
                    137:        u_short sc_hardware;            /* bit field of hardware present */
                    138: #define ARIA_TELEPHONE 0x0001          /* has telephone input */
                    139: #define ARIA_MIXER     0x0002          /* has SC18075 digital mixer */
                    140: #define ARIA_MODEL     0x0004          /* is SC18025 (=0) or SC18026 (=1) */
                    141:
                    142:        struct aria_mixdev_info aria_mix[6];
                    143:        struct aria_mixmaster ariamix_master;
                    144:        u_char  aria_mix_source;
                    145: };
                    146:
                    147: struct {
                    148:        int sendcmd;
                    149:        int wmidi;
                    150: } ariaerr;
                    151:
                    152:
                    153:
                    154: int    ariaprobe();
                    155: void   ariaattach(struct device *, struct device *, void *);
                    156: void   ariaclose(void *);
                    157: int    ariaopen(dev_t, int);
                    158: int    aria_getdev(void *, struct audio_device *);
                    159:
                    160: void   aria_do_kludge(u_short, u_short, u_short, u_short, u_short);
                    161: void   aria_prometheus_kludge(struct isa_attach_args *);
                    162:
                    163: int    aria_set_sr(void *, u_long);
                    164: u_long aria_get_sr(void *);
                    165: int    aria_query_encoding(void *, struct audio_encoding *);
                    166: int    aria_set_format(void *, u_int, u_int);
                    167: int    aria_get_encoding(void *);
                    168: int    aria_get_precision(void *);
                    169: int    aria_set_channels(void *, int);
                    170: int    aria_get_channels(void *);
                    171: int    aria_round_blocksize(void *, int);
                    172: int    aria_set_out_port(void *, int);
                    173: int    aria_get_out_port(void *);
                    174: int    aria_set_in_port(void *, int);
                    175: int    aria_get_in_port(void *);
                    176: int    aria_speaker_ctl(void *, int);
                    177: int    aria_commit_settings(void *);
                    178:
                    179: int    aria_start_output(void *, void *, int, void (*)(), void *);
                    180: int    aria_start_input(void *, void *, int, void (*)(), void *);
                    181:
                    182: int    aria_halt_input(void *);
                    183: int    aria_halt_output(void *);
                    184: int    aria_cont(void *);
                    185:
                    186: int    aria_sendcmd(u_short, u_short, int, int, int);
                    187:
                    188: u_short        aria_getdspmem(u_short, u_short);
                    189: u_short        aria_putdspmem(u_short, u_short, u_short);
                    190:
                    191: int    aria_intr(void *);
                    192: short  ariaversion(struct aria_softc *);
                    193:
                    194: int    aria_setfd(void *, int);
                    195:
                    196: void   aria_mix_write(struct aria_softc *, int, int);
                    197: int    aria_mix_read(struct aria_softc *, int);
                    198:
                    199: int    aria_mixer_set_port(void *, mixer_ctrl_t *);
                    200: int    aria_mixer_get_port(void *, mixer_ctrl_t *);
                    201: int    aria_mixer_query_devinfo(void *, mixer_devinfo_t *);
                    202:
                    203: /*
                    204:  * Mixer defines...
                    205:  */
                    206:
                    207: struct cfattach aria_ca = {
                    208:        sizeof(struct aria_softc), ariaprobe, ariaattach
                    209: };
                    210:
                    211: struct cfdriver aria_cd = {
                    212:        NULL, "aria", DV_DULL
                    213: };
                    214:
                    215: struct audio_device aria_device = {
                    216:        "Aria 16(se)",
                    217:        "x",
                    218:        "aria"
                    219: };
                    220:
                    221: /*
                    222:  * Define our interface to the higher level audio driver.
                    223:  */
                    224:
                    225: struct audio_hw_if aria_hw_if = {
                    226:        ariaopen,
                    227:        ariaclose,
                    228:        NULL,
                    229:        aria_set_sr,
                    230:        aria_get_sr,
                    231:        aria_set_sr,
                    232:        aria_get_sr,
                    233:        aria_query_encoding,
                    234:        aria_set_format,
                    235:        aria_get_encoding,
                    236:        aria_get_precision,
                    237:        aria_set_channels,
                    238:        aria_get_channels,
                    239:        aria_round_blocksize,
                    240:        aria_set_out_port,
                    241:        aria_get_out_port,
                    242:        aria_set_in_port,
                    243:        aria_get_in_port,
                    244:        aria_commit_settings,
                    245:        mulaw_expand,
                    246:        mulaw_compress,
                    247:        aria_start_output,
                    248:        aria_start_input,
                    249:        aria_halt_input,
                    250:        aria_halt_output,
                    251:        aria_cont,
                    252:        aria_cont,
                    253:        aria_speaker_ctl,
                    254:        aria_getdev,
                    255:        aria_setfd,
                    256:        aria_mixer_set_port,
                    257:        aria_mixer_get_port,
                    258:        aria_mixer_query_devinfo,
                    259:        1,      /* full-duplex */
                    260:        0,
                    261:        NULL,
                    262:        NULL
                    263: };
                    264:
                    265: /*
                    266:  * Probe / attach routines.
                    267:  */
                    268:
                    269: /*
                    270:  * Probe for the aria hardware.
                    271:  */
                    272: int
                    273: ariaprobe(parent, self, aux)
                    274:        struct device *parent, *self;
                    275:        void *aux;
                    276: {
                    277:        register struct aria_softc *sc = (void *)self;
                    278:        register struct isa_attach_args *ia = aux;
                    279:         struct cfdata *cf = sc->sc_dev.dv_cfdata;
                    280:        register u_short iobase = ia->ia_iobase;
                    281:        static u_char irq_conf[11] = {
                    282:            -1, -1, 0x01, -1, -1, 0x02, -1, 0x04, -1, 0x01, 0x08
                    283:        };
                    284:        int i,j;
                    285:        int flags = cf->cf_flags;
                    286:
                    287:        if (!ARIA_BASE_VALID(ia->ia_iobase)) {
                    288:                printf("aria: configured iobase %d invalid\n", ia->ia_iobase);
                    289:                return 0;
                    290:        }
                    291:        sc->sc_iobase = iobase;
                    292:
                    293:        if (!ARIA_IRQ_VALID(ia->ia_irq)) {
                    294:                printf("aria: configured irq %d invalid\n", ia->ia_irq);
                    295:                return 0;
                    296:        }
                    297:
                    298:        sc->sc_irq = ia->ia_irq;
                    299:
                    300:        if (flags & ARIAR_PROMETHEUS_KLUDGE)
                    301:                aria_prometheus_kludge(ia);
                    302:
                    303:        if (aria_reset(sc) != 0) {
                    304:                DPRINTF(("aria: aria probe failed\n"));
                    305:                return 0;
                    306:        }
                    307:
                    308:        ia->ia_iosize = ARIADSP_NPORT;
                    309:        return 1;
                    310: }
                    311:
                    312:
                    313:
                    314: /*
                    315:  * I didn't call this a kludge for
                    316:  * nothing.  This is cribbed from
                    317:  * ariainit, the author of that
                    318:  * disassembled some code to discover
                    319:  * how to set up the initial values of
                    320:  * the card.  Without this, the card
                    321:  * is dead. (It will not respond to _any_
                    322:  * input at all.)
                    323:  *
                    324:  * ariainit can be found (ftp) at:
                    325:  * ftp://ftp.wi.leidenuniv.nl/pub/audio/aria/programming/contrib/ariainit.zip
                    326:  * currently.
                    327:  */
                    328:
                    329: void
                    330: aria_prometheus_kludge(ia)
                    331:        register struct isa_attach_args *ia;
                    332: {
                    333:        int     i, j;
                    334:        u_short end;
                    335:        u_short rba = ia->ia_iobase;
                    336:
                    337:        DPRINTF(("aria_prometheus_kludge\n"));
                    338:
                    339: /* Begin Config Sequence */
                    340:
                    341:         outb(0x204, 0x4c);
                    342:         outb(0x205, 0x42);
                    343:         outb(0x206, 0x00);
                    344:         outw(0x200, 0x0f);
                    345:         outb(0x201, 0x00);
                    346:         outw(0x200, 0x02);
                    347:         outb(0x201, rba>>2);
                    348:
                    349: /* These next three lines set up the iobase, and the irq; and disable the drq.  */
                    350:
                    351:        aria_do_kludge(0x111, ((ia->ia_iobase-0x280)>>2)+0xA0, 0xbf, 0xa0, rba);
                    352:        aria_do_kludge(0x011, ia->ia_irq-6, 0xf8, 0x00, rba);
                    353:        aria_do_kludge(0x011, 0x00, 0xef, 0x00, rba);
                    354:
                    355: /* The rest of these lines just disable everything else */
                    356:
                    357:        aria_do_kludge(0x113, 0x00, 0x88, 0x00, rba);
                    358:        aria_do_kludge(0x013, 0x00, 0xf8, 0x00, rba);
                    359:        aria_do_kludge(0x013, 0x00, 0xef, 0x00, rba);
                    360:        aria_do_kludge(0x117, 0x00, 0x88, 0x00, rba);
                    361:        aria_do_kludge(0x017, 0x00, 0xff, 0x00, rba);
                    362:
                    363: /* End Sequence */
                    364:
                    365:        outb(0x200, 0x0f);
                    366:        end = inb(rba);
                    367:        outw(0x200, 0x0f);
                    368:        outb(0x201, end|0x80);
                    369:        inb(0x200);
                    370: /*
                    371:  * This delay is necessary for some reason,
                    372:  * at least it would crash, and sometimes not
                    373:  * probe properly if it did not exist.
                    374:  */
                    375:        delay(1000000);
                    376: }
                    377:
                    378: void
                    379: aria_do_kludge(func, bits, and, or, rba)
                    380:        u_short func;
                    381:        u_short bits;
                    382:        u_short and;
                    383:        u_short or;
                    384:        u_short rba;
                    385: {
                    386:        u_int i;
                    387:        if (func & 0x100) {
                    388:                func &= ~0x100;
                    389:                if (bits) {
                    390:                        outw(0x200, func-1);
                    391:                        outb(0x201, bits);
                    392:                }
                    393:        } else
                    394:                or |= bits;
                    395:
                    396:        outb(0x200, func);
                    397:        i = inb(rba);
                    398:        outw(0x200, func);
                    399:        outb(0x201, (i&and) | or);
                    400: }
                    401:
                    402: /*
                    403:  * Attach hardware to driver, attach hardware driver to audio
                    404:  * pseudo-device driver.
                    405:  */
                    406: void
                    407: ariaattach(parent, self, aux)
                    408:        struct device *parent, *self;
                    409:        void *aux;
                    410: {
                    411:        register struct aria_softc *sc = (struct aria_softc *)self;
                    412:        struct isa_attach_args *ia = (struct isa_attach_args *)aux;
                    413:        register u_short iobase = ia->ia_iobase;
                    414:        register u_short i;
                    415:        int err;
                    416:
                    417:        sc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq, IST_EDGE,
                    418:            IPL_AUDIO, aria_intr, sc, sc->sc_dev.dv_xname);
                    419:
                    420:        i = aria_getdspmem(iobase, ARIAA_HARDWARE_A);
                    421:
                    422:        sc->sc_hardware  = 0;
                    423:        sc->sc_hardware |= ((i>>13)&0x01==1)?ARIA_TELEPHONE:0;
                    424:        sc->sc_hardware |= (((i>>5)&0x07)==0x04)?ARIA_MIXER:0;
                    425:        sc->sc_hardware |= (aria_getdspmem(iobase, ARIAA_MODEL_A)==1)?ARIA_MODEL:0;
                    426:
                    427:        sc->sc_open       = 0;
                    428:        sc->sc_play       = 0;
                    429:        sc->sc_record     = 0;
                    430:        sc->sc_rate       = 7875;
                    431:        sc->sc_chans      = 1;
                    432:        sc->sc_change     = 1;
                    433:        sc->sc_blocksize  = 1024;
                    434:        sc->sc_precision  = 8;
                    435:         sc->sc_rintr      = 0;
                    436:         sc->sc_rarg       = 0;
                    437:         sc->sc_pintr      = 0;
                    438:         sc->sc_parg       = 0;
                    439:        sc->gain[0]       = 127;
                    440:        sc->gain[1]       = 127;
                    441:
                    442:        for (i=0; i<6; i++) {
                    443:                if (i == ARIAMIX_TEL_LVL)
                    444:                        sc->aria_mix[i].num_channels = 1;
                    445:                else
                    446:                        sc->aria_mix[i].num_channels = 2;
                    447:                sc->aria_mix[i].level[0] = 127;
                    448:                sc->aria_mix[i].level[1] = 127;
                    449:        }
                    450:
                    451:        sc->ariamix_master.num_channels = 2;
                    452:        sc->ariamix_master.level[0] = 222;
                    453:        sc->ariamix_master.level[1] = 222;
                    454:        sc->ariamix_master.bass[0] = 127;
                    455:        sc->ariamix_master.bass[1] = 127;
                    456:        sc->ariamix_master.treble[0] = 127;
                    457:        sc->ariamix_master.treble[1] = 127;
                    458:        sc->aria_mix_source = 0;
                    459:
                    460:        sc->sc_change = 1;
                    461:        aria_commit_settings(sc); /* so that my cdplayer is at the 'right' vol */
                    462:
                    463:        printf(": dsp %s", (ARIA_MODEL&sc->sc_hardware)?"SC18026":"SC18025");
                    464:        if (ARIA_TELEPHONE&sc->sc_hardware)
                    465:                printf(", tel");
                    466:        if (ARIA_MIXER&sc->sc_hardware)
                    467:                printf(", SC18075 mixer");
                    468:        printf("\n");
                    469:
                    470:        snprintf(aria_device.version, sizeof aria_device.version, "%s",
                    471:            (ARIA_MODEL&sc->sc_hardware?"SC18026":"SC18025"));
                    472:
                    473:        if ((err = audio_hardware_attach(&aria_hw_if, sc)) != 0)
                    474:                printf("aria: could not attach to audio pseudo-device driver (%d)\n", err);
                    475: }
                    476:
                    477: /*
                    478:  * Various routines to interface to higher level audio driver
                    479:  */
                    480:
                    481: int
                    482: ariaopen(dev, flags)
                    483:        dev_t dev;
                    484:        int flags;
                    485: {
                    486:        struct aria_softc *sc;
                    487:        register u_short iobase = sc->sc_iobase;
                    488:        int unit = AUDIOUNIT(dev);
                    489:        short err;
                    490:
                    491:        DPRINTF(("ariaopen() called\n"));
                    492:
                    493:        if (unit >= aria_cd.cd_ndevs)
                    494:                return ENXIO;
                    495:
                    496:        sc = aria_cd.cd_devs[unit];
                    497:
                    498:        if (!sc || sc->sc_open != 0)
                    499:                return ENXIO;
                    500:
                    501:        sc->sc_open  = 0;
                    502:        if (flags&FREAD)
                    503:                sc->sc_open |= ARIAR_OPEN_RECORD;
                    504:        if (flags&FWRITE)
                    505:                sc->sc_open |= ARIAR_OPEN_PLAY;
                    506:        sc->sc_play  = 0;
                    507:        sc->sc_record= 0;
                    508:        sc->sc_rintr = 0;
                    509:        sc->sc_rarg  = 0;
                    510:        sc->sc_pintr = 0;
                    511:        sc->sc_parg  = 0;
                    512:        sc->sc_change= 1;
                    513:
                    514:        return 0;
                    515: }
                    516:
                    517: int
                    518: aria_getdev(addr, retp)
                    519:        void *addr;
                    520:        struct audio_device *retp;
                    521: {
                    522:        *retp = aria_device;
                    523:        return 0;
                    524: }
                    525:
                    526: #ifdef AUDIO_DEBUG
                    527: void
                    528: aria_printsc(struct aria_softc *sc)
                    529: {
                    530:        printf("open %x dmachan %d irq %d iobase %x nintr %d\n", sc->sc_open, sc->sc_drq,
                    531:                sc->sc_irq, sc->sc_iobase, sc->sc_interrupts);
                    532:        printf("irate %d encoding %x chans %d\n", sc->sc_rate, sc->encoding,
                    533:                sc->sc_chans);
                    534:        printf("\n");
                    535: }
                    536: #endif
                    537:
                    538:
                    539: /*
                    540:  * Various routines to interface to higher level audio driver
                    541:  */
                    542:
                    543: int
                    544: aria_set_sr(addr, sr)
                    545:        void *addr;
                    546:        u_long sr;
                    547: {
                    548:         struct aria_softc *sc = addr;
                    549:
                    550:        if (sr<=9000)
                    551:                sr = 7875;
                    552:        else if (sr<=15000)
                    553:                sr = 11025;
                    554:        else if (sr<=20000)
                    555:                sr = 15750;
                    556:        else if (sr<=25000)
                    557:                sr = 22050;
                    558:        else if (sr<=40000)
                    559:                sr = 31500;
                    560:        else
                    561:                sr = 44100;
                    562:
                    563:        sc->sc_rate = sr;
                    564:        return 0;
                    565: }
                    566:
                    567: u_long
                    568: aria_get_sr(addr)
                    569:        void *addr;
                    570: {
                    571:         struct aria_softc *sc = addr;
                    572:        return sc->sc_rate;
                    573: }
                    574:
                    575: int
                    576: aria_query_encoding(addr, fp)
                    577:     void *addr;
                    578:     struct audio_encoding *fp;
                    579: {
                    580:        register struct aria_softc *sc = addr;
                    581:
                    582:        switch (fp->index) {
                    583:                case 0:
                    584:                        strlcpy(fp->name, AudioEmulaw, sizeof fp->name);
                    585:                        fp->format_id = AUDIO_ENCODING_ULAW;
                    586:                        break;
                    587:                case 1:
                    588:                        strlcpy(fp->name, AudioEpcm16, sizeof fp->name);
                    589:                        fp->format_id = AUDIO_ENCODING_PCM16;
                    590:                        break;
                    591:                default:
                    592:                        return(EINVAL);
                    593:                /*NOTREACHED*/
                    594:        }
                    595:
                    596:        return (0);
                    597: }
                    598:
                    599: int
                    600: aria_set_format(addr, enc, precision)
                    601:        void *addr;
                    602:        u_int enc, prec;
                    603: {
                    604:         register struct aria_softc *sc = addr;
                    605:
                    606:        DPRINTF(("aria_set_format\n"));
                    607:
                    608:         switch(enc){
                    609:         case AUDIO_ENCODING_ULAW:
                    610:         case AUDIO_ENCODING_PCM16:
                    611:        case AUDIO_ENCODING_PCM8:
                    612:                break;
                    613:         default:
                    614:                 return (EINVAL);
                    615:         }
                    616:
                    617:        if (prec!=8 && prec!=16)
                    618:                return (EINVAL);
                    619:
                    620:        if (sc->encoding!=AUDIO_ENCODING_PCM16 && prec==16)
                    621:                return (EINVAL);
                    622:
                    623:        sc->sc_encoding = enc;
                    624:        sc->sc_precision = prec;
                    625:         return (0);
                    626: }
                    627:
                    628: int
                    629: aria_get_encoding(addr)
                    630:        void *addr;
                    631: {
                    632:         register struct aria_softc *sc = addr;
                    633:
                    634:        DPRINTF(("aria_get_encoding\n"));
                    635:
                    636:         return(sc->encoding);
                    637: }
                    638:
                    639: int
                    640: aria_get_precision(addr)
                    641:        void *addr;
                    642: {
                    643:         struct aria_softc *sc = addr;
                    644:
                    645:        DPRINTF(("aria_get_precision\n"));
                    646:
                    647:        return sc->sc_precision;
                    648: }
                    649:
                    650: int
                    651: aria_set_channels(addr, chans)
                    652:        void *addr;
                    653:        int chans;
                    654: {
                    655:         struct aria_softc *sc = addr;
                    656:
                    657:        DPRINTF(("aria_set_channels\n"));
                    658:
                    659:        if (chans != 1 && chans != 2)
                    660:                return EINVAL;
                    661:
                    662:        sc->sc_chans = chans;
                    663:
                    664:        return(0);
                    665: }
                    666:
                    667: int
                    668: aria_get_channels(addr)
                    669:        void *addr;
                    670: {
                    671:         struct aria_softc *sc = addr;
                    672:
                    673:        DPRINTF(("aria_get_channels\n"));
                    674:
                    675:        return sc->sc_chans;
                    676: }
                    677:
                    678: /*
                    679:  * There is only one way to output on
                    680:  * this card.
                    681:  */
                    682: int
                    683: aria_set_out_port(addr, port)
                    684:        void *addr;
                    685:        int port;
                    686: {
                    687:        DPRINTF(("aria_set_out_port\n"));
                    688:        return(0);
                    689: }
                    690:
                    691: int
                    692: aria_get_out_port(addr)
                    693:        void *addr;
                    694: {
                    695:        DPRINTF(("aria_get_out_port\n"));
                    696:        return(ARIAMIX_OUT_LVL);
                    697: }
                    698:
                    699:
                    700: int
                    701: aria_set_in_port(addr, port)
                    702:        void *addr;
                    703:        int port;
                    704: {
                    705:        register struct aria_softc *sc = addr;
                    706:
                    707:        DPRINTF(("aria_set_in_port\n"));
                    708:
                    709:        if (port<0 || port>6)
                    710:                return ENXIO;
                    711:
                    712:        sc->aria_mix_source = port;
                    713:        return(0);
                    714: }
                    715:
                    716: int
                    717: aria_get_in_port(addr)
                    718:        void *addr;
                    719: {
                    720:        register struct aria_softc *sc = addr;
                    721:
                    722:        DPRINTF(("aria_get_in_port\n"));
                    723:
                    724:        return(sc->aria_mix_source);
                    725: }
                    726:
                    727: /*
                    728:  * XXX -- to be done
                    729:  *  I should probably just add a mixer thing, and
                    730:  *  access it through here.
                    731:  */
                    732: int
                    733: aria_speaker_ctl(addr, newstate)
                    734:        void *addr;
                    735:        int newstate;
                    736: {
                    737:        return(0);
                    738: }
                    739:
                    740: /*
                    741:  * Store blocksize in words (what the chipset
                    742:  * understands), but report and take values
                    743:  * in bytes.
                    744:  */
                    745:
                    746: int
                    747: aria_round_blocksize(addr, blk)
                    748:        void *addr;
                    749:        int blk;
                    750: {
                    751:        int i;
                    752:         struct aria_softc *sc = addr;
                    753:        for (i=64; i<1024; i*=2)
                    754:                if (blk <= i)
                    755:                        break;
                    756:        sc->sc_blocksize = i;
                    757:        sc->sc_change = 1;
                    758:        return(i);
                    759: }
                    760:
                    761: /*
                    762:  * This is where all of the twiddling goes on.
                    763:  */
                    764:
                    765: int
                    766: aria_commit_settings(addr)
                    767:        void *addr;
                    768: {
                    769:         struct aria_softc *sc = addr;
                    770:        register u_short iobase = sc->sc_iobase;
                    771:        u_char tones[16] = { 7, 6, 5, 4, 3, 2, 1, 0, 8, 9, 10, 11, 12, 13, 14, 15 };
                    772:        u_short format;
                    773:        u_short left, right;
                    774:        u_short samp;
                    775:        u_char i;
                    776:
                    777:        DPRINTF(("aria_commit_settings\n"));
                    778:
                    779:        switch (sc->sc_rate) {
                    780:                case  7875: format = 0x00; samp = 0x60; break;
                    781:                case 11025: format = 0x00; samp = 0x40; break;
                    782:                case 15750: format = 0x10; samp = 0x60; break;
                    783:                case 22050: format = 0x10; samp = 0x40; break;
                    784:                case 31500: format = 0x10; samp = 0x20; break;
                    785:                case 44100: format = 0x20; samp = 0x00; break;
                    786:                default:    format = 0x00; samp = 0x40; break;
                    787:        }
                    788:
                    789:        format |= (sc->sc_chans==2)?1:0;
                    790:        format |= (sc->sc_precision==16)?2:0;
                    791:
                    792:        aria_sendcmd(iobase, ARIADSPC_FORMAT, format, -1, -1);
                    793:        outw(iobase+ARIADSP_CONTROL, (inw(iobase+ARIADSP_STATUS)&~0x60)|samp); /* Addition parm for sample rate */
                    794:
                    795:        if (sc->sc_hardware&ARIA_MIXER) {
                    796:                for (i=0; i<6; i++) {
                    797:                        u_char source;
                    798:                        switch(i) {
                    799:                        case ARIAMIX_MIC_LVL:     source = 0x0001; break;
                    800:                        case ARIAMIX_CD_LVL:      source = 0x0002; break;
                    801:                        case ARIAMIX_LINE_IN_LVL: source = 0x0008; break;
                    802:                        case ARIAMIX_TEL_LVL:     source = 0x0020; break;
                    803:                        case ARIAMIX_AUX_LVL:     source = 0x0010; break;
                    804:                        case ARIAMIX_DAC_LVL:     source = 0x0004; break;
                    805:                        default:               source = 0x0000; break;
                    806:                        }
                    807:
                    808:                        if (source != 0x0000 && source != 0x0004) {
                    809:                                if (sc->aria_mix[i].mute == 1)
                    810:                                        aria_sendcmd(iobase, ARIADSPC_INPMONMODE, source, 3, -1);
                    811:                                else
                    812:                                        aria_sendcmd(iobase, ARIADSPC_INPMONMODE, source, (sc->aria_mix[i].num_channels==2)?0:1, -1);
                    813:
                    814:                                aria_sendcmd(iobase, ARIADSPC_INPMONMODE, 0x8000|source, (sc->aria_mix[i].num_channels==2)?0:1, -1);
                    815:                                aria_sendcmd(iobase, ARIADSPC_MIXERVOL, source, sc->aria_mix[i].level[0] << 7, sc->aria_mix[i].level[1] << 7);
                    816:                        }
                    817:
                    818:                        if (sc->aria_mix_source == i) {
                    819:                                aria_sendcmd(iobase, ARIADSPC_ADCSOURCE, source, -1, -1);
                    820:
                    821:                                if (sc->sc_open & ARIAR_OPEN_RECORD)
                    822:                                        aria_sendcmd(iobase, ARIADSPC_ADCCONTROL, 1, -1, -1);
                    823:                                else
                    824:                                        aria_sendcmd(iobase, ARIADSPC_ADCCONTROL, 0, -1, -1);
                    825:                        }
                    826:                }
                    827:
                    828:                if (sc->sc_chans==2) {
                    829:                        aria_sendcmd(iobase, ARIADSPC_CHAN_VOL, (sc->gain[0]+sc->gain[1])/2, -1, -1);
                    830:                        aria_sendcmd(iobase, ARIADSPC_CHAN_PAN, (sc->gain[0]-sc->gain[1])/4+0x40, -1, -1);
                    831:                } else {
                    832:                        aria_sendcmd(iobase, ARIADSPC_CHAN_VOL, sc->gain[0], -1, -1);
                    833:                        aria_sendcmd(iobase, ARIADSPC_CHAN_PAN, 0x40, -1, -1);
                    834:                }
                    835:
                    836:                /* aria_sendcmd(iobase, ARIADSPC_MASMONMODE, (sc->ariamix_master.num_channels==2)?0:1 | (1<<8), -1, -1); */
                    837:                aria_sendcmd(iobase, ARIADSPC_MASMONMODE, (sc->ariamix_master.num_channels==2)?0:1, -1, -1);
                    838:
                    839:                aria_sendcmd(iobase, ARIADSPC_MIXERVOL, 0x0004, sc->ariamix_master.level[0] << 7, sc->ariamix_master.level[1] << 7);
                    840:
                    841:                /* Convert treb/bass from byte to soundcard style */
                    842:
                    843:                left  = tones[(sc->ariamix_master.bass[0]>>4)&0x0f]<<8 | tones[(sc->ariamix_master.treble[0]>>4)&0x0f];
                    844:                right = tones[(sc->ariamix_master.bass[1]>>4)&0x0f]<<8 | tones[(sc->ariamix_master.treble[1]>>4)&0x0f];
                    845:
                    846:                aria_sendcmd(iobase, ARIADSPC_TONE, left, right, -1);
                    847:        }
                    848:
                    849:        if (sc->sc_change != 0)
                    850:                aria_sendcmd(iobase, ARIADSPC_BLOCKSIZE, sc->sc_blocksize/2, -1, -1);
                    851:
                    852: /*
                    853:  * If we think that the card is recording or playing, start it up again here.
                    854:  * Some of the previous commands turn the channels off.
                    855:  */
                    856:
                    857:        if (sc->sc_record&(1<<ARIAR_RECORD_CHAN)) {
                    858:                aria_sendcmd(iobase, ARIADSPC_START_REC, ARIAR_PLAY_CHAN, -1, -1);
                    859:                sc->sc_play |= (1<<ARIAR_RECORD_CHAN);
                    860:        }
                    861:
                    862:        if (sc->sc_play&(1<<ARIAR_PLAY_CHAN)) {
                    863:                aria_sendcmd(iobase, ARIADSPC_START_PLAY, ARIAR_PLAY_CHAN, -1, -1);
                    864:                sc->sc_play |= (1<<ARIAR_PLAY_CHAN);
                    865:        }
                    866:
                    867:        sc->sc_change = 0;
                    868:
                    869:        return(0);
                    870: }
                    871:
                    872: void
                    873: ariaclose(addr)
                    874:        void *addr;
                    875: {
                    876:         struct aria_softc *sc = addr;
                    877:        register u_int iobase = sc->sc_iobase;
                    878:
                    879:        DPRINTF(("aria_close sc=0x%x\n", sc));
                    880:
                    881:         sc->spkr_state = SPKR_OFF;
                    882:         sc->sc_rintr = 0;
                    883:         sc->sc_pintr = 0;
                    884:        sc->sc_rdiobuffer = 0;
                    885:        sc->sc_pdiobuffer = 0;
                    886:
                    887:        if (sc->sc_play&(1<<ARIAR_PLAY_CHAN) && sc->sc_open & ARIAR_OPEN_PLAY) {
                    888:                aria_sendcmd(iobase, ARIADSPC_STOP_PLAY, ARIAR_PLAY_CHAN, -1, -1);
                    889:                sc->sc_play &= ~(1<<ARIAR_PLAY_CHAN);
                    890:        }
                    891:
                    892:        if (sc->sc_record&(1<<ARIAR_RECORD_CHAN) && sc->sc_open & ARIAR_OPEN_RECORD) {
                    893:                aria_sendcmd(iobase, ARIADSPC_STOP_REC, ARIAR_RECORD_CHAN, -1, -1);
                    894:                sc->sc_record &= ~(1<<ARIAR_RECORD_CHAN);
                    895:        }
                    896:
                    897:        sc->sc_open = 0;
                    898:
                    899:        if (aria_reset(sc) != 0) {
                    900:                delay(500);
                    901:                aria_reset(sc);
                    902:        }
                    903: }
                    904:
                    905: /*
                    906:  * Reset the hardware.
                    907:  */
                    908:
                    909: int
                    910: aria_reset(sc)
                    911:        register struct aria_softc *sc;
                    912: {
                    913:        register u_short iobase = sc->sc_iobase;
                    914:        int fail=0;
                    915:
                    916:        outw(iobase + ARIADSP_CONTROL, ARIAR_ARIA_SYNTH|ARIAR_SR22K|ARIAR_DSPINTWR);
                    917:        aria_putdspmem(iobase, 0x6102, 0);
                    918:
                    919:        fail |= aria_sendcmd(iobase, ARIADSPC_SYSINIT, 0x0000, 0x0000, 0x0000);
                    920:
                    921:        while (aria_getdspmem(iobase, ARIAA_TASK_A) != 1)
                    922:                ;
                    923:
                    924:        outw(iobase+ARIADSP_CONTROL, ARIAR_ARIA_SYNTH|ARIAR_SR22K|ARIAR_DSPINTWR|ARIAR_PCINTWR);
                    925:        fail |= aria_sendcmd(iobase, ARIADSPC_MODE, ARIAV_MODE_NO_SYNTH,-1,-1);
                    926:
                    927:        return (fail);
                    928: }
                    929:
                    930: /*
                    931:  * Lower-level routines
                    932:  */
                    933:
                    934: u_short
                    935: aria_putdspmem(iobase, loc, val)
                    936:        register u_short iobase;
                    937:        register u_short loc;
                    938:        register u_short val;
                    939: {
                    940:        outw(iobase + ARIADSP_DMAADDRESS, loc);
                    941:        outw(iobase + ARIADSP_DMADATA, val);
                    942: }
                    943:
                    944: u_short
                    945: aria_getdspmem(iobase, loc)
                    946:        register u_short iobase;
                    947:        register u_short loc;
                    948: {
                    949:        outw(iobase+ARIADSP_DMAADDRESS, loc);
                    950:        return inw(iobase+ARIADSP_DMADATA);
                    951: }
                    952:
                    953: /*
                    954:  * aria_sendcmd()
                    955:  *  each full DSP command is unified into this
                    956:  *  function.
                    957:  */
                    958:
                    959: int
                    960: aria_sendcmd(iobase, command, arg1, arg2, arg3)
                    961:        u_short iobase;
                    962:        u_short command;
                    963:        int arg1;
                    964:        int arg2;
                    965:        int arg3;
                    966: {
                    967:        int i, fail = 0;
                    968:
                    969:        for (i = ARIAR_NPOLL; (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY) != 0 && i>0; i-- )
                    970:                ;
                    971:
                    972:        fail |= (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY)==0?0:1;
                    973:        outw(iobase + ARIADSP_WRITE, (u_short) command);
                    974:
                    975:        if (arg1 != -1) {
                    976:                for (i = ARIAR_NPOLL; (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY) != 0 && i>0; i-- )
                    977:                        ;
                    978:
                    979:                fail |= (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY)==0?0:2;
                    980:                outw(iobase + ARIADSP_WRITE, (u_short) arg1);
                    981:        }
                    982:
                    983:        if (arg2 != -1) {
                    984:                for (i = ARIAR_NPOLL; (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY) != 0 && i>0; i-- )
                    985:                        ;
                    986:
                    987:                fail |= (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY)==0?0:4;
                    988:                outw(iobase + ARIADSP_WRITE, (u_short) arg2);
                    989:        }
                    990:
                    991:        if (arg3 != -1) {
                    992:                for (i = ARIAR_NPOLL; (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY) != 0 && i>0; i-- )
                    993:                        ;
                    994:
                    995:                fail |= (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY)==0?0:8;
                    996:                outw(iobase + ARIADSP_WRITE, (u_short) arg3);
                    997:        }
                    998:
                    999:        for (i = ARIAR_NPOLL; (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY) != 0 && i>0; i-- )
                   1000:                ;
                   1001:
                   1002:         fail |= (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY)==0?0:16;
                   1003:        outw(iobase + ARIADSP_WRITE, (u_short) ARIADSPC_TERM);
                   1004:
                   1005: #ifdef AUDIO_DEBUG
                   1006:        if (fail) {
                   1007:                ++ariaerr.sendcmd;
                   1008:                DPRINTF(("aria_sendcmd: failure=(%d) cmd=(0x%x) fail=(0x%x)\n", ariaerr.sendcmd, command, fail));
                   1009:                return -1;
                   1010:        }
                   1011: #else
                   1012:        if (fail != 0) {
                   1013:                ++ariaerr.sendcmd;
                   1014:                return -1;
                   1015:        }
                   1016: #endif
                   1017:
                   1018:        return 0;
                   1019: }
                   1020:
                   1021: int
                   1022: aria_halt_input(addr)
                   1023:        void *addr;
                   1024: {
                   1025:        register struct aria_softc *sc = addr;
                   1026:
                   1027:        DPRINTF(("aria_halt_input\n"));
                   1028:
                   1029:        if (sc->sc_record&(1<<0)) {
                   1030:                aria_sendcmd(sc->sc_iobase, ARIADSPC_STOP_REC, 0, -1, -1);
                   1031:                sc->sc_record &= ~(1<<0);
                   1032:        }
                   1033:
                   1034:        return(0);
                   1035: }
                   1036:
                   1037: int
                   1038: aria_halt_output(addr)
                   1039:        void *addr;
                   1040: {
                   1041:        register struct aria_softc *sc = addr;
                   1042:
                   1043:        DPRINTF(("aria_halt_output\n"));
                   1044:
                   1045:        if (sc->sc_play & (1<<1)) {
                   1046:                aria_sendcmd(sc->sc_iobase, ARIADSPC_STOP_PLAY, 1, -1, -1);
                   1047:                sc->sc_play &= ~(1<<1);
                   1048:        }
                   1049:
                   1050:        return(0);
                   1051: }
                   1052:
                   1053: /*
                   1054:  * This is not called in dev/audio.c?
                   1055:  */
                   1056: int
                   1057: aria_cont(addr)
                   1058:        void *addr;
                   1059: {
                   1060:        register struct aria_softc *sc = addr;
                   1061:
                   1062:        DPRINTF(("aria_cont\n"));
                   1063:
                   1064:        if (!(sc->sc_record&(1<<0)) && (sc->sc_open&ARIAR_OPEN_RECORD)) {
                   1065:                aria_sendcmd(sc->sc_iobase, ARIADSPC_START_REC,  ARIAR_RECORD_CHAN, -1, -1);
                   1066:                sc->sc_record |= ~(1<<ARIAR_RECORD_CHAN);
                   1067:        }
                   1068:
                   1069:        if (!(sc->sc_play&(1<<ARIAR_PLAY_CHAN)) && (sc->sc_open&ARIAR_OPEN_PLAY)) {
                   1070:                aria_sendcmd(sc->sc_iobase, ARIADSPC_START_PLAY, 1, -1, -1);
                   1071:                sc->sc_play |= ~(1<<ARIAR_PLAY_CHAN);
                   1072:        }
                   1073:
                   1074:        return(0);
                   1075: }
                   1076:
                   1077: /*
                   1078:  * Here we just set up the buffers.  If we receive
                   1079:  * an interrupt without these set, it is ignored.
                   1080:  */
                   1081:
                   1082: int
                   1083: aria_start_input(addr, p, cc, intr, arg)
                   1084:        void *addr;
                   1085:        void *p;
                   1086:        int cc;
                   1087:        void (*intr)();
                   1088:        void *arg;
                   1089: {
                   1090:        register struct aria_softc *sc = addr;
                   1091:        register int i;
                   1092:
                   1093:        DPRINTF(("aria_start_input %d @ %x\n", cc, p));
                   1094:
                   1095:        if (cc != sc->sc_blocksize) {
                   1096:                DPRINTF(("aria_start_input reqsize %d not sc_blocksize %d\n",
                   1097:                        cc, sc->sc_blocksize));
                   1098:                return EINVAL;
                   1099:        }
                   1100:
                   1101:        sc->sc_rarg = arg;
                   1102:        sc->sc_rintr = intr;
                   1103:        sc->sc_rdiobuffer = p;
                   1104:
                   1105:        if (!(sc->sc_record&(1<<0))) {
                   1106:                aria_sendcmd(sc->sc_iobase, ARIADSPC_START_REC,  0, -1, -1);
                   1107:                sc->sc_record |= (1<<0);
                   1108:        }
                   1109:
                   1110:        return 0;
                   1111: }
                   1112:
                   1113: int
                   1114: aria_start_output(addr, p, cc, intr, arg)
                   1115:        void *addr;
                   1116:        void *p;
                   1117:        int cc;
                   1118:        void (*intr)();
                   1119:        void *arg;
                   1120: {
                   1121:        register struct aria_softc *sc = addr;
                   1122:        register int i;
                   1123:
                   1124:        DPRINTF(("aria_start_output %d @ %x\n", cc, p));
                   1125:
                   1126:        if (cc != sc->sc_blocksize) {
                   1127:                DPRINTF(("aria_start_output reqsize %d not sc_blocksize %d\n",
                   1128:                        cc, sc->sc_blocksize));
                   1129:                return EINVAL;
                   1130:        }
                   1131:
                   1132:        sc->sc_parg = arg;
                   1133:        sc->sc_pintr = intr;
                   1134:        sc->sc_pdiobuffer = p;
                   1135:
                   1136:        if (!(sc->sc_play&(1<<1))) {
                   1137:                aria_sendcmd(sc->sc_iobase, ARIADSPC_START_PLAY,  1, -1, -1);
                   1138:                sc->sc_play |= (1<<1);
                   1139:        }
                   1140:
                   1141:        return 0;
                   1142: }
                   1143:
                   1144: /*
                   1145:  * Process an interrupt.  This should be a
                   1146:  * request (from the card) to write or read
                   1147:  * samples.
                   1148:  */
                   1149: int
                   1150: aria_intr(arg)
                   1151:        void *arg;
                   1152: {
                   1153:        register struct  aria_softc *sc = arg;
                   1154:        register u_short iobase = sc->sc_iobase;
                   1155:        register u_short *pdata = sc->sc_pdiobuffer;
                   1156:        register u_short *rdata = sc->sc_rdiobuffer;
                   1157:        u_short address;
                   1158:        int i;
                   1159:
                   1160:        if (inw(iobase) & 1 != 0x1)
                   1161:                return 0;  /* not for us */
                   1162:
                   1163:        sc->sc_interrupts++;
                   1164:
                   1165:        DPRINTF(("aria_intr\n"));
                   1166:
                   1167:        if ((sc->sc_open & ARIAR_OPEN_PLAY) && (pdata!=NULL)) {
                   1168:                DPRINTF(("aria_intr play=(%x)\n", pdata));
                   1169:                address = 0x8000 - 2*(sc->sc_blocksize);
                   1170:                address+= aria_getdspmem(iobase, ARIAA_PLAY_FIFO_A);
                   1171:                outw(iobase+ARIADSP_DMAADDRESS, address);
                   1172:                outsw(iobase + ARIADSP_DMADATA, pdata, sc->sc_blocksize/2);
                   1173:                if (sc->sc_pintr != NULL)
                   1174:                        (*sc->sc_pintr)(sc->sc_parg);
                   1175:        }
                   1176:
                   1177:        if ((sc->sc_open & ARIAR_OPEN_RECORD) && (rdata!=NULL)) {
                   1178:                DPRINTF(("aria_intr record=(%x)\n", rdata));
                   1179:                address = 0x8000 - (sc->sc_blocksize);
                   1180:                address+= aria_getdspmem(iobase, ARIAA_REC_FIFO_A);
                   1181:                outw(iobase+ARIADSP_DMAADDRESS, address);
                   1182:                insw(iobase + ARIADSP_DMADATA, rdata, sc->sc_blocksize/2);
                   1183:                if (sc->sc_rintr != NULL)
                   1184:                        (*sc->sc_rintr)(sc->sc_rarg);
                   1185:        }
                   1186:
                   1187:        aria_sendcmd(iobase, ARIADSPC_TRANSCOMPLETE, -1, -1, -1);
                   1188:
                   1189:        return 1;
                   1190: }
                   1191:
                   1192: int
                   1193: aria_setfd(addr, flag)
                   1194:        void *addr;
                   1195:        int flag;
                   1196: {
                   1197: /*
                   1198:  * okay return yes.  I'll assume that it will only
                   1199:  * ask when the file open read/write...  Or before...
                   1200:  */
                   1201:        return(0);
                   1202: }
                   1203:
                   1204: int
                   1205: aria_mixer_set_port(addr, cp)
                   1206:     void *addr;
                   1207:     mixer_ctrl_t *cp;
                   1208: {
                   1209:        register struct aria_softc *sc = addr;
                   1210:        int error = EINVAL;
                   1211:
                   1212:        DPRINTF(("aria_mixer_set_port\n"));
                   1213:
                   1214:        if (!(ARIA_MIXER&sc->sc_hardware))  /* This could be done better, no mixer still has some controls. */
                   1215:                return ENXIO;
                   1216:
                   1217:        if (cp->type == AUDIO_MIXER_VALUE) {
                   1218:                register mixer_level_t *mv = &cp->un.value;
                   1219:                switch (cp->dev) {
                   1220:                case ARIAMIX_MIC_LVL:
                   1221:                        if (mv->num_channels == 1 || mv->num_channels == 2) {
                   1222:                                sc->aria_mix[ARIAMIX_MIC_LVL].num_channels = mv->num_channels;
                   1223:                                sc->aria_mix[ARIAMIX_MIC_LVL].level[0] = mv->level[0];
                   1224:                                sc->aria_mix[ARIAMIX_MIC_LVL].level[1] = mv->level[1];
                   1225:                                error = 0;
                   1226:                        }
                   1227:                        break;
                   1228:
                   1229:                case ARIAMIX_LINE_IN_LVL:
                   1230:                        if (mv->num_channels == 1 || mv->num_channels == 2) {
                   1231:                                sc->aria_mix[ARIAMIX_LINE_IN_LVL].num_channels = mv->num_channels;
                   1232:                                sc->aria_mix[ARIAMIX_LINE_IN_LVL].level[0] = mv->level[0];
                   1233:                                sc->aria_mix[ARIAMIX_LINE_IN_LVL].level[1] = mv->level[1];
                   1234:                                error = 0;
                   1235:                        }
                   1236:                        break;
                   1237:
                   1238:                case ARIAMIX_CD_LVL:
                   1239:                        if (mv->num_channels == 1 || mv->num_channels == 2) {
                   1240:                                sc->aria_mix[ARIAMIX_CD_LVL].num_channels = mv->num_channels;
                   1241:                                sc->aria_mix[ARIAMIX_CD_LVL].level[0] = mv->level[0];
                   1242:                                sc->aria_mix[ARIAMIX_CD_LVL].level[1] = mv->level[1];
                   1243:                                error = 0;
                   1244:                        }
                   1245:                        break;
                   1246:
                   1247:                case ARIAMIX_TEL_LVL:
                   1248:                        if (mv->num_channels == 1) {
                   1249:                                sc->aria_mix[ARIAMIX_TEL_LVL].num_channels = mv->num_channels;
                   1250:                                sc->aria_mix[ARIAMIX_TEL_LVL].level[0] = mv->level[0];
                   1251:                                error = 0;
                   1252:                        }
                   1253:                        break;
                   1254:
                   1255:                case ARIAMIX_DAC_LVL:
                   1256:                        if (mv->num_channels == 1 || mv->num_channels == 2) {
                   1257:                                sc->aria_mix[ARIAMIX_DAC_LVL].num_channels = mv->num_channels;
                   1258:                                sc->aria_mix[ARIAMIX_DAC_LVL].level[0] = mv->level[0];
                   1259:                                sc->aria_mix[ARIAMIX_DAC_LVL].level[1] = mv->level[1];
                   1260:                                error = 0;
                   1261:                        }
                   1262:                        break;
                   1263:
                   1264:                case ARIAMIX_AUX_LVL:
                   1265:                        if (mv->num_channels == 1 || mv->num_channels == 2) {
                   1266:                                sc->aria_mix[ARIAMIX_AUX_LVL].num_channels = mv->num_channels;
                   1267:                                sc->aria_mix[ARIAMIX_AUX_LVL].level[0] = mv->level[0];
                   1268:                                sc->aria_mix[ARIAMIX_AUX_LVL].level[1] = mv->level[1];
                   1269:                                error = 0;
                   1270:                        }
                   1271:                        break;
                   1272:
                   1273:                case ARIAMIX_MASTER_LVL:
                   1274:                        if (mv->num_channels == 1 || mv->num_channels == 2) {
                   1275:                                sc->ariamix_master.num_channels = mv->num_channels;
                   1276:                                sc->ariamix_master.level[0] = mv->level[0];
                   1277:                                sc->ariamix_master.level[1] = mv->level[1];
                   1278:                                error = 0;
                   1279:                        }
                   1280:                        break;
                   1281:
                   1282:                case ARIAMIX_MASTER_TREBLE:
                   1283:                        if (mv->num_channels == 2) {
                   1284:                                sc->ariamix_master.treble[0] = (mv->level[0]==0)?1:mv->level[0];
                   1285:                                sc->ariamix_master.treble[1] = (mv->level[1]==0)?1:mv->level[1];
                   1286:                                error = 0;
                   1287:                        }
                   1288:                        break;
                   1289:                case ARIAMIX_MASTER_BASS:
                   1290:                        if (mv->num_channels == 2) {
                   1291:                                sc->ariamix_master.bass[0] = (mv->level[0]==0)?1:mv->level[0];
                   1292:                                sc->ariamix_master.bass[1] = (mv->level[1]==0)?1:mv->level[1];
                   1293:                                error = 0;
                   1294:                        }
                   1295:                        break;
                   1296:                case ARIAMIX_OUT_LVL:
                   1297:                        if (mv->num_channels == 1 || mv->num_channels == 2) {
                   1298:                                sc->gain[0] = mv->level[0];
                   1299:                                sc->gain[1] = mv->level[1];
                   1300:                                error = 0;
                   1301:                        }
                   1302:                        break;
                   1303:                default:
                   1304:                }
                   1305:        }
                   1306:
                   1307:        if (cp->type == AUDIO_MIXER_ENUM)
                   1308:                switch(cp->dev) {
                   1309:                case ARIAMIX_RECORD_SOURCE:
                   1310:                        if (cp->un.ord>=0 && cp->un.ord<=6) {
                   1311:                                sc->aria_mix_source = cp->un.ord;
                   1312:                                error = 0;
                   1313:                        }
                   1314:                        break;
                   1315:
                   1316:                case ARIAMIX_MIC_MUTE:
                   1317:                        if (cp->un.ord == 0 || cp->un.ord == 1) {
                   1318:                                sc->aria_mix[ARIAMIX_MIC_LVL].mute = cp->un.ord;
                   1319:                                error = 0;
                   1320:                        }
                   1321:                        break;
                   1322:
                   1323:                case ARIAMIX_LINE_IN_MUTE:
                   1324:                        if (cp->un.ord == 0 || cp->un.ord == 1) {
                   1325:                                sc->aria_mix[ARIAMIX_LINE_IN_LVL].mute = cp->un.ord;
                   1326:                                error = 0;
                   1327:                        }
                   1328:                        break;
                   1329:
                   1330:                case ARIAMIX_CD_MUTE:
                   1331:                        if (cp->un.ord == 0 || cp->un.ord == 1) {
                   1332:                                sc->aria_mix[ARIAMIX_CD_LVL].mute = cp->un.ord;
                   1333:                                error = 0;
                   1334:                        }
                   1335:                        break;
                   1336:
                   1337:                case ARIAMIX_DAC_MUTE:
                   1338:                        if (cp->un.ord == 0 || cp->un.ord == 1) {
                   1339:                                sc->aria_mix[ARIAMIX_DAC_LVL].mute = cp->un.ord;
                   1340:                                error = 0;
                   1341:                        }
                   1342:                        break;
                   1343:
                   1344:                case ARIAMIX_AUX_MUTE:
                   1345:                        if (cp->un.ord == 0 || cp->un.ord == 1) {
                   1346:                                sc->aria_mix[ARIAMIX_AUX_LVL].mute = cp->un.ord;
                   1347:                                error = 0;
                   1348:                        }
                   1349:                        break;
                   1350:
                   1351:                case ARIAMIX_TEL_MUTE:
                   1352:                        if (cp->un.ord == 0 || cp->un.ord == 1) {
                   1353:                                sc->aria_mix[ARIAMIX_TEL_LVL].mute = cp->un.ord;
                   1354:                                error = 0;
                   1355:                        }
                   1356:                        break;
                   1357:
                   1358:                default:
                   1359:                        return ENXIO;
                   1360:                        /* NOTREACHED */
                   1361:                }
                   1362:
                   1363:        return(error);
                   1364: }
                   1365:
                   1366: int
                   1367: aria_mixer_get_port(addr, cp)
                   1368:     void *addr;
                   1369:     mixer_ctrl_t *cp;
                   1370: {
                   1371:        register struct aria_softc *sc = addr;
                   1372:        int error = EINVAL;
                   1373:
                   1374:        DPRINTF(("aria_mixer_get_port\n"));
                   1375:
                   1376:        if (!(ARIA_MIXER&sc->sc_hardware))  /* This could be done better, no mixer still has some controls. */
                   1377:                return ENXIO;
                   1378:
                   1379:        switch (cp->dev) {
                   1380:        case ARIAMIX_MIC_LVL:
                   1381:                if (cp->type == AUDIO_MIXER_VALUE) {
                   1382:                        cp->un.value.num_channels = sc->aria_mix[ARIAMIX_MIC_LVL].num_channels;
                   1383:                        cp->un.value.level[0] = sc->aria_mix[ARIAMIX_MIC_LVL].level[0];
                   1384:                        cp->un.value.level[1] = sc->aria_mix[ARIAMIX_MIC_LVL].level[1];
                   1385:                        error = 0;
                   1386:                }
                   1387:                break;
                   1388:
                   1389:        case ARIAMIX_LINE_IN_LVL:
                   1390:                if (cp->type == AUDIO_MIXER_VALUE) {
                   1391:                        cp->un.value.num_channels = sc->aria_mix[ARIAMIX_LINE_IN_LVL].num_channels;
                   1392:                        cp->un.value.level[0] = sc->aria_mix[ARIAMIX_LINE_IN_LVL].level[0];
                   1393:                        cp->un.value.level[1] = sc->aria_mix[ARIAMIX_LINE_IN_LVL].level[1];
                   1394:                        error = 0;
                   1395:                }
                   1396:                break;
                   1397:
                   1398:        case ARIAMIX_CD_LVL:
                   1399:                if (cp->type == AUDIO_MIXER_VALUE) {
                   1400:                        cp->un.value.num_channels = sc->aria_mix[ARIAMIX_CD_LVL].num_channels;
                   1401:                        cp->un.value.level[0] = sc->aria_mix[ARIAMIX_CD_LVL].level[0];
                   1402:                        cp->un.value.level[1] = sc->aria_mix[ARIAMIX_CD_LVL].level[1];
                   1403:                        error = 0;
                   1404:                }
                   1405:                break;
                   1406:
                   1407:        case ARIAMIX_TEL_LVL:
                   1408:                if (cp->type == AUDIO_MIXER_VALUE) {
                   1409:                        cp->un.value.num_channels = sc->aria_mix[ARIAMIX_TEL_LVL].num_channels;
                   1410:                        cp->un.value.level[0] = sc->aria_mix[ARIAMIX_TEL_LVL].level[0];
                   1411:                        error = 0;
                   1412:                }
                   1413:                break;
                   1414:        case ARIAMIX_DAC_LVL:
                   1415:                if (cp->type == AUDIO_MIXER_VALUE) {
                   1416:                        cp->un.value.num_channels = sc->aria_mix[ARIAMIX_DAC_LVL].num_channels;
                   1417:                        cp->un.value.level[0] = sc->aria_mix[ARIAMIX_DAC_LVL].level[0];
                   1418:                        cp->un.value.level[1] = sc->aria_mix[ARIAMIX_DAC_LVL].level[1];
                   1419:                        error = 0;
                   1420:                }
                   1421:                break;
                   1422:
                   1423:        case ARIAMIX_AUX_LVL:
                   1424:                if (cp->type == AUDIO_MIXER_VALUE) {
                   1425:                        cp->un.value.num_channels = sc->aria_mix[ARIAMIX_AUX_LVL].num_channels;
                   1426:                        cp->un.value.level[0] = sc->aria_mix[ARIAMIX_AUX_LVL].level[0];
                   1427:                        cp->un.value.level[1] = sc->aria_mix[ARIAMIX_AUX_LVL].level[1];
                   1428:                        error = 0;
                   1429:                }
                   1430:                break;
                   1431:
                   1432:        case ARIAMIX_MIC_MUTE:
                   1433:                if (cp->type == AUDIO_MIXER_ENUM) {
                   1434:                        cp->un.ord = sc->aria_mix[ARIAMIX_MIC_LVL].mute;
                   1435:                        error = 0;
                   1436:                }
                   1437:                break;
                   1438:
                   1439:        case ARIAMIX_LINE_IN_MUTE:
                   1440:                if (cp->type == AUDIO_MIXER_ENUM) {
                   1441:                        cp->un.ord = sc->aria_mix[ARIAMIX_LINE_IN_LVL].mute;
                   1442:                        error = 0;
                   1443:                }
                   1444:                break;
                   1445:
                   1446:        case ARIAMIX_CD_MUTE:
                   1447:                if (cp->type == AUDIO_MIXER_ENUM) {
                   1448:                        cp->un.ord = sc->aria_mix[ARIAMIX_CD_LVL].mute;
                   1449:                        error = 0;
                   1450:                }
                   1451:                break;
                   1452:
                   1453:        case ARIAMIX_DAC_MUTE:
                   1454:                if (cp->type == AUDIO_MIXER_ENUM) {
                   1455:                        cp->un.ord = sc->aria_mix[ARIAMIX_DAC_LVL].mute;
                   1456:                        error = 0;
                   1457:                }
                   1458:                break;
                   1459:
                   1460:        case ARIAMIX_AUX_MUTE:
                   1461:                if (cp->type == AUDIO_MIXER_ENUM) {
                   1462:                        cp->un.ord = sc->aria_mix[ARIAMIX_AUX_LVL].mute;
                   1463:                        error = 0;
                   1464:                }
                   1465:                break;
                   1466:
                   1467:        case ARIAMIX_TEL_MUTE:
                   1468:                if (cp->type == AUDIO_MIXER_ENUM) {
                   1469:                        cp->un.ord = sc->aria_mix[ARIAMIX_TEL_LVL].mute;
                   1470:                        error = 0;
                   1471:                }
                   1472:                break;
                   1473:
                   1474:        case ARIAMIX_MASTER_LVL:
                   1475:                if (cp->type == AUDIO_MIXER_VALUE) {
                   1476:                        cp->un.value.num_channels = sc->ariamix_master.num_channels;
                   1477:                        cp->un.value.level[0] = sc->ariamix_master.level[0];
                   1478:                        cp->un.value.level[1] = sc->ariamix_master.level[1];
                   1479:                        error = 0;
                   1480:                }
                   1481:                break;
                   1482:
                   1483:        case ARIAMIX_MASTER_TREBLE:
                   1484:                if (cp->type == AUDIO_MIXER_VALUE) {
                   1485:                        cp->un.value.num_channels = 2;
                   1486:                        cp->un.value.level[0] = sc->ariamix_master.treble[0];
                   1487:                        cp->un.value.level[1] = sc->ariamix_master.treble[1];
                   1488:                        error = 0;
                   1489:                }
                   1490:                break;
                   1491:
                   1492:        case ARIAMIX_MASTER_BASS:
                   1493:                if (cp->type == AUDIO_MIXER_VALUE) {
                   1494:                        cp->un.value.num_channels = 2;
                   1495:                        cp->un.value.level[0] = sc->ariamix_master.bass[0];
                   1496:                        cp->un.value.level[1] = sc->ariamix_master.bass[1];
                   1497:                        error = 0;
                   1498:                }
                   1499:                break;
                   1500:
                   1501:        case ARIAMIX_OUT_LVL:
                   1502:                if (cp->type == AUDIO_MIXER_VALUE) {
                   1503:                        cp->un.value.num_channels = sc->sc_chans;
                   1504:                        cp->un.value.level[0] = sc->gain[0];
                   1505:                        cp->un.value.level[1] = sc->gain[1];
                   1506:                        error = 0;
                   1507:                }
                   1508:                break;
                   1509:        case ARIAMIX_RECORD_SOURCE:
                   1510:                if (cp->type == AUDIO_MIXER_ENUM) {
                   1511:                        cp->un.ord = sc->aria_mix_source;
                   1512:                        error = 0;
                   1513:                }
                   1514:                break;
                   1515:
                   1516:        default:
                   1517:                return ENXIO;
                   1518:                /* NOT REACHED */
                   1519:        }
                   1520:
                   1521:        return(error);
                   1522: }
                   1523:
                   1524: int
                   1525: aria_mixer_query_devinfo(addr, dip)
                   1526:           void *addr;
                   1527:           register mixer_devinfo_t *dip;
                   1528: {
                   1529:
                   1530:        register struct aria_softc *sc = addr;
                   1531:
                   1532:        DPRINTF(("aria_mixer_query_devinfo\n"));
                   1533:
                   1534:        if (!(ARIA_MIXER&sc->sc_hardware))  /* This could be done better, no mixer still has some controls. */
                   1535:                return ENXIO;
                   1536:
                   1537:        dip->prev = dip->next = AUDIO_MIXER_LAST;
                   1538:
                   1539:        switch(dip->index) {
                   1540:        case ARIAMIX_MIC_LVL:
                   1541:                dip->type = AUDIO_MIXER_VALUE;
                   1542:                dip->mixer_class = ARIAMIX_INPUT_CLASS;
                   1543:                dip->next = ARIAMIX_MIC_MUTE;
                   1544:                strlcpy(dip->label.name, AudioNmicrophone,
                   1545:                    sizeof dip->label.name);
                   1546:                dip->un.v.num_channels = 2;
                   1547:                strlcpy(dip->un.v.units.name, AudioNvolume,
                   1548:                    sizeof dip->un.v.units.name);
                   1549:                break;
                   1550:
                   1551:        case ARIAMIX_LINE_IN_LVL:
                   1552:                dip->type = AUDIO_MIXER_VALUE;
                   1553:                dip->mixer_class = ARIAMIX_INPUT_CLASS;
                   1554:                dip->next = ARIAMIX_LINE_IN_MUTE;
                   1555:                strlcpy(dip->label.name, AudioNline, sizeof dip->label.name);
                   1556:                dip->un.v.num_channels = 2;
                   1557:                strlcpy(dip->un.v.units.name, AudioNvolume,
                   1558:                    sizeof dip->un.v.units.name);
                   1559:                break;
                   1560:
                   1561:        case ARIAMIX_CD_LVL:
                   1562:                dip->type = AUDIO_MIXER_VALUE;
                   1563:                dip->mixer_class = ARIAMIX_INPUT_CLASS;
                   1564:                dip->next = ARIAMIX_CD_MUTE;
                   1565:                strlcpy(dip->label.name, AudioNcd, sizeof dip->label.name);
                   1566:                dip->un.v.num_channels = 2;
                   1567:                strlcpy(dip->un.v.units.name, AudioNvolume,
                   1568:                    sizeof dip->un.v.units.name);
                   1569:                break;
                   1570:
                   1571:        case ARIAMIX_TEL_LVL:
                   1572:                dip->type = AUDIO_MIXER_VALUE;
                   1573:                dip->mixer_class = ARIAMIX_INPUT_CLASS;
                   1574:                dip->next = ARIAMIX_TEL_MUTE;
                   1575:                strlcpy(dip->label.name, "telephone", sizeof dip->label.name);
                   1576:                dip->un.v.num_channels = 1;
                   1577:                strlcpy(dip->un.v.units.name, AudioNvolume,
                   1578:                    sizeof dip->un.v.units.name);
                   1579:                break;
                   1580:
                   1581:        case ARIAMIX_DAC_LVL:
                   1582:                dip->type = AUDIO_MIXER_VALUE;
                   1583:                dip->mixer_class = ARIAMIX_INPUT_CLASS;
                   1584:                dip->next = ARIAMIX_DAC_MUTE;
                   1585:                strlcpy(dip->label.name, AudioNdac, sizeof dip->label.name);
                   1586:                dip->un.v.num_channels = 1;
                   1587:                strlcpy(dip->un.v.units.name, AudioNvolume,
                   1588:                    sizeof dip->un.v.units.name);
                   1589:                break;
                   1590:
                   1591:        case ARIAMIX_AUX_LVL:
                   1592:                dip->type = AUDIO_MIXER_VALUE;
                   1593:                dip->mixer_class = ARIAMIX_INPUT_CLASS;
                   1594:                dip->next = ARIAMIX_AUX_MUTE;
                   1595:                strlcpy(dip->label.name, AudioNoutput, sizeof dip->label.name);
                   1596:                dip->un.v.num_channels = 1;
                   1597:                strlcpy(dip->un.v.units.name, AudioNvolume,
                   1598:                    sizeof dip->un.v.units.name);
                   1599:                break;
                   1600:
                   1601:        case ARIAMIX_MIC_MUTE:
                   1602:                dip->prev = ARIAMIX_MIC_LVL;
                   1603:                goto mode;
                   1604:
                   1605:        case ARIAMIX_LINE_IN_MUTE:
                   1606:                dip->prev = ARIAMIX_LINE_IN_LVL;
                   1607:                goto mode;
                   1608:
                   1609:        case ARIAMIX_CD_MUTE:
                   1610:                dip->prev = ARIAMIX_CD_LVL;
                   1611:                goto mode;
                   1612:
                   1613:        case ARIAMIX_DAC_MUTE:
                   1614:                dip->prev = ARIAMIX_DAC_LVL;
                   1615:                goto mode;
                   1616:
                   1617:        case ARIAMIX_AUX_MUTE:
                   1618:                dip->prev = ARIAMIX_AUX_LVL;
                   1619:                goto mode;
                   1620:
                   1621:        case ARIAMIX_TEL_MUTE:
                   1622:                dip->prev = ARIAMIX_TEL_LVL;
                   1623:                goto mode;
                   1624:
                   1625: mode:
                   1626:                dip->mixer_class = ARIAMIX_INPUT_CLASS;
                   1627:                dip->type = AUDIO_MIXER_ENUM;
                   1628:                strlcpy(dip->label.name, AudioNmute, sizeof dip->label.name);
                   1629:                dip->un.e.num_mem = 2;
                   1630:                strlcpy(dip->un.e.member[0].label.name, AudioNoff,
                   1631:                    sizeof dip->un.e.member[0].label.name);
                   1632:                dip->un.e.member[0].ord = 0;
                   1633:                strlcpy(dip->un.e.member[1].label.name, AudioNon,
                   1634:                    sizeof dip->un.e.member[0].label.name);
                   1635:                dip->un.e.member[1].ord = 1;
                   1636:                break;
                   1637:
                   1638:        case ARIAMIX_MASTER_LVL:
                   1639:                dip->type = AUDIO_MIXER_VALUE;
                   1640:                dip->mixer_class = ARIAMIX_OUTPUT_CLASS;
                   1641:                dip->next = ARIAMIX_MASTER_TREBLE;
                   1642:                strlcpy(dip->label.name, AudioNvolume, sizeof dip->label.name);
                   1643:                dip->un.v.num_channels = 2;
                   1644:                strlcpy(dip->un.v.units.name, AudioNvolume,
                   1645:                    sizeof dip->un.v.units.name);
                   1646:                break;
                   1647:
                   1648:        case ARIAMIX_MASTER_TREBLE:
                   1649:                dip->type = AUDIO_MIXER_VALUE;
                   1650:                dip->mixer_class = ARIAMIX_OUTPUT_CLASS;
                   1651:                dip->prev = ARIAMIX_MASTER_LVL;
                   1652:                dip->next = ARIAMIX_MASTER_BASS;
                   1653:                strlcpy(dip->label.name, AudioNmaster, sizeof dip->label.name);
                   1654:                dip->un.v.num_channels = 2;
                   1655:                strlcpy(dip->un.v.units.name, AudioNtreble,
                   1656:                    sizeof dip->un.v.units.name);
                   1657:                break;
                   1658:
                   1659:        case ARIAMIX_MASTER_BASS:
                   1660:                dip->type = AUDIO_MIXER_VALUE;
                   1661:                dip->mixer_class = ARIAMIX_OUTPUT_CLASS;
                   1662:                dip->prev = ARIAMIX_MASTER_TREBLE;
                   1663:                strlcpy(dip->label.name, AudioNmaster, sizeof dip->label.name);
                   1664:                dip->un.v.num_channels = 2;
                   1665:                strlcpy(dip->un.v.units.name, AudioNbass,
                   1666:                    sizeof dip->un.v.units.name);
                   1667:                break;
                   1668:
                   1669:        case ARIAMIX_OUT_LVL:
                   1670:                dip->type = AUDIO_MIXER_VALUE;
                   1671:                dip->mixer_class = ARIAMIX_OUTPUT_CLASS;
                   1672:                strlcpy(dip->label.name, AudioNoutput, sizeof dip->label.name);
                   1673:                dip->un.v.num_channels = 2;
                   1674:                strlcpy(dip->un.v.units.name, AudioNvolume,
                   1675:                    sizeof dip->un.v.units.name);
                   1676:                break;
                   1677:
                   1678:        case ARIAMIX_RECORD_SOURCE:
                   1679:                dip->mixer_class = ARIAMIX_RECORD_CLASS;
                   1680:                dip->type = AUDIO_MIXER_ENUM;
                   1681:                strlcpy(dip->label.name, AudioNsource, sizeof dip->label.name);
                   1682:                dip->un.e.num_mem = 6;
                   1683:                strlcpy(dip->un.e.member[0].label.name, AudioNoutput,
                   1684:                    sizeof dip->un.e.member[0].label.name);
                   1685:                dip->un.e.member[0].ord = ARIAMIX_AUX_LVL;
                   1686:                strlcpy(dip->un.e.member[1].label.name, AudioNmicrophone,
                   1687:                    sizeof dip->un.e.member[0].label.name);
                   1688:                dip->un.e.member[1].ord = ARIAMIX_MIC_LVL;
                   1689:                strlcpy(dip->un.e.member[2].label.name, AudioNdac,
                   1690:                    sizeof dip->un.e.member[0].label.name);
                   1691:                dip->un.e.member[2].ord = ARIAMIX_DAC_LVL;
                   1692:                strlcpy(dip->un.e.member[3].label.name, AudioNline,
                   1693:                    sizeof dip->un.e.member[0].label.name);
                   1694:                dip->un.e.member[3].ord = ARIAMIX_LINE_IN_LVL;
                   1695:                strlcpy(dip->un.e.member[3].label.name, AudioNcd,
                   1696:                    sizeof dip->un.e.member[0].label.name);
                   1697:                dip->un.e.member[4].ord = ARIAMIX_CD_LVL;
                   1698:                strlcpy(dip->un.e.member[3].label.name, "telephone",
                   1699:                    sizeof dip->un.e.member[0].label.name);
                   1700:                dip->un.e.member[5].ord = ARIAMIX_TEL_LVL;
                   1701:                break;
                   1702:
                   1703:        case ARIAMIX_INPUT_CLASS:
                   1704:                dip->type = AUDIO_MIXER_CLASS;
                   1705:                dip->mixer_class = ARIAMIX_INPUT_CLASS;
                   1706:                strlcpy(dip->label.name, AudioCInputs, sizeof dip->label.name);
                   1707:                break;
                   1708:
                   1709:        case ARIAMIX_OUTPUT_CLASS:
                   1710:                dip->type = AUDIO_MIXER_CLASS;
                   1711:                dip->mixer_class = ARIAMIX_OUTPUT_CLASS;
                   1712:                strlcpy(dip->label.name, AudioCOutputs,
                   1713:                    sizeof dip->label.name);
                   1714:                break;
                   1715:
                   1716:        case ARIAMIX_RECORD_CLASS:
                   1717:                dip->type = AUDIO_MIXER_CLASS;
                   1718:                dip->mixer_class = ARIAMIX_RECORD_CLASS;
                   1719:                strlcpy(dip->label.name, AudioCRecord, sizeof dip->label.name);
                   1720:                break;
                   1721:
                   1722:        case ARIAMIX_EQ_CLASS:
                   1723:                dip->type = AUDIO_MIXER_CLASS;
                   1724:                dip->mixer_class = ARIAMIX_EQ_CLASS;
                   1725:                strlcpy(dip->label.name, AudioCEqualization,
                   1726:                    sizeof dip->label.name);
                   1727:                break;
                   1728:
                   1729:        default:
                   1730:                return ENXIO;
                   1731:                /*NOTREACHED*/
                   1732:        }
                   1733:        return 0;
                   1734: }
                   1735:
                   1736: #endif /* NARIA */

CVSweb