git: 0a566f2fe96b - stable/15 - sound: Simplify pcm_feederdesc initialization

From: Christos Margiolis <christos_at_FreeBSD.org>
Date: Tue, 18 Nov 2025 00:52:02 UTC
The branch stable/15 has been updated by christos:

URL: https://cgit.FreeBSD.org/src/commit/?id=0a566f2fe96ba29eec84bc365de65dc4352c2cd1

commit 0a566f2fe96ba29eec84bc365de65dc4352c2cd1
Author:     Christos Margiolis <christos@FreeBSD.org>
AuthorDate: 2025-11-11 12:06:01 +0000
Commit:     Christos Margiolis <christos@FreeBSD.org>
CommitDate: 2025-11-18 00:51:23 +0000

    sound: Simplify pcm_feederdesc initialization
    
    Currently we initialize a pcm_feederdesc array for every feeder, which
    is then used by FEEDER_DECLARE(). However, there is no reason for this
    to be an array, as each feeder has only one description. Additionally,
    since the only thing we define in that array is the feeder type, remove
    the pcm_feederdesc definitions altogether, and instead pass their type
    to FEEDER_DECLARE() directly, which will then initialize the
    pcm_feederdesc.
    
    This also simplifies feeder_register().
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D53551
    
    (cherry picked from commit 7d33c3d651901c97a683689916c810cf4e26a057)
---
 sys/dev/sound/pcm/feeder.c        | 23 +++++++----------------
 sys/dev/sound/pcm/feeder.h        |  6 +++---
 sys/dev/sound/pcm/feeder_eq.c     |  7 +------
 sys/dev/sound/pcm/feeder_format.c |  7 +------
 sys/dev/sound/pcm/feeder_matrix.c |  7 +------
 sys/dev/sound/pcm/feeder_mixer.c  |  7 +------
 sys/dev/sound/pcm/feeder_rate.c   |  7 +------
 sys/dev/sound/pcm/feeder_volume.c |  7 +------
 8 files changed, 16 insertions(+), 55 deletions(-)

diff --git a/sys/dev/sound/pcm/feeder.c b/sys/dev/sound/pcm/feeder.c
index e94e742b263f..0dddfa84543d 100644
--- a/sys/dev/sound/pcm/feeder.c
+++ b/sys/dev/sound/pcm/feeder.c
@@ -70,22 +70,13 @@ feeder_register(void *p)
 {
 	struct feeder_class *fc = p;
 	struct feedertab_entry *fte;
-	int i;
 
-	KASSERT(fc->desc != NULL, ("feeder '%s' has no descriptor", fc->name));
-
-	/*
-	 * beyond this point failure is non-fatal but may result in some
-	 * translations being unavailable
-	 */
-	i = 0;
-	while (fc->desc[i].type > 0) {
-		fte = malloc(sizeof(*fte), M_FEEDER, M_WAITOK | M_ZERO);
-		fte->feederclass = fc;
-		fte->desc = &fc->desc[i];
-		SLIST_INSERT_HEAD(&feedertab, fte, link);
-		i++;
-	}
+	KASSERT(fc->desc.type != 0, ("feeder '%s' has no descriptor", fc->name));
+
+	fte = malloc(sizeof(*fte), M_FEEDER, M_WAITOK | M_ZERO);
+	fte->feederclass = fc;
+	fte->desc = &fc->desc;
+	SLIST_INSERT_HEAD(&feedertab, fte, link);
 }
 
 static void
@@ -442,7 +433,7 @@ static struct feeder_class feeder_root_class = {
 	.name =		"feeder_root",
 	.methods =	feeder_root_methods,
 	.size =		sizeof(struct pcm_feeder),
-	.desc =		NULL,
+	.desc =		{ 0 },
 	.data =		NULL,
 };
 /*
diff --git a/sys/dev/sound/pcm/feeder.h b/sys/dev/sound/pcm/feeder.h
index e417d68fea71..d8760f1c87ab 100644
--- a/sys/dev/sound/pcm/feeder.h
+++ b/sys/dev/sound/pcm/feeder.h
@@ -35,7 +35,7 @@ struct pcm_feederdesc {
 
 struct feeder_class {
 	KOBJ_CLASS_FIELDS;
-	struct pcm_feederdesc *desc;
+	struct pcm_feederdesc desc;
 	void *data;
 };
 
@@ -64,12 +64,12 @@ struct pcm_feeder *feeder_find(struct pcm_channel *c, u_int32_t type);
 void feeder_printchain(struct pcm_feeder *head);
 int feeder_chain(struct pcm_channel *);
 
-#define FEEDER_DECLARE(feeder, pdata)					\
+#define FEEDER_DECLARE(feeder, type, pdata)				\
 static struct feeder_class feeder ## _class = {				\
 	.name =		#feeder,					\
 	.methods =	feeder ## _methods,				\
 	.size =		sizeof(struct pcm_feeder),			\
-	.desc =		feeder ## _desc,				\
+	.desc =		{ type, 0, 0, 0 },				\
 	.data =		pdata,						\
 };									\
 SYSINIT(feeder, SI_SUB_DRIVERS, SI_ORDER_ANY, feeder_register,		\
diff --git a/sys/dev/sound/pcm/feeder_eq.c b/sys/dev/sound/pcm/feeder_eq.c
index 88a083a3bfd1..05f5a5b82290 100644
--- a/sys/dev/sound/pcm/feeder_eq.c
+++ b/sys/dev/sound/pcm/feeder_eq.c
@@ -419,11 +419,6 @@ feed_eq_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
 	return (dst - b);
 }
 
-static struct pcm_feederdesc feeder_eq_desc[] = {
-	{ FEEDER_EQ, 0, 0, 0 },
-	{ 0, 0, 0, 0 }
-};
-
 static kobj_method_t feeder_eq_methods[] = {
 	KOBJMETHOD(feeder_init,		feed_eq_init),
 	KOBJMETHOD(feeder_free,		feed_eq_free),
@@ -432,7 +427,7 @@ static kobj_method_t feeder_eq_methods[] = {
 	KOBJMETHOD_END
 };
 
-FEEDER_DECLARE(feeder_eq, NULL);
+FEEDER_DECLARE(feeder_eq, FEEDER_EQ, NULL);
 
 static int32_t
 feed_eq_scan_preamp_arg(const char *s)
diff --git a/sys/dev/sound/pcm/feeder_format.c b/sys/dev/sound/pcm/feeder_format.c
index c9679cfeba44..21b54fcafcd7 100644
--- a/sys/dev/sound/pcm/feeder_format.c
+++ b/sys/dev/sound/pcm/feeder_format.c
@@ -172,11 +172,6 @@ feed_format_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
 	return (dst - b);
 }
 
-static struct pcm_feederdesc feeder_format_desc[] = {
-	{ FEEDER_FORMAT, 0, 0, 0 },
-	{ 0, 0, 0, 0 }
-};
-
 static kobj_method_t feeder_format_methods[] = {
 	KOBJMETHOD(feeder_init,		feed_format_init),
 	KOBJMETHOD(feeder_free,		feed_format_free),
@@ -185,4 +180,4 @@ static kobj_method_t feeder_format_methods[] = {
 	KOBJMETHOD_END
 };
 
-FEEDER_DECLARE(feeder_format, NULL);
+FEEDER_DECLARE(feeder_format, FEEDER_FORMAT, NULL);
diff --git a/sys/dev/sound/pcm/feeder_matrix.c b/sys/dev/sound/pcm/feeder_matrix.c
index a0af32b887ce..69c7e5962268 100644
--- a/sys/dev/sound/pcm/feeder_matrix.c
+++ b/sys/dev/sound/pcm/feeder_matrix.c
@@ -398,11 +398,6 @@ feed_matrix_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
 	return (dst - b);
 }
 
-static struct pcm_feederdesc feeder_matrix_desc[] = {
-	{ FEEDER_MATRIX, 0, 0, 0 },
-	{ 0, 0, 0, 0 }
-};
-
 static kobj_method_t feeder_matrix_methods[] = {
 	KOBJMETHOD(feeder_init,		feed_matrix_init),
 	KOBJMETHOD(feeder_free,		feed_matrix_free),
@@ -410,7 +405,7 @@ static kobj_method_t feeder_matrix_methods[] = {
 	KOBJMETHOD_END
 };
 
-FEEDER_DECLARE(feeder_matrix, NULL);
+FEEDER_DECLARE(feeder_matrix, FEEDER_MATRIX, NULL);
 
 /* External */
 int
diff --git a/sys/dev/sound/pcm/feeder_mixer.c b/sys/dev/sound/pcm/feeder_mixer.c
index 028e9366aa8e..3c2a58ba145f 100644
--- a/sys/dev/sound/pcm/feeder_mixer.c
+++ b/sys/dev/sound/pcm/feeder_mixer.c
@@ -358,11 +358,6 @@ feed_mixer_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
 	return (rcnt);
 }
 
-static struct pcm_feederdesc feeder_mixer_desc[] = {
-	{ FEEDER_MIXER, 0, 0, 0 },
-	{ 0, 0, 0, 0 }
-};
-
 static kobj_method_t feeder_mixer_methods[] = {
 	KOBJMETHOD(feeder_init,		feed_mixer_init),
 	KOBJMETHOD(feeder_free,		feed_mixer_free),
@@ -371,4 +366,4 @@ static kobj_method_t feeder_mixer_methods[] = {
 	KOBJMETHOD_END
 };
 
-FEEDER_DECLARE(feeder_mixer, NULL);
+FEEDER_DECLARE(feeder_mixer, FEEDER_MIXER, NULL);
diff --git a/sys/dev/sound/pcm/feeder_rate.c b/sys/dev/sound/pcm/feeder_rate.c
index 166165e95e65..173a0c1fcd39 100644
--- a/sys/dev/sound/pcm/feeder_rate.c
+++ b/sys/dev/sound/pcm/feeder_rate.c
@@ -1705,11 +1705,6 @@ z_resampler_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
 	return (count - left);
 }
 
-static struct pcm_feederdesc feeder_rate_desc[] = {
-	{ FEEDER_RATE, 0, 0, 0 },
-	{ 0, 0, 0, 0 },
-};
-
 static kobj_method_t feeder_rate_methods[] = {
 	KOBJMETHOD(feeder_init,		z_resampler_init),
 	KOBJMETHOD(feeder_free,		z_resampler_free),
@@ -1719,4 +1714,4 @@ static kobj_method_t feeder_rate_methods[] = {
 	KOBJMETHOD_END
 };
 
-FEEDER_DECLARE(feeder_rate, NULL);
+FEEDER_DECLARE(feeder_rate, FEEDER_RATE, NULL);
diff --git a/sys/dev/sound/pcm/feeder_volume.c b/sys/dev/sound/pcm/feeder_volume.c
index 119ab1b288d8..942f1a273edf 100644
--- a/sys/dev/sound/pcm/feeder_volume.c
+++ b/sys/dev/sound/pcm/feeder_volume.c
@@ -306,11 +306,6 @@ feed_volume_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
 	return (dst - b);
 }
 
-static struct pcm_feederdesc feeder_volume_desc[] = {
-	{ FEEDER_VOLUME, 0, 0, 0 },
-	{ 0, 0, 0, 0 }
-};
-
 static kobj_method_t feeder_volume_methods[] = {
 	KOBJMETHOD(feeder_init,		feed_volume_init),
 	KOBJMETHOD(feeder_free,		feed_volume_free),
@@ -319,7 +314,7 @@ static kobj_method_t feeder_volume_methods[] = {
 	KOBJMETHOD_END
 };
 
-FEEDER_DECLARE(feeder_volume, NULL);
+FEEDER_DECLARE(feeder_volume, FEEDER_VOLUME, NULL);
 
 /* Extern */