Module Name: src Committed By: isaki Date: Sun Apr 21 09:12:34 UTC 2019
Modified Files: src/sys/arch/arm/iomd [isaki-audio2]: vidcaudio.c Log Message: Adapt to audio2. To generate a diff of this commit: cvs rdiff -u -r1.57 -r1.57.2.1 src/sys/arch/arm/iomd/vidcaudio.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/arch/arm/iomd/vidcaudio.c diff -u src/sys/arch/arm/iomd/vidcaudio.c:1.57 src/sys/arch/arm/iomd/vidcaudio.c:1.57.2.1 --- src/sys/arch/arm/iomd/vidcaudio.c:1.57 Sat Mar 16 12:09:56 2019 +++ src/sys/arch/arm/iomd/vidcaudio.c Sun Apr 21 09:12:34 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: vidcaudio.c,v 1.57 2019/03/16 12:09:56 isaki Exp $ */ +/* $NetBSD: vidcaudio.c,v 1.57.2.1 2019/04/21 09:12:34 isaki Exp $ */ /* * Copyright (c) 1995 Melvin Tang-Richardson @@ -65,7 +65,7 @@ #include <sys/param.h> /* proc.h */ -__KERNEL_RCSID(0, "$NetBSD: vidcaudio.c,v 1.57 2019/03/16 12:09:56 isaki Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vidcaudio.c,v 1.57.2.1 2019/04/21 09:12:34 isaki Exp $"); #include <sys/audioio.h> #include <sys/conf.h> /* autoconfig functions */ @@ -79,8 +79,7 @@ __KERNEL_RCSID(0, "$NetBSD: vidcaudio.c, #include <dev/audio_if.h> #include <dev/audiobellvar.h> -#include <dev/auconv.h> -#include <dev/mulaw.h> +#include <dev/audio/mulaw.h> #include <machine/intr.h> #include <machine/machdep.h> @@ -138,19 +137,14 @@ static int vidcaudio_intr(void *); static void vidcaudio_rate(int); static void vidcaudio_ctrl(int); static void vidcaudio_stereo(int, int); -static stream_filter_factory_t mulaw_to_vidc; -static stream_filter_factory_t mulaw_to_vidc_stereo; -static int mulaw_to_vidc_fetch_to(struct audio_softc *, stream_fetcher_t *, - audio_stream_t *, int); -static int mulaw_to_vidc_stereo_fetch_to(struct audio_softc *, stream_fetcher_t *, - audio_stream_t *, int); CFATTACH_DECL_NEW(vidcaudio, sizeof(struct vidcaudio_softc), vidcaudio_probe, vidcaudio_attach, NULL, NULL); -static int vidcaudio_query_encoding(void *, struct audio_encoding *); -static int vidcaudio_set_params(void *, int, int, audio_params_t *, - audio_params_t *, stream_filter_list_t *, stream_filter_list_t *); +static int vidcaudio_query_format(void *, audio_format_query_t *); +static int vidcaudio_set_format(void *, int, + const audio_params_t *, const audio_params_t *, + audio_filter_reg_t *, audio_filter_reg_t *); static int vidcaudio_round_blocksize(void *, int, int, const audio_params_t *); static int vidcaudio_trigger_output(void *, void *, void *, int, void (*)(void *), void *, const audio_params_t *); @@ -173,8 +167,8 @@ static struct audio_device vidcaudio_dev static const struct audio_hw_if vidcaudio_hw_if = { .close = vidcaudio_close, - .query_encoding = vidcaudio_query_encoding, - .set_params = vidcaudio_set_params, + .query_format = vidcaudio_query_format, + .set_format = vidcaudio_set_format, .round_blocksize = vidcaudio_round_blocksize, .halt_output = vidcaudio_halt_output, .halt_input = vidcaudio_halt_input, @@ -188,6 +182,43 @@ static const struct audio_hw_if vidcaudi .get_locks = vidcaudio_get_locks, }; +static const struct audio_format vidcaudio_formats_16bit = { + .mode = AUMODE_PLAY, + .encoding = AUDIO_ENCODING_SLINEAR_LE, + .validbits = 16, + .precision = 16, + .channels = 2, + .channel_mask = AUFMT_STEREO, + /* There are more selectable frequencies but these should be enough. */ + .frequency_type = 6, + .frequency = { + 19600, /* /9 */ + 22050, /* /8 */ + 25200, /* /7 */ + 29400, /* /6 */ + 35280, /* /5 */ + 44100, /* /4 */ + }, +}; +static const struct audio_format vidcaudio_formats_8bit = { + .mode = AUMODE_PLAY, + .encoding = AUDIO_ENCODING_ULAW, + .validbits = 8, + .precision = 8, + .channels = 2, /* we use stereo always */ + .channel_mask = AUFMT_STEREO, + /* frequency is preferably an integer. */ + .frequency_type = 6, + .frequency = { + 10000, /* 50us */ + 12500, /* 40us */ + 20000, /* 25us */ + 25000, /* 20us */ + 31250, /* 16us */ + 50000, /* 10us */ + }, +}; + static int vidcaudio_probe(device_t parent, cfdata_t cf, void *aux) { @@ -283,149 +314,51 @@ vidcaudio_close(void *addr) */ static int -vidcaudio_query_encoding(void *addr, struct audio_encoding *fp) +vidcaudio_query_format(void *addr, audio_format_query_t *afp) { struct vidcaudio_softc *sc; sc = addr; - switch (fp->index) { - case 0: - strcpy(fp->name, AudioEmulaw); - fp->encoding = AUDIO_ENCODING_ULAW; - fp->precision = 8; - fp->flags = AUDIO_ENCODINGFLAG_EMULATED; - break; - - case 1: - if (sc->sc_is16bit) { - strcpy(fp->name, AudioEslinear_le); - fp->encoding = AUDIO_ENCODING_SLINEAR_LE; - fp->precision = 16; - fp->flags = 0; - break; - } - /* FALLTHROUGH */ - default: - return EINVAL; - } - return 0; -} - -#define MULAW_TO_VIDC(m) (~((m) << 1 | (m) >> 7)) - -static stream_filter_t * -mulaw_to_vidc(struct audio_softc *sc, const audio_params_t *from, - const audio_params_t *to) -{ - - return auconv_nocontext_filter_factory(mulaw_to_vidc_fetch_to); -} - -static int -mulaw_to_vidc_fetch_to(struct audio_softc *sc, stream_fetcher_t *self, - audio_stream_t *dst, int max_used) -{ - stream_filter_t *this; - int m, err; - - this = (stream_filter_t *)self; - if ((err = this->prev->fetch_to(sc, this->prev, this->src, max_used))) - return err; - m = dst->end - dst->start; - m = uimin(m, max_used); - FILTER_LOOP_PROLOGUE(this->src, 1, dst, 1, m) { - *d = MULAW_TO_VIDC(*s); - } FILTER_LOOP_EPILOGUE(this->src, dst); - return 0; -} - -static stream_filter_t * -mulaw_to_vidc_stereo(struct audio_softc *sc, const audio_params_t *from, - const audio_params_t *to) -{ - - return auconv_nocontext_filter_factory(mulaw_to_vidc_stereo_fetch_to); -} - -static int -mulaw_to_vidc_stereo_fetch_to(struct audio_softc *sc, stream_fetcher_t *self, - audio_stream_t *dst, int max_used) -{ - stream_filter_t *this; - int m, err; - - this = (stream_filter_t *)self; - max_used = (max_used + 1) & ~1; - if ((err = this->prev->fetch_to(sc, this->prev, this->src, max_used / 2))) - return err; - m = (dst->end - dst->start) & ~1; - m = uimin(m, max_used); - FILTER_LOOP_PROLOGUE(this->src, 1, dst, 2, m) { - d[0] = d[1] = MULAW_TO_VIDC(*s); - } FILTER_LOOP_EPILOGUE(this->src, dst); - return 0; + if (sc->sc_is16bit) + return audio_query_format(&vidcaudio_formats_16bit, 1, afp); + else + return audio_query_format(&vidcaudio_formats_8bit, 1, afp); } static int -vidcaudio_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) +vidcaudio_set_format(void *addr, int setmode, + const audio_params_t *play, const audio_params_t *rec, + audio_filter_reg_t *pfil, audio_filter_reg_t *rfil) { - audio_params_t hw; struct vidcaudio_softc *sc; int sample_period, ch; - if ((setmode & AUMODE_PLAY) == 0) - return 0; - sc = addr; if (sc->sc_is16bit) { /* ARM7500ish, 16-bit, two-channel */ - hw = *p; - if (p->encoding == AUDIO_ENCODING_ULAW && p->precision == 8) { - hw.encoding = AUDIO_ENCODING_SLINEAR_LE; - hw.precision = hw.validbits = 16; - pfil->append(pfil, mulaw_to_linear16, &hw); - } else if (p->encoding != AUDIO_ENCODING_SLINEAR_LE || - p->precision != 16) - return EINVAL; - sample_period = 705600 / 4 / p->sample_rate; - if (sample_period < 3) sample_period = 3; + sample_period = 705600 / 4 / play->sample_rate; + if (sample_period < 3) + sample_period = 3; vidcaudio_rate(sample_period - 2); vidcaudio_ctrl(SCR_SERIAL); - hw.sample_rate = 705600 / 4 / sample_period; - hw.channels = 2; - pfil->prepend(pfil, aurateconv, &hw); } else { /* VIDC20ish, u-law, 8-channel */ - if (p->encoding != AUDIO_ENCODING_ULAW || p->precision != 8) - return EINVAL; /* * We always use two hardware channels, because using * one at 8kHz gives a nasty whining sound from the - * speaker. The aurateconv mechanism doesn't support - * ulaw, so we do the channel duplication ourselves, - * and don't try to do rate conversion. + * speaker. */ - sample_period = 1000000 / 2 / p->sample_rate; - if (sample_period < 3) sample_period = 3; - p->sample_rate = 1000000 / 2 / sample_period; - hw = *p; - hw.encoding = AUDIO_ENCODING_NONE; - hw.precision = 8; + sample_period = 1000000 / 2 / play->sample_rate; + if (sample_period < 3) + sample_period = 3; vidcaudio_rate(sample_period - 2); vidcaudio_ctrl(SCR_SDAC | SCR_CLKSEL); - if (p->channels == 1) { - pfil->append(pfil, mulaw_to_vidc_stereo, &hw); - for (ch = 0; ch < 8; ch++) - vidcaudio_stereo(ch, SIR_CENTRE); - } else { - pfil->append(pfil, mulaw_to_vidc, &hw); - for (ch = 0; ch < 8; ch += 2) - vidcaudio_stereo(ch, SIR_LEFT_100); - for (ch = 1; ch < 8; ch += 2) - vidcaudio_stereo(ch, SIR_RIGHT_100); - } + for (ch = 0; ch < 8; ch += 2) + vidcaudio_stereo(ch, SIR_LEFT_100); + for (ch = 1; ch < 8; ch += 2) + vidcaudio_stereo(ch, SIR_RIGHT_100); + + pfil->codec = audio_internal_to_mulaw; } return 0; }