Module Name: src Committed By: isaki Date: Sun Apr 21 06:09:01 UTC 2019
Modified Files: src/sys/dev/isa [isaki-audio2]: aria.c Log Message: Adapt to audio2. - Drop FULLDUPLEX property. The driver doesn't seem to be written as full duplex. To generate a diff of this commit: cvs rdiff -u -r1.39 -r1.39.2.1 src/sys/dev/isa/aria.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/isa/aria.c diff -u src/sys/dev/isa/aria.c:1.39 src/sys/dev/isa/aria.c:1.39.2.1 --- src/sys/dev/isa/aria.c:1.39 Sat Mar 16 12:09:58 2019 +++ src/sys/dev/isa/aria.c Sun Apr 21 06:09:01 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: aria.c,v 1.39 2019/03/16 12:09:58 isaki Exp $ */ +/* $NetBSD: aria.c,v 1.39.2.1 2019/04/21 06:09:01 isaki Exp $ */ /*- * Copyright (c) 1995, 1996, 1998 The NetBSD Foundation, Inc. @@ -36,12 +36,7 @@ * o Look into where aria_prometheus_kludge() belongs. * o Add some DMA code. It accomplishes its goal by * direct IO at the moment. - * o Different programs should be able to open the device - * with O_RDONLY and O_WRONLY at the same time. But I - * do not see support for this in /sys/dev/audio.c, so * I cannot effectively code it. - * o We should nicely deal with the cards that can do mu-law - * and A-law output. * o Rework the mixer interface. * o Deal with the lvls better. We need to do better mapping * between logarithmic scales and the one byte that @@ -50,7 +45,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: aria.c,v 1.39 2019/03/16 12:09:58 isaki Exp $"); +__KERNEL_RCSID(0, "$NetBSD: aria.c,v 1.39.2.1 2019/04/21 06:09:01 isaki Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -66,8 +61,6 @@ __KERNEL_RCSID(0, "$NetBSD: aria.c,v 1.3 #include <sys/audioio.h> #include <dev/audio_if.h> -#include <dev/auconv.h> -#include <dev/mulaw.h> #include <dev/isa/isavar.h> #include <dev/isa/ariareg.h> @@ -147,12 +140,13 @@ void aria_do_kludge(bus_space_tag_t, bus u_short, u_short, u_short, u_short); void aria_prometheus_kludge(struct isa_attach_args *, bus_space_handle_t); -int aria_query_encoding(void *, struct audio_encoding *); +int aria_query_format(void *, audio_format_query_t *); int aria_round_blocksize(void *, int, int, const audio_params_t *); int aria_speaker_ctl(void *, int); int aria_commit_settings(void *); -int aria_set_params(void *, int, int, audio_params_t *, audio_params_t *, - stream_filter_list_t *, stream_filter_list_t *); +int aria_set_format(void *, int, + const audio_params_t *, const audio_params_t *, + audio_filter_reg_t *, audio_filter_reg_t *); int aria_get_props(void *); void aria_get_locks(void *, kmutex_t **, kmutex_t **); @@ -196,6 +190,24 @@ struct audio_device aria_device = { "aria" }; +#define ARIA_FORMAT(enc, prec) \ + { \ + .mode = AUMODE_PLAY | AUMODE_RECORD, \ + .encoding = (enc), \ + .validbits = (prec), \ + .precision = (prec), \ + .channels = 2, \ + .channel_mask = AUFMT_STEREO, \ + .frequency_type = 6, \ + .frequency = { 7875, 11025, 15750, 22050, 31500, 44100 }, \ + } +/* XXX Some models seem to support mulaw/alaw. */ +const struct audio_format aria_formats[] = { + ARIA_FORMAT(AUDIO_ENCODING_ULINEAR, 8), + ARIA_FORMAT(AUDIO_ENCODING_SLINEAR_LE, 16), +}; +#define ARIA_NFORMATS __arraycount(aria_formats) + /* * Define our interface to the higher level audio driver. */ @@ -203,8 +215,8 @@ struct audio_device aria_device = { const struct audio_hw_if aria_hw_if = { .open = ariaopen, .close = ariaclose, - .query_encoding = aria_query_encoding, - .set_params = aria_set_params, + .query_format = aria_query_format, + .set_format = aria_set_format, .round_blocksize = aria_round_blocksize, .commit_settings = aria_commit_settings, .start_output = aria_start_output, @@ -500,68 +512,10 @@ aria_getdev(void *addr, struct audio_dev */ int -aria_query_encoding(void *addr, struct audio_encoding *fp) +aria_query_format(void *addr, audio_format_query_t *afp) { - struct aria_softc *sc; - sc = addr; - switch (fp->index) { - case 0: - strcpy(fp->name, AudioEmulaw); - fp->encoding = AUDIO_ENCODING_ULAW; - fp->precision = 8; - if ((ARIA_MODEL&sc->sc_hardware) == 0) - fp->flags = AUDIO_ENCODINGFLAG_EMULATED; - break; - case 1: - strcpy(fp->name, AudioEalaw); - fp->encoding = AUDIO_ENCODING_ALAW; - fp->precision = 8; - if ((ARIA_MODEL&sc->sc_hardware) == 0) - fp->flags = AUDIO_ENCODINGFLAG_EMULATED; - break; - case 2: - strcpy(fp->name, AudioEslinear); - fp->encoding = AUDIO_ENCODING_SLINEAR; - fp->precision = 8; - fp->flags = AUDIO_ENCODINGFLAG_EMULATED; - break; - case 3: - strcpy(fp->name, AudioEslinear_le); - fp->encoding = AUDIO_ENCODING_SLINEAR_LE; - fp->precision = 16; - fp->flags = 0; - break; - case 4: - strcpy(fp->name, AudioEslinear_be); - fp->encoding = AUDIO_ENCODING_SLINEAR_BE; - fp->precision = 16; - fp->flags = AUDIO_ENCODINGFLAG_EMULATED; - break; - case 5: - strcpy(fp->name, AudioEulinear); - fp->encoding = AUDIO_ENCODING_ULINEAR; - fp->precision = 8; - fp->flags = 0; - break; - case 6: - strcpy(fp->name, AudioEulinear_le); - fp->encoding = AUDIO_ENCODING_ULINEAR_LE; - fp->precision = 16; - fp->flags = AUDIO_ENCODINGFLAG_EMULATED; - break; - case 7: - strcpy(fp->name, AudioEulinear_be); - fp->encoding = AUDIO_ENCODING_ULINEAR_BE; - fp->precision = 16; - fp->flags = AUDIO_ENCODINGFLAG_EMULATED; - break; - default: - return EINVAL; - /*NOTREACHED*/ - } - - return 0; + return audio_query_format(aria_formats, ARIA_NFORMATS, afp); } /* @@ -588,94 +542,24 @@ int aria_get_props(void *addr) { - return AUDIO_PROP_FULLDUPLEX; + /* XXX This driver doesn't seem to be written as full duplex. */ + return 0; } int -aria_set_params( - void *addr, - int setmode, - int usemode, - audio_params_t *p, - audio_params_t *r, - stream_filter_list_t *pfil, - stream_filter_list_t *rfil -) +aria_set_format(void *addr, int setmode, + const audio_params_t *p, const audio_params_t *r, + audio_filter_reg_t *pfil, audio_filter_reg_t *rfil) { - audio_params_t hw; struct aria_softc *sc; sc = addr; - switch(p->encoding) { - case AUDIO_ENCODING_ULAW: - case AUDIO_ENCODING_ALAW: - case AUDIO_ENCODING_SLINEAR: - case AUDIO_ENCODING_SLINEAR_LE: - case AUDIO_ENCODING_SLINEAR_BE: - case AUDIO_ENCODING_ULINEAR: - case AUDIO_ENCODING_ULINEAR_LE: - case AUDIO_ENCODING_ULINEAR_BE: - break; - default: - return EINVAL; - } - if (p->sample_rate <= 9450) - p->sample_rate = 7875; - else if (p->sample_rate <= 13387) - p->sample_rate = 11025; - else if (p->sample_rate <= 18900) - p->sample_rate = 15750; - else if (p->sample_rate <= 26775) - p->sample_rate = 22050; - else if (p->sample_rate <= 37800) - p->sample_rate = 31500; - else - p->sample_rate = 44100; - - hw = *p; + /* *p and *r are the identical because !AUDIO_PROP_INDEPENDENT. */ sc->sc_encoding = p->encoding; sc->sc_precision = p->precision; sc->sc_chans = p->channels; sc->sc_rate = p->sample_rate; - - switch(p->encoding) { - case AUDIO_ENCODING_ULAW: - if ((ARIA_MODEL&sc->sc_hardware) == 0) { - hw.encoding = AUDIO_ENCODING_ULINEAR_LE; - pfil->append(pfil, mulaw_to_linear8, &hw); - rfil->append(rfil, linear8_to_mulaw, &hw); - } - break; - case AUDIO_ENCODING_ALAW: - if ((ARIA_MODEL&sc->sc_hardware) == 0) { - hw.encoding = AUDIO_ENCODING_ULINEAR_LE; - pfil->append(pfil, alaw_to_linear8, &hw); - rfil->append(rfil, linear8_to_alaw, &hw); - } - break; - case AUDIO_ENCODING_SLINEAR: - hw.encoding = AUDIO_ENCODING_ULINEAR_LE; - pfil->append(pfil, change_sign8, &hw); - rfil->append(rfil, change_sign8, &hw); - break; - case AUDIO_ENCODING_ULINEAR_LE: - hw.encoding = AUDIO_ENCODING_SLINEAR_LE; - pfil->append(pfil, change_sign16, &hw); - rfil->append(rfil, change_sign16, &hw); - break; - case AUDIO_ENCODING_SLINEAR_BE: - hw.encoding = AUDIO_ENCODING_SLINEAR_LE; - pfil->append(pfil, swap_bytes, &hw); - rfil->append(rfil, swap_bytes, &hw); - break; - case AUDIO_ENCODING_ULINEAR_BE: - hw.encoding = AUDIO_ENCODING_SLINEAR_LE; - pfil->append(pfil, swap_bytes_change_sign16, &hw); - rfil->append(rfil, swap_bytes_change_sign16, &hw); - break; - } - return 0; } @@ -711,11 +595,6 @@ aria_commit_settings(void *addr) default: format = 0x00; samp = 0x40; break;/* XXX can we get here? */ } - if ((ARIA_MODEL&sc->sc_hardware) != 0) { - format |= sc->sc_encoding == AUDIO_ENCODING_ULAW ? 0x06 : 0x00; - format |= sc->sc_encoding == AUDIO_ENCODING_ALAW ? 0x08 : 0x00; - } - format |= (sc->sc_precision == 16) ? 0x02 : 0x00; format |= (sc->sc_chans == 2) ? 1 : 0; samp |= bus_space_read_2(iot, ioh, ARIADSP_STATUS) & ~0x60;