Source-Changes-HG archive

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

[src/isaki-audio2]: src/sys/dev/pci More adapt to audio2.



details:   https://anonhg.NetBSD.org/src/rev/ad11907cfdf4
branches:  isaki-audio2
changeset: 450921:ad11907cfdf4
user:      isaki <isaki%NetBSD.org@localhost>
date:      Tue Apr 30 06:05:02 2019 +0000

description:
More adapt to audio2.
- Use set_format.
- Remove an empty method.
- XXX DAC1 and secondary audio device support should be removed.
  Now mixing two (or more) sources is done by audio layer.

diffstat:

 sys/dev/pci/eap.c |  112 ++++++++++++++++++++---------------------------------
 1 files changed, 42 insertions(+), 70 deletions(-)

diffs (248 lines):

diff -r fa20733225cc -r ad11907cfdf4 sys/dev/pci/eap.c
--- a/sys/dev/pci/eap.c Mon Apr 29 09:32:07 2019 +0000
+++ b/sys/dev/pci/eap.c Tue Apr 30 06:05:02 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: eap.c,v 1.99.2.2 2019/04/21 07:55:25 isaki Exp $       */
+/*     $NetBSD: eap.c,v 1.99.2.3 2019/04/30 06:05:02 isaki Exp $       */
 /*      $OpenBSD: eap.c,v 1.6 1999/10/05 19:24:42 csapuntz Exp $ */
 
 /*
@@ -50,8 +50,13 @@
  * ftp://download.intel.com/ial/scalableplatforms/audio/ac97r21.pdf
  */
 
+/*
+ * TODO:
+ * - Remove DAC1 and secondary audio device support.
+ */
+
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: eap.c,v 1.99.2.2 2019/04/21 07:55:25 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: eap.c,v 1.99.2.3 2019/04/30 06:05:02 isaki Exp $");
 
 #include "midi.h"
 #include "joy_eap.h"
@@ -69,7 +74,6 @@
 #include <sys/audioio.h>
 
 #include <dev/audio_if.h>
-#include <dev/auconv.h>
 #include <dev/midi_if.h>
 
 #include <dev/pci/pcidevs.h>
@@ -109,9 +113,9 @@
 
 static int     eap_open(void *, int);
 static int     eap_query_format(void *, struct audio_format_query *);
-static int     eap_set_params(void *, int, int, audio_params_t *,
-                              audio_params_t *, stream_filter_list_t *,
-                              stream_filter_list_t *);
+static int     eap_set_format(void *, int,
+                              const audio_params_t *, const audio_params_t *,
+                              audio_filter_reg_t *, audio_filter_reg_t *);
 static int     eap_trigger_output(void *, void *, void *, int,
                                   void (*)(void *), void *,
                                   const audio_params_t *);
@@ -129,7 +133,6 @@
 static int     eap1370_query_devinfo(void *, mixer_devinfo_t *);
 static void    *eap_malloc(void *, int, size_t);
 static void    eap_free(void *, void *, size_t);
-static size_t  eap_round_buffersize(void *, int, size_t);
 static int     eap_get_props(void *);
 static void    eap1370_set_mixer(struct eap_softc *, int, int);
 static uint32_t eap1371_src_wait(struct eap_softc *);
@@ -157,7 +160,7 @@
 static const struct audio_hw_if eap1370_hw_if = {
        .open                   = eap_open,
        .query_format           = eap_query_format,
-       .set_params             = eap_set_params,
+       .set_format             = eap_set_format,
        .halt_output            = eap_halt_output,
        .halt_input             = eap_halt_input,
        .getdev                 = eap_getdev,
@@ -166,7 +169,6 @@
        .query_devinfo          = eap1370_query_devinfo,
        .allocm                 = eap_malloc,
        .freem                  = eap_free,
-       .round_buffersize       = eap_round_buffersize,
        .get_props              = eap_get_props,
        .trigger_output         = eap_trigger_output,
        .trigger_input          = eap_trigger_input,
@@ -176,7 +178,7 @@
 static const struct audio_hw_if eap1371_hw_if = {
        .open                   = eap_open,
        .query_format           = eap_query_format,
-       .set_params             = eap_set_params,
+       .set_format             = eap_set_format,
        .halt_output            = eap_halt_output,
        .halt_input             = eap_halt_input,
        .getdev                 = eap_getdev,
@@ -185,7 +187,6 @@
        .query_devinfo          = eap1371_query_devinfo,
        .allocm                 = eap_malloc,
        .freem                  = eap_free,
-       .round_buffersize       = eap_round_buffersize,
        .get_props              = eap_get_props,
        .trigger_output         = eap_trigger_output,
        .trigger_input          = eap_trigger_input,
@@ -209,24 +210,19 @@
        "eap"
 };
 
-#define EAP_NFORMATS   4
-#define EAP_FORMAT(enc, prec, ch, chmask) \
-       { \
-               .mode           = AUMODE_PLAY | AUMODE_RECORD, \
-               .encoding       = (enc), \
-               .validbits      = (prec), \
-               .precision      = (prec), \
-               .channels       = (ch), \
-               .channel_mask   = (chmask), \
-               .frequency_type = 0, \
-               .frequency      = { 4000, 48000 }, \
-       }
-static const struct audio_format eap_formats[EAP_NFORMATS] = {
-       EAP_FORMAT(AUDIO_ENCODING_SLINEAR_LE, 16, 2, AUFMT_STEREO),
-       EAP_FORMAT(AUDIO_ENCODING_SLINEAR_LE, 16, 1, AUFMT_MONAURAL),
-       EAP_FORMAT(AUDIO_ENCODING_ULINEAR_LE,  8, 2, AUFMT_STEREO),
-       EAP_FORMAT(AUDIO_ENCODING_ULINEAR_LE,  8, 1, AUFMT_MONAURAL),
+static const struct audio_format eap_formats[] = {
+       {
+               .mode           = AUMODE_PLAY | AUMODE_RECORD,
+               .encoding       = AUDIO_ENCODING_SLINEAR_LE,
+               .validbits      = 16,
+               .precision      = 16,
+               .channels       = 2,
+               .channel_mask   = AUFMT_STEREO,
+               .frequency_type = 2,
+               .frequency      = { 4000, 48000 },
+       },
 };
+#define EAP_NFORMATS   __arraycount(eap_formats)
 
 static int
 eap_match(device_t parent, cfdata_t match, void *aux)
@@ -944,54 +940,37 @@
 }
 
 static int
-eap_set_params(void *addr, int setmode, int usemode,
-              audio_params_t *play, audio_params_t *rec,
-              stream_filter_list_t *pfil, stream_filter_list_t *rfil)
+eap_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)
 {
        struct eap_instance *ei;
        struct eap_softc *sc;
-       struct audio_params *p;
-       stream_filter_list_t *fil;
-       int mode, i;
        uint32_t div;
 
        ei = addr;
        sc = device_private(ei->parent);
 
-       for (mode = AUMODE_RECORD; mode != -1;
-            mode = mode == AUMODE_RECORD ? AUMODE_PLAY : -1) {
-               if ((setmode & mode) == 0)
-                       continue;
-
-               p = mode == AUMODE_PLAY ? play : rec;
-
-               fil = mode == AUMODE_PLAY ? pfil : rfil;
-               i = auconv_set_converter(eap_formats, EAP_NFORMATS,
-                                        mode, p, FALSE, fil);
-               if (i < 0)
-                       return EINVAL;
-       }
-
        if (sc->sc_1371) {
                eap1371_set_dac_rate(ei, play->sample_rate);
                eap1371_set_adc_rate(sc, rec->sample_rate);
        } else if (ei->index == EAP_DAC2) {
                /* Set the speed */
-               DPRINTFN(2, ("eap_set_params: old ICSC = 0x%08x\n",
+               DPRINTFN(2, ("%s: old ICSC = 0x%08x\n", __func__,
                             EREAD4(sc, EAP_ICSC)));
                div = EREAD4(sc, EAP_ICSC) & ~EAP_PCLKBITS;
                /*
+                * *play and *rec are the identical on es1370 because
+                * !AUDIO_PROP_INDEPENDENT.
+                */
+
+               /*
                 * XXX
                 * The -2 isn't documented, but seemed to make the wall
                 * time match
                 * what I expect.  - mycroft
                 */
-               if (usemode == AUMODE_RECORD)
-                       div |= EAP_SET_PCLKDIV(EAP_XTAL_FREQ /
-                               rec->sample_rate - 2);
-               else
-                       div |= EAP_SET_PCLKDIV(EAP_XTAL_FREQ /
-                               play->sample_rate - 2);
+               div |= EAP_SET_PCLKDIV(EAP_XTAL_FREQ / play->sample_rate - 2);
 #if 0
                div |= EAP_CCB_INTRM;
 #else
@@ -1001,27 +980,27 @@
                 */
 #endif
                EWRITE4(sc, EAP_ICSC, div);
-               DPRINTFN(2, ("eap_set_params: set ICSC = 0x%08x\n", div));
+               DPRINTFN(2, ("%s: set ICSC = 0x%08x\n", __func__, div));
        } else {
                /*
                 * The FM DAC has only a few fixed-frequency choises, so
                 * pick out the best candidate.
                 */
                div = EREAD4(sc, EAP_ICSC);
-               DPRINTFN(2, ("eap_set_params: old ICSC = 0x%08x\n", div));
+               DPRINTFN(2, ("%s: old ICSC = 0x%08x\n", __func__, div));
 
                div &= ~EAP_WTSRSEL;
-               if (play->sample_rate < 8268)
+               if (play->sample_rate == 5512)
                        div |= EAP_WTSRSEL_5;
-               else if (play->sample_rate < 16537)
+               else if (play->sample_rate == 11025)
                        div |= EAP_WTSRSEL_11;
-               else if (play->sample_rate < 33075)
+               else if (play->sample_rate == 22050)
                        div |= EAP_WTSRSEL_22;
                else
                        div |= EAP_WTSRSEL_44;
 
                EWRITE4(sc, EAP_ICSC, div);
-               DPRINTFN(2, ("eap_set_params: set ICSC = 0x%08x\n", div));
+               DPRINTFN(2, ("%s: set ICSC = 0x%08x\n", __func__, div));
        }
 
        return 0;
@@ -1659,13 +1638,6 @@
        }
 }
 
-static size_t
-eap_round_buffersize(void *addr, int direction, size_t size)
-{
-
-       return size;
-}
-
 static int
 eap_get_props(void *addr)
 {
@@ -1675,8 +1647,8 @@
 
        ei = addr;
        sc = device_private(ei->parent);
-       prop = AUDIO_PROP_MMAP | AUDIO_PROP_FULLDUPLEX |
-           AUDIO_PROP_INDEPENDENT;
+       prop = AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT |
+           AUDIO_PROP_FULLDUPLEX;
        /* The es1370 only has one clock, so it's not independent */
        if (!sc->sc_1371 && ei->index == EAP_DAC2)
                prop &= ~AUDIO_PROP_INDEPENDENT;



Home | Main Index | Thread Index | Old Index