Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/isaki-audio2]: src/sys/arch/arm/iomd Adapt to audio2.



details:   https://anonhg.NetBSD.org/src/rev/4b20e8c1bfba
branches:  isaki-audio2
changeset: 450643:4b20e8c1bfba
user:      isaki <isaki%NetBSD.org@localhost>
date:      Sun Apr 21 09:12:34 2019 +0000

description:
Adapt to audio2.

diffstat:

 sys/arch/arm/iomd/vidcaudio.c |  201 ++++++++++++++----------------------------
 1 files changed, 67 insertions(+), 134 deletions(-)

diffs (278 lines):

diff -r 7d27f9e77d08 -r 4b20e8c1bfba sys/arch/arm/iomd/vidcaudio.c
--- a/sys/arch/arm/iomd/vidcaudio.c     Sun Apr 21 08:11:27 2019 +0000
+++ b/sys/arch/arm/iomd/vidcaudio.c     Sun Apr 21 09:12:34 2019 +0000
@@ -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 @@
 
 #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 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 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 @@
        .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 @@
  */
 
 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);
+       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
-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)
+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)
 {
-
-       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;
-}
-
-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)
-{
-       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;
 }



Home | Main Index | Thread Index | Old Index