Source-Changes-HG archive

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

[src/netbsd-8]: src/sys/dev Pull up following revision(s) (requested by nat i...



details:   https://anonhg.NetBSD.org/src/rev/6d2def0fe421
branches:  netbsd-8
changeset: 850768:6d2def0fe421
user:      snj <snj%NetBSD.org@localhost>
date:      Fri Jun 30 06:43:07 2017 +0000

description:
Pull up following revision(s) (requested by nat in ticket #71):
        sys/dev/audio.c: 1.359-1.366
        sys/dev/audiovar.h: 1.56
No need to reset the audioinfo whem dealing with the hardware ring.  This
avoids a panic with some audio devices.
Ok christos@.
--
sc_iffreq -> sc_frequency.  NFCI.
Ok christos@.
--
Allow for bigger data types to mix into to avoid overflow.
--
Check hardare precision in vchan_autoconfig.  Passes atf test again.
--
Use pustream params when clearing the next block in the mixring.
--
Check validbits against precision in vchan_autoconfig.  At present
validbits != precision is not supported.
This change will most likely break autoconfig on vs(4), for these machines
the parameters can be set to the paramaters reported at attach time via
sysctl.
--
Don't start playback or recording on the hw ring only stream ring buffers.
--
Don't autoconfig for 24 bits precision.  It does not work as yet.

diffstat:

 sys/dev/audio.c    |  64 +++++++++++++++++++++++++++++++----------------------
 sys/dev/audiovar.h |   4 +-
 2 files changed, 39 insertions(+), 29 deletions(-)

diffs (233 lines):

diff -r 2370731184e8 -r 6d2def0fe421 sys/dev/audio.c
--- a/sys/dev/audio.c   Fri Jun 30 06:38:00 2017 +0000
+++ b/sys/dev/audio.c   Fri Jun 30 06:43:07 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: audio.c,v 1.357.2.1 2017/06/09 17:00:46 snj Exp $      */
+/*     $NetBSD: audio.c,v 1.357.2.2 2017/06/30 06:43:07 snj Exp $      */
 
 /*-
  * Copyright (c) 2016 Nathanial Sloss <nathanialsloss%yahoo.com.au@localhost>
@@ -148,7 +148,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.357.2.1 2017/06/09 17:00:46 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.357.2.2 2017/06/30 06:43:07 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "audio.h"
@@ -447,7 +447,7 @@
        .channels = 1,
 };
 
-int auto_config_precision[] = { 32, 24, 16, 8 };
+int auto_config_precision[] = { 32, 16, 8 };
 int auto_config_channels[] = { 32, 24, 16, 8, 6, 4, 2, 1};
 int auto_config_freq[] = { 48000, 44100, 96000, 192000, 32000,
                           22050, 16000, 11025, 8000, 4000 };
@@ -535,7 +535,7 @@
        vc->sc_lastinfovalid = false;
        vc->sc_swvol = 255;
        vc->sc_recswvol = 255;
-       sc->sc_iffreq = 44100;
+       sc->sc_frequency = 44100;
        sc->sc_precision = 16;
        sc->sc_channels = 2;
 
@@ -3485,6 +3485,7 @@
 audiostartr(struct audio_softc *sc, struct virtual_channel *vc)
 {
 
+       struct audio_chan *chan;
        int error;
 
        KASSERT(mutex_owned(sc->sc_lock));
@@ -3493,8 +3494,11 @@
                 vc->sc_mrr.s.start, audio_stream_get_used(&vc->sc_mrr.s),
                 vc->sc_mrr.usedhigh, vc->sc_mrr.mmapped));
 
+       chan = SIMPLEQ_FIRST(&sc->sc_audiochan);
        if (!audio_can_capture(sc))
                return EINVAL;
+       if (vc == chan->vc)
+               return 0;
 
        error = 0;
        if (sc->sc_rec_started == false) {
@@ -3525,6 +3529,8 @@
 
        if (!audio_can_playback(sc))
                return EINVAL;
+       if (vc == chan->vc)
+               return 0;
 
        if (!vc->sc_mpr.mmapped && used < vc->sc_mpr.blksize) {
                cv_broadcast(&sc->sc_wchan);
@@ -3874,7 +3880,7 @@
        cc = blksize - (inp - cb->s.start) % blksize;
        if (sc->sc_writeme == false) {
                DPRINTFN(3, ("MIX RING EMPTY - INSERT SILENCE\n"));
-               audio_fill_silence(&vc->sc_mpr.s.param, inp, cc);
+               audio_fill_silence(&vc->sc_pustream->param, inp, cc);
                sc->sc_pr.drops += cc;
        } else
                cc = blksize;
@@ -3882,11 +3888,11 @@
        cc = blksize;
        cc1 = sc->sc_pr.s.end - sc->sc_pr.s.inp;
        if (cc1 < cc) {
-               audio_fill_silence(&vc->sc_mpr.s.param, sc->sc_pr.s.inp, cc1);
+               audio_fill_silence(&vc->sc_pustream->param, sc->sc_pr.s.inp, cc1);
                cc -= cc1;
-               audio_fill_silence(&vc->sc_mpr.s.param, sc->sc_pr.s.start, cc);
+               audio_fill_silence(&vc->sc_pustream->param, sc->sc_pr.s.start, cc);
        } else
-               audio_fill_silence(&vc->sc_mpr.s.param, sc->sc_pr.s.inp, cc);
+               audio_fill_silence(&vc->sc_pustream->param, sc->sc_pr.s.inp, cc);
        mutex_exit(sc->sc_intr_lock);
 
        kpreempt_disable();
@@ -4149,7 +4155,7 @@
                return EINVAL;
        vc = chan->vc;
 
-       sc->sc_vchan_params.sample_rate = sc->sc_iffreq;
+       sc->sc_vchan_params.sample_rate = sc->sc_frequency;
 #if BYTE_ORDER == LITTLE_ENDIAN
        sc->sc_vchan_params.encoding = AUDIO_ENCODING_SLINEAR_LE;
 #else
@@ -4165,12 +4171,12 @@
        vc->sc_blkset = false;
 
        AUDIO_INITINFO(&ai);
-       ai.record.sample_rate = sc->sc_iffreq;
+       ai.record.sample_rate = sc->sc_frequency;
        ai.record.encoding    = format->encoding;
        ai.record.channels    = sc->sc_channels;
        ai.record.precision   = sc->sc_precision;
        ai.record.pause       = false;
-       ai.play.sample_rate   = sc->sc_iffreq;
+       ai.play.sample_rate   = sc->sc_frequency;
        ai.play.encoding      = format->encoding;
        ai.play.channels      = sc->sc_channels;
        ai.play.precision     = sc->sc_precision;
@@ -4180,14 +4186,14 @@
        sc->sc_format->channels = sc->sc_channels;
        sc->sc_format->precision = sc->sc_precision;
        sc->sc_format->validbits = sc->sc_precision;
-       sc->sc_format->frequency[0] = sc->sc_iffreq;
+       sc->sc_format->frequency[0] = sc->sc_frequency;
 
        auconv_delete_encodings(sc->sc_encodings);
        error = auconv_create_encodings(sc->sc_format, VAUDIO_NFORMATS,
            &sc->sc_encodings);
 
        if (error == 0)
-               error = audiosetinfo(sc, &ai, true, vc);
+               error = audiosetinfo(sc, &ai, false, vc);
 
        return error;
 }
@@ -5608,8 +5614,8 @@
        return error;
 }
 
-#define DEF_MIX_FUNC(name, type, MINVAL, MAXVAL)               \
-       static void                                             \
+#define DEF_MIX_FUNC(name, type, bigger_type, MINVAL, MAXVAL)          \
+       static void                                                     \
        mix_func##name(struct audio_softc *sc, struct audio_ringbuffer *cb, \
                  struct virtual_channel *vc)                           \
        {                                                               \
@@ -5633,9 +5639,9 @@
                        if (cc > cc2)                                   \
                                cc = cc2;                               \
                                                                        \
-                       for (m = 0; m < (cc / (name / 8)); m++) {       \
-                               tomix[m] = tomix[m] *                   \
-                                   (int32_t)(vc->sc_swvol) / 255;      \
+                       for (m = 0; m < (cc / (name / NBBY)); m++) {    \
+                               tomix[m] = (bigger_type)tomix[m] *      \
+                                   (bigger_type)(vc->sc_swvol) / 255;  \
                                result = orig[m] + tomix[m];            \
                                product = orig[m] * tomix[m];           \
                                if (orig[m] > 0 && tomix[m] > 0)        \
@@ -5654,9 +5660,9 @@
                }                                                       \
        }                                                               \
 
-DEF_MIX_FUNC(8, int8_t, INT8_MIN, INT8_MAX);
-DEF_MIX_FUNC(16, int16_t, INT16_MIN, INT16_MAX);
-DEF_MIX_FUNC(32, int32_t, INT32_MIN, INT32_MAX);
+DEF_MIX_FUNC(8, int8_t, int32_t, INT8_MIN, INT8_MAX);
+DEF_MIX_FUNC(16, int16_t, int32_t, INT16_MIN, INT16_MAX);
+DEF_MIX_FUNC(32, int32_t, int64_t, INT32_MIN, INT32_MAX);
 
 void
 mix_func(struct audio_softc *sc, struct audio_ringbuffer *cb,
@@ -5941,7 +5947,7 @@
        node = *rnode;
        sc = node.sysctl_data;
 
-       t = sc->sc_iffreq;
+       t = sc->sc_frequency;
        node.sysctl_data = &t;
        error = sysctl_lookup(SYSCTLFN_CALL(&node));
        if (error || newp == NULL)
@@ -5960,7 +5966,7 @@
                return EINVAL;
        }
 
-       sc->sc_iffreq = t;
+       sc->sc_frequency = t;
        error = audio_set_vchan_defaults(sc, AUMODE_PLAY | AUMODE_PLAY_ALL
            | AUMODE_RECORD, &sc->sc_format[0]);
        if (error)
@@ -6082,13 +6088,17 @@
                for (j = 0; j < __arraycount(auto_config_channels); j++) {
                        sc->sc_channels = auto_config_channels[j];
                        for (k = 0; k < __arraycount(auto_config_freq); k++) {
-                               sc->sc_iffreq = auto_config_freq[k];
+                               sc->sc_frequency = auto_config_freq[k];
                                error = audio_set_vchan_defaults(sc,
                                    AUMODE_PLAY | AUMODE_PLAY_ALL |
                                    AUMODE_RECORD, &sc->sc_format[0]);
                                if (vc->sc_npfilters > 0 &&
-                                   (vc->sc_mpr.s.param.
-                                       sample_rate != sc->sc_iffreq ||
+                                   (vc->sc_mpr.s.param.precision !=
+                                                       sc->sc_precision ||
+                                   vc->sc_mpr.s.param.validbits !=
+                                                       sc->sc_precision ||
+                                   vc->sc_mpr.s.param.
+                                       sample_rate != sc->sc_frequency ||
                                    vc->sc_mpr.s.param.
                                         channels != sc->sc_channels))
                                        error = EINVAL;
@@ -6099,7 +6109,7 @@
                                            "Format SLINEAR, precision %d, "
                                            "channels %d, frequency %d\n",
                                            sc->sc_precision, sc->sc_channels,
-                                           sc->sc_iffreq);
+                                           sc->sc_frequency);
                                        mutex_exit(sc->sc_lock);
 
                                        return 0;
diff -r 2370731184e8 -r 6d2def0fe421 sys/dev/audiovar.h
--- a/sys/dev/audiovar.h        Fri Jun 30 06:38:00 2017 +0000
+++ b/sys/dev/audiovar.h        Fri Jun 30 06:43:07 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: audiovar.h,v 1.55 2017/05/07 08:19:39 nat Exp $        */
+/*     $NetBSD: audiovar.h,v 1.55.2.1 2017/06/30 06:43:07 snj Exp $    */
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -291,7 +291,7 @@
        struct sysctllog        *sc_log;        /* sysctl log */
        int             sc_channels;
        int             sc_precision;
-       int             sc_iffreq;
+       int             sc_frequency;
        struct audio_info       sc_ai;          /* Recent info for  dev sound */
        bool                    sc_aivalid;
 #define VAUDIO_NFORMATS        1



Home | Main Index | Thread Index | Old Index