From nobody Mon Mar 10 20:22:11 2025 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4ZBSwz6h5fz5pbrM; Mon, 10 Mar 2025 20:22:11 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZBSwz38stz3s8c; Mon, 10 Mar 2025 20:22:11 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1741638131; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=gB3X5MUNU7ijpNYd9vxOGLjq9Y5hhM7gdFNtRk+kmD8=; b=mbuALI/ywGjDkmqve41MWx/HtBGaaV3rhGTT5+LIoEgoImLwUIaXBx4xoZJeSR90oLyel+ GyIbAHC2f/iTD0b0wCud7Bcqolp7j1eD9G3ahcBYHM9dJD3Llc+u+WxWuCE1xe0d32T9Hv pw7onxAdNZRUykaTx8iQxA/jnaY1O+5CNDpoaUSEm38rx5v9a6k1Q4aPRfaKaZL38y67Fi BmxhXvlXUEPkw9ys1eprbuXEXI7e5ULqsgyT4zpgAJnv6RyzxJd/vq7tyFyJGkoEna9eyp TaYj3xe/VN1XBrF4/TGXow10vKK//D05mrf8LXWx2eHUC5BjgcwhFGcWBBq/Cg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1741638131; a=rsa-sha256; cv=none; b=Ojt46DLNWJL+jqfc8yZauQ8u5b63G/5gjd431efuqyUGPYT2gw597wvuXhiq5fR8BlJ/Y8 wNwVPMvXdfG/uxtwl7DmwwKtb4f6pZ4I2V7yRtwrblnzRe2/HN5IziHiC/oHvxi3OuzG+x mTjLP7uhUnBoV9f6Skm6qEKQIHmZtvtzBNdrvPKG/Na5+rALvsoPCyHd9UHX+EPY1iJNJR LlS/xr21pTxEvNYSSgm4bfrys0LyR7/UDPPkXPOiNQApAO8Kn1B9vy1hTVfHFb8BiwpLH3 UZQZ33zUkfoSieKmMQYZOZ21EYkysmbaAhv5h1rSNNehoiRnFc+ZthFvPfRkKg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1741638131; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=gB3X5MUNU7ijpNYd9vxOGLjq9Y5hhM7gdFNtRk+kmD8=; b=FpyR81ogX36WAR8LnzRhPKkqnc6JmFFoiv1poSOrbDRUhZXOky3ca2cVOjzBs0Z2rGWJQ1 2rPe8gTo4+6T6c3eb9Eub/6Vn0pn1BJC6RRm2Ml+9z+EQKX8QJsUJU2GWU2ifBBSh30f8e rp+OP6RVOcTkGF72fCcGcFpD9a8CAWQ37ohSyJLCtMryIvRhBjDxRDwoM7kGsEh5rzsfiM CaYs+PP8ujwK4iXzI1bYepezcLi91YnzwoaAzaGYzaJ1Kjl/1/2HlTCbt1XFCzdGgEioD8 B9unTTYBXCuQ834IdYDqOkahZLmviW4dEIIypbSnDiKqSNeKd6nXgug15WkrQA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4ZBSwz2kQMzv4N; Mon, 10 Mar 2025 20:22:11 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 52AKMBZk044376; Mon, 10 Mar 2025 20:22:11 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 52AKMB0k044373; Mon, 10 Mar 2025 20:22:11 GMT (envelope-from git) Date: Mon, 10 Mar 2025 20:22:11 GMT Message-Id: <202503102022.52AKMB0k044373@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Christos Margiolis Subject: git: ac24c9da8bb7 - main - sound: Remove macro magic from pcm/feeder_matrix.c List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: christos X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: ac24c9da8bb7af731646dd7924841a28e2ad7ad7 Auto-Submitted: auto-generated The branch main has been updated by christos: URL: https://cgit.FreeBSD.org/src/commit/?id=ac24c9da8bb7af731646dd7924841a28e2ad7ad7 commit ac24c9da8bb7af731646dd7924841a28e2ad7ad7 Author: Christos Margiolis AuthorDate: 2025-03-10 20:19:41 +0000 Commit: Christos Margiolis CommitDate: 2025-03-10 20:19:41 +0000 sound: Remove macro magic from pcm/feeder_matrix.c Turn the FEEDMATRIX_DECLARE macro into a single inline function (feed_matrix_apply()). There is no reason to have this as a macro, it only complicated the code. An advantage of this patch is that, because we no longer call the functions created by the macro through function pointers (apply field of feed_matrix_info), we can call feed_matrix_apply() directly in feed_matrix_feed(). Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D48035 --- sys/dev/sound/pcm/feeder_matrix.c | 185 ++++++++++++-------------------------- 1 file changed, 56 insertions(+), 129 deletions(-) diff --git a/sys/dev/sound/pcm/feeder_matrix.c b/sys/dev/sound/pcm/feeder_matrix.c index b63b5841ff7f..ab7922179867 100644 --- a/sys/dev/sound/pcm/feeder_matrix.c +++ b/sys/dev/sound/pcm/feeder_matrix.c @@ -60,16 +60,11 @@ #define SND_CHN_T_EOF 0x00e0fe0f #define SND_CHN_T_NULL 0x0e0e0e0e -struct feed_matrix_info; - -typedef void (*feed_matrix_t)(struct feed_matrix_info *, uint8_t *, - uint8_t *, uint32_t); - struct feed_matrix_info { + uint32_t fmt; uint32_t bps; uint32_t ialign, oalign; uint32_t in, out; - feed_matrix_t apply; struct { int chn[SND_CHN_T_MAX + 1]; int mul, shift; @@ -115,114 +110,48 @@ static int feeder_matrix_default_ids[9] = { } while (0) #endif -#define FEEDMATRIX_DECLARE(SIGN, BIT, ENDIAN) \ -static void \ -feed_matrix_##SIGN##BIT##ENDIAN(struct feed_matrix_info *info, \ - uint8_t *src, uint8_t *dst, uint32_t count) \ -{ \ - intpcm64_t accum; \ - intpcm_t v; \ - int i, j; \ - \ - do { \ - for (i = 0; info->matrix[i].chn[0] != SND_CHN_T_EOF; \ - i++) { \ - if (info->matrix[i].chn[0] == SND_CHN_T_NULL) { \ - pcm_sample_write(dst, 0, \ - AFMT_##SIGN##BIT##_##ENDIAN); \ - dst += PCM_##BIT##_BPS; \ - continue; \ - } else if (info->matrix[i].chn[1] == \ - SND_CHN_T_EOF) { \ - v = pcm_sample_read( \ - src + info->matrix[i].chn[0], \ - AFMT_##SIGN##BIT##_##ENDIAN); \ - pcm_sample_write(dst, v, \ - AFMT_##SIGN##BIT##_##ENDIAN); \ - dst += PCM_##BIT##_BPS; \ - continue; \ - } \ - \ - accum = 0; \ - for (j = 0; \ - info->matrix[i].chn[j] != SND_CHN_T_EOF; \ - j++) { \ - v = pcm_sample_read( \ - src + info->matrix[i].chn[j], \ - AFMT_##SIGN##BIT##_##ENDIAN); \ - accum += v; \ - } \ - \ - accum = (accum * info->matrix[i].mul) >> \ - info->matrix[i].shift; \ - \ - FEEDMATRIX_CLIP_CHECK(accum, BIT); \ - \ - v = (accum > PCM_S##BIT##_MAX) ? \ - PCM_S##BIT##_MAX : \ - ((accum < PCM_S##BIT##_MIN) ? \ - PCM_S##BIT##_MIN : \ - accum); \ - pcm_sample_write(dst, v, \ - AFMT_##SIGN##BIT##_##ENDIAN); \ - dst += PCM_##BIT##_BPS; \ - } \ - src += info->ialign; \ - } while (--count != 0); \ -} +__always_inline static void +feed_matrix_apply(struct feed_matrix_info *info, uint8_t *src, uint8_t *dst, + uint32_t count, const uint32_t fmt) +{ + intpcm64_t accum; + intpcm_t v; + int i, j; -#if BYTE_ORDER == LITTLE_ENDIAN || defined(SND_FEEDER_MULTIFORMAT) -FEEDMATRIX_DECLARE(S, 16, LE) -FEEDMATRIX_DECLARE(S, 32, LE) -#endif -#if BYTE_ORDER == BIG_ENDIAN || defined(SND_FEEDER_MULTIFORMAT) -FEEDMATRIX_DECLARE(S, 16, BE) -FEEDMATRIX_DECLARE(S, 32, BE) -#endif -#ifdef SND_FEEDER_MULTIFORMAT -FEEDMATRIX_DECLARE(S, 8, NE) -FEEDMATRIX_DECLARE(S, 24, LE) -FEEDMATRIX_DECLARE(S, 24, BE) -FEEDMATRIX_DECLARE(U, 8, NE) -FEEDMATRIX_DECLARE(U, 16, LE) -FEEDMATRIX_DECLARE(U, 24, LE) -FEEDMATRIX_DECLARE(U, 32, LE) -FEEDMATRIX_DECLARE(U, 16, BE) -FEEDMATRIX_DECLARE(U, 24, BE) -FEEDMATRIX_DECLARE(U, 32, BE) -#endif + do { + for (i = 0; info->matrix[i].chn[0] != SND_CHN_T_EOF; i++) { + if (info->matrix[i].chn[0] == SND_CHN_T_NULL) { + pcm_sample_write(dst, 0, fmt); + dst += info->bps; + continue; + } else if (info->matrix[i].chn[1] == SND_CHN_T_EOF) { + v = pcm_sample_read(src + + info->matrix[i].chn[0], fmt); + pcm_sample_write(dst, v, fmt); + dst += info->bps; + continue; + } -#define FEEDMATRIX_ENTRY(SIGN, BIT, ENDIAN) \ - { \ - AFMT_##SIGN##BIT##_##ENDIAN, \ - feed_matrix_##SIGN##BIT##ENDIAN \ - } + accum = 0; + for (j = 0; info->matrix[i].chn[j] != SND_CHN_T_EOF; + j++) { + v = pcm_sample_read(src + + info->matrix[i].chn[j], fmt); + accum += v; + } -static const struct { - uint32_t format; - feed_matrix_t apply; -} feed_matrix_tab[] = { -#if BYTE_ORDER == LITTLE_ENDIAN || defined(SND_FEEDER_MULTIFORMAT) - FEEDMATRIX_ENTRY(S, 16, LE), - FEEDMATRIX_ENTRY(S, 32, LE), -#endif -#if BYTE_ORDER == BIG_ENDIAN || defined(SND_FEEDER_MULTIFORMAT) - FEEDMATRIX_ENTRY(S, 16, BE), - FEEDMATRIX_ENTRY(S, 32, BE), -#endif -#ifdef SND_FEEDER_MULTIFORMAT - FEEDMATRIX_ENTRY(S, 8, NE), - FEEDMATRIX_ENTRY(S, 24, LE), - FEEDMATRIX_ENTRY(S, 24, BE), - FEEDMATRIX_ENTRY(U, 8, NE), - FEEDMATRIX_ENTRY(U, 16, LE), - FEEDMATRIX_ENTRY(U, 24, LE), - FEEDMATRIX_ENTRY(U, 32, LE), - FEEDMATRIX_ENTRY(U, 16, BE), - FEEDMATRIX_ENTRY(U, 24, BE), - FEEDMATRIX_ENTRY(U, 32, BE) -#endif -}; + accum = (accum * info->matrix[i].mul) >> + info->matrix[i].shift; + + FEEDMATRIX_CLIP_CHECK(accum, AFMT_BIT(fmt)); + + v = pcm_clamp(accum, fmt); + pcm_sample_write(dst, v, fmt); + dst += info->bps; + } + src += info->ialign; + } while (--count != 0); +} static void feed_matrix_reset(struct feed_matrix_info *info) @@ -397,7 +326,6 @@ feed_matrix_init(struct pcm_feeder *f) { struct feed_matrix_info *info; struct pcmchan_matrix *m_in, *m_out; - uint32_t i; int ret; if (AFMT_ENCODING(f->desc->in) != AFMT_ENCODING(f->desc->out)) @@ -409,25 +337,10 @@ feed_matrix_init(struct pcm_feeder *f) info->in = f->desc->in; info->out = f->desc->out; + info->fmt = AFMT_ENCODING(info->in); info->bps = AFMT_BPS(info->in); info->ialign = AFMT_ALIGN(info->in); info->oalign = AFMT_ALIGN(info->out); - info->apply = NULL; - - for (i = 0; info->apply == NULL && - i < (sizeof(feed_matrix_tab) / sizeof(feed_matrix_tab[0])); i++) { - if (AFMT_ENCODING(info->in) == feed_matrix_tab[i].format) - info->apply = feed_matrix_tab[i].apply; - } - - if (info->apply == NULL) { -#ifdef FEEDMATRIX_GENERIC - info->apply = feed_matrix_apply_generic; -#else - free(info, M_DEVBUF); - return (EINVAL); -#endif - } m_in = feeder_matrix_format_map(info->in); m_out = feeder_matrix_format_map(info->out); @@ -505,7 +418,21 @@ feed_matrix_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b, if (j == 0) break; - info->apply(info, src, dst, j); + /* Optimize some common formats. */ + switch (info->fmt) { + case AFMT_S16_NE: + feed_matrix_apply(info, src, dst, j, AFMT_S16_NE); + break; + case AFMT_S24_NE: + feed_matrix_apply(info, src, dst, j, AFMT_S24_NE); + break; + case AFMT_S32_NE: + feed_matrix_apply(info, src, dst, j, AFMT_S32_NE); + break; + default: + feed_matrix_apply(info, src, dst, j, info->fmt); + break; + } j *= info->oalign; dst += j;