aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/sound/pcm/feeder.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/pcm/feeder.c')
-rw-r--r--sys/dev/sound/pcm/feeder.c135
1 files changed, 16 insertions, 119 deletions
diff --git a/sys/dev/sound/pcm/feeder.c b/sys/dev/sound/pcm/feeder.c
index af3ada441e48..fa4e4e16a133 100644
--- a/sys/dev/sound/pcm/feeder.c
+++ b/sys/dev/sound/pcm/feeder.c
@@ -36,94 +36,25 @@
#endif
#include <dev/sound/pcm/sound.h>
-#include <dev/sound/pcm/vchan.h>
#include "feeder_if.h"
static MALLOC_DEFINE(M_FEEDER, "feeder", "pcm feeder");
-#define MAXFEEDERS 256
-
-struct feedertab_entry {
- SLIST_ENTRY(feedertab_entry) link;
- struct feeder_class *feederclass;
- struct pcm_feederdesc *desc;
-
- int idx;
-};
-static SLIST_HEAD(, feedertab_entry) feedertab;
-static int feedercnt = 0;
-
-/*****************************************************************************/
-
-static void
-feeder_register_root(void *p)
-{
- struct feeder_class *fc = p;
- struct feedertab_entry *fte;
-
- MPASS(feedercnt == 0);
- KASSERT(fc->desc == NULL, ("first feeder not root: %s", fc->name));
-
- SLIST_INIT(&feedertab);
- fte = malloc(sizeof(*fte), M_FEEDER, M_WAITOK | M_ZERO);
- fte->feederclass = fc;
- fte->desc = NULL;
- fte->idx = feedercnt;
- SLIST_INSERT_HEAD(&feedertab, fte, link);
- feedercnt++;
-}
+static SLIST_HEAD(, feeder_class) feedertab = SLIST_HEAD_INITIALIZER(feedertab);
void
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 ((feedercnt < MAXFEEDERS) && (fc->desc[i].type > 0)) {
- fte = malloc(sizeof(*fte), M_FEEDER, M_WAITOK | M_ZERO);
- fte->feederclass = fc;
- fte->desc = &fc->desc[i];
- fte->idx = feedercnt;
- fte->desc->idx = feedercnt;
- SLIST_INSERT_HEAD(&feedertab, fte, link);
- i++;
- }
- feedercnt++;
- if (feedercnt >= MAXFEEDERS) {
- printf("MAXFEEDERS (%d >= %d) exceeded\n",
- feedercnt, MAXFEEDERS);
- }
+ SLIST_INSERT_HEAD(&feedertab, fc, link);
}
static void
-feeder_unregisterall(void *p)
+feeder_unregisterall(void *p __unused)
{
- struct feedertab_entry *fte, *next;
-
- next = SLIST_FIRST(&feedertab);
- while (next != NULL) {
- fte = next;
- next = SLIST_NEXT(fte, link);
- free(fte, M_FEEDER);
- }
-}
-
-static int
-cmpdesc(struct pcm_feederdesc *n, struct pcm_feederdesc *m)
-{
- return ((n->type == m->type) &&
- ((n->in == 0) || (n->in == m->in)) &&
- ((n->out == 0) || (n->out == m->out)) &&
- (n->flags == m->flags));
+ SLIST_INIT(&feedertab);
}
static void
@@ -143,21 +74,10 @@ feeder_create(struct feeder_class *fc, struct pcm_feederdesc *desc)
if (f == NULL)
return NULL;
- f->data = fc->data;
- f->source = NULL;
- f->parent = NULL;
f->class = fc;
f->desc = &(f->desc_static);
-
- if (desc) {
+ if (desc != NULL)
*(f->desc) = *desc;
- } else {
- f->desc->type = FEEDER_ROOT;
- f->desc->in = 0;
- f->desc->out = 0;
- f->desc->flags = 0;
- f->desc->idx = 0;
- }
err = FEEDER_INIT(f);
if (err) {
@@ -171,17 +91,15 @@ feeder_create(struct feeder_class *fc, struct pcm_feederdesc *desc)
}
struct feeder_class *
-feeder_getclass(struct pcm_feederdesc *desc)
+feeder_getclass(u_int32_t type)
{
- struct feedertab_entry *fte;
+ struct feeder_class *fc;
- SLIST_FOREACH(fte, &feedertab, link) {
- if ((desc == NULL) && (fte->desc == NULL))
- return fte->feederclass;
- if ((fte->desc != NULL) && (desc != NULL) && cmpdesc(desc, fte->desc))
- return fte->feederclass;
+ SLIST_FOREACH(fc, &feedertab, link) {
+ if (fc->type == type)
+ return (fc);
}
- return NULL;
+ return (NULL);
}
int
@@ -221,7 +139,7 @@ feeder_find(struct pcm_channel *c, u_int32_t type)
f = c->feeder;
while (f != NULL) {
- if (f->desc->type == type)
+ if (f->class->type == type)
return f;
f = f->source;
}
@@ -386,22 +304,6 @@ snd_fmtbest(u_int32_t fmt, u_int32_t *fmts)
return best2;
}
-void
-feeder_printchain(struct pcm_feeder *head)
-{
- struct pcm_feeder *f;
-
- printf("feeder chain (head @%p)\n", head);
- f = head;
- while (f != NULL) {
- printf("%s/%d @ %p\n", f->class->name, f->desc->idx, f);
- f = f->source;
- }
- printf("[end]\n\n");
-}
-
-/*****************************************************************************/
-
static int
feed_root(struct pcm_feeder *feeder, struct pcm_channel *ch, u_int8_t *buffer, u_int32_t count, void *source)
{
@@ -433,9 +335,7 @@ feed_root(struct pcm_feeder *feeder, struct pcm_channel *ch, u_int8_t *buffer, u
offset, count, l, ch->feedcount);
if (ch->feedcount == 1) {
- memset(buffer,
- sndbuf_zerodata(sndbuf_getfmt(src)),
- offset);
+ memset(buffer, sndbuf_zerodata(src->fmt), offset);
if (l > 0)
sndbuf_dispose(src, buffer + offset, l);
else
@@ -443,9 +343,7 @@ feed_root(struct pcm_feeder *feeder, struct pcm_channel *ch, u_int8_t *buffer, u
} else {
if (l > 0)
sndbuf_dispose(src, buffer, l);
- memset(buffer + l,
- sndbuf_zerodata(sndbuf_getfmt(src)),
- offset);
+ memset(buffer + l, sndbuf_zerodata(src->fmt), offset);
if (!(ch->flags & CHN_F_CLOSING))
ch->xruns++;
}
@@ -463,13 +361,12 @@ static struct feeder_class feeder_root_class = {
.name = "feeder_root",
.methods = feeder_root_methods,
.size = sizeof(struct pcm_feeder),
- .desc = NULL,
- .data = NULL,
+ .type = FEEDER_ROOT,
};
/*
* Register the root feeder first so that pcm_addchan() and subsequent
* functions can use it.
*/
-SYSINIT(feeder_root, SI_SUB_DRIVERS, SI_ORDER_FIRST, feeder_register_root,
+SYSINIT(feeder_root, SI_SUB_DRIVERS, SI_ORDER_FIRST, feeder_register,
&feeder_root_class);
SYSUNINIT(feeder_root, SI_SUB_DRIVERS, SI_ORDER_FIRST, feeder_unregisterall, NULL);