The branch main has been updated by christos:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=425a7bc465d4a6393c88c2e79c5ad77befda2a97

commit 425a7bc465d4a6393c88c2e79c5ad77befda2a97
Author:     Christos Margiolis <chris...@freebsd.org>
AuthorDate: 2024-05-23 00:57:55 +0000
Commit:     Christos Margiolis <chris...@freebsd.org>
CommitDate: 2024-05-23 00:57:55 +0000

    sound: Fix minchn, maxchn and fmts in sndstat_get_caps()
    
    The current implementation (incorrectly) passes the channel encoding
    value to AFMT_CHANNEL(), which will always return 0, since the channel
    number bits are masked out by AFMT_ENCODING().
    
    Also add missing fmts initialization and aggregate encoding formats into
    it directly.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 day
    Reviewed by:    dev_submerge.ch
    Differential Revision:  https://reviews.freebsd.org/D45312
---
 sys/dev/sound/pcm/sndstat.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/sys/dev/sound/pcm/sndstat.c b/sys/dev/sound/pcm/sndstat.c
index bbcb2fda7c29..6880ce383ba4 100644
--- a/sys/dev/sound/pcm/sndstat.c
+++ b/sys/dev/sound/pcm/sndstat.c
@@ -330,7 +330,6 @@ sndstat_get_caps(struct snddev_info *d, bool play, uint32_t 
*min_rate,
     uint32_t *max_rate, uint32_t *fmts, uint32_t *minchn, uint32_t *maxchn)
 {
        struct pcm_channel *c;
-       unsigned int encoding;
        int dir;
 
        dir = play ? PCMDIR_PLAY : PCMDIR_REC;
@@ -347,11 +346,11 @@ sndstat_get_caps(struct snddev_info *d, bool play, 
uint32_t *min_rate,
                return;
        }
 
+       *fmts = 0;
        *min_rate = UINT32_MAX;
        *max_rate = 0;
        *minchn = UINT32_MAX;
        *maxchn = 0;
-       encoding = 0;
        CHN_FOREACH(c, d, channels.pcm) {
                struct pcmchan_caps *caps;
                int i;
@@ -364,9 +363,9 @@ sndstat_get_caps(struct snddev_info *d, bool play, uint32_t 
*min_rate,
                *min_rate = min(caps->minspeed, *min_rate);
                *max_rate = max(caps->maxspeed, *max_rate);
                for (i = 0; caps->fmtlist[i]; i++) {
-                       encoding |= AFMT_ENCODING(caps->fmtlist[i]);
-                       *minchn = min(AFMT_CHANNEL(encoding), *minchn);
-                       *maxchn = max(AFMT_CHANNEL(encoding), *maxchn);
+                       *fmts |= AFMT_ENCODING(caps->fmtlist[i]);
+                       *minchn = min(AFMT_CHANNEL(caps->fmtlist[i]), *minchn);
+                       *maxchn = max(AFMT_CHANNEL(caps->fmtlist[i]), *maxchn);
                }
                CHN_UNLOCK(c);
        }

Reply via email to