30#ifdef HAVE_KERNEL_OPTION_HEADERS
59 static int feedercnt = 0;
66 KASSERT(fc->
desc == NULL, (
"first feeder not root: %s", fc->name));
68 SLIST_INIT(&feedertab);
69 fte = malloc(
sizeof(*fte), M_FEEDER, M_NOWAIT | M_ZERO);
71 printf(
"can't allocate memory for root feeder: %s\n",
76 fte->feederclass = fc;
79 SLIST_INSERT_HEAD(&feedertab, fte, link);
84 if (snd_verbose < 0 || snd_verbose > 4)
118 printf(
"%s: snd_unit=%d snd_maxautovchans=%d "
120 "feeder_rate_min=%d feeder_rate_max=%d "
121 "feeder_rate_round=%d\n",
133 KASSERT(fc->
desc != NULL, (
"feeder '%s' has no descriptor", fc->name));
139 fte = malloc(
sizeof(*fte), M_FEEDER, M_NOWAIT | M_ZERO);
141 printf(
"can't allocate memory for feeder '%s', %x -> %x\n", fc->name, fc->
desc[i].
in, fc->
desc[i].
out);
145 fte->feederclass = fc;
146 fte->desc = &fc->
desc[i];
147 fte->idx = feedercnt;
148 fte->desc->idx = feedercnt;
149 SLIST_INSERT_HEAD(&feedertab, fte, link);
154 printf(
"MAXFEEDERS (%d >= %d) exceeded\n", feedercnt,
MAXFEEDERS);
162 next = SLIST_FIRST(&feedertab);
163 while (
next != NULL) {
165 next = SLIST_NEXT(fte, link);
173 return ((
n->type ==
m->
type) &&
174 ((
n->in == 0) || (
n->in ==
m->in)) &&
175 ((
n->out == 0) || (
n->out ==
m->out)) &&
176 (
n->flags ==
m->flags));
183 kobj_delete((kobj_t)f, M_FEEDER);
192 f = (
struct pcm_feeder *)kobj_create((kobj_class_t)fc, M_FEEDER, M_NOWAIT | M_ZERO);
212 err = FEEDER_INIT(f);
214 printf(
"feeder_init(%p) on %s returned %d\n", f, fc->name, err);
228 SLIST_FOREACH(fte, &feedertab, link) {
229 if ((
desc == NULL) && (fte->desc == NULL))
230 return fte->feederclass;
232 return fte->feederclass;
311#define score_signeq(s1, s2) (((s1) & 0x1) == ((s2) & 0x1))
312#define score_endianeq(s1, s2) (((s1) & 0x2) == ((s2) & 0x2))
313#define score_cheq(s1, s2) (((s1) & 0xfc) == ((s2) & 0xfc))
314#define score_chgt(s1, s2) (((s1) & 0xfc) > ((s2) & 0xfc))
315#define score_chlt(s1, s2) (((s1) & 0xfc) < ((s2) & 0xfc))
316#define score_val(s1) ((s1) & 0x3f00)
317#define score_cse(s1) ((s1) & 0x7f)
334 if (
fmt & AFMT_A_LAW)
336 else if (
fmt & AFMT_MU_LAW)
353 u_int32_t best, score, score2, oldscore;
365 for (i = 0;
fmts[i] != 0; i++) {
369 (oldscore != 0 &&
score_chgt(score2, oldscore))))
410 u_int32_t best1, best2;
411 u_int32_t score, score1, score2;
419 if (best1 != 0 && best2 != 0 && best1 != best2) {
427 if (score1 == score2 || score1 == score)
429 else if (score2 == score)
431 else if (score1 > score2)
435 }
else if (best2 == 0)
446 printf(
"feeder chain (head @%p)\n", head);
449 printf(
"%s/%d @ %p\n", f->
class->name, f->
desc->
idx, f);
463 KASSERT(
count > 0, (
"feed_root: count == 0"));
480 printf(
"%s: (%s) %spending %d bytes "
481 "(count=%d l=%d feed=%d)\n",
515 .name =
"feeder_root",
u_int8_t sndbuf_zerodata(u_int32_t fmt)
u_int32_t sndbuf_getfmt(struct snd_dbuf *b)
unsigned int sndbuf_getready(struct snd_dbuf *b)
int sndbuf_dispose(struct snd_dbuf *b, u_int8_t *to, unsigned int count)
Dispose samples from channel buffer, increasing size of ready area.
int snd_fmtvalid(uint32_t fmt, uint32_t *fmtlist)
#define CHN_LATENCY_PROFILE_MAX
#define CHN_LATENCY_DEFAULT
#define CHN_LATENCY_PROFILE_DEFAULT
#define CHN_LATENCY_PROFILE_MIN
struct pcmchan_matrix * m
u_int32_t snd_fmtbestchannel(u_int32_t fmt, u_int32_t *fmts)
static void feeder_destroy(struct pcm_feeder *f)
struct feeder_class * feeder_getclass(struct pcm_feederdesc *desc)
struct pcm_feeder * chn_findfeeder(struct pcm_channel *c, u_int32_t type)
u_int32_t snd_fmtbest(u_int32_t fmt, u_int32_t *fmts)
#define score_chlt(s1, s2)
static int cmpdesc(struct pcm_feederdesc *n, struct pcm_feederdesc *m)
#define score_endianeq(s1, s2)
SYSINIT(feeder_root, SI_SUB_DRIVERS, SI_ORDER_FIRST, feeder_register, &feeder_root_class)
int chn_addfeeder(struct pcm_channel *c, struct feeder_class *fc, struct pcm_feederdesc *desc)
u_int32_t snd_fmtscore(u_int32_t fmt)
#define score_signeq(s1, s2)
SND_DECLARE_FILE("$FreeBSD$")
static MALLOC_DEFINE(M_FEEDER, "feeder", "pcm feeder")
static struct pcm_feeder * feeder_create(struct feeder_class *fc, struct pcm_feederdesc *desc)
void feeder_printchain(struct pcm_feeder *head)
#define score_cheq(s1, s2)
static int feed_root(struct pcm_feeder *feeder, struct pcm_channel *ch, u_int8_t *buffer, u_int32_t count, void *source)
int chn_removefeeder(struct pcm_channel *c)
u_int32_t snd_fmtbestbit(u_int32_t fmt, u_int32_t *fmts)
static void feeder_unregisterall(void *p)
static u_int32_t snd_fmtbestfunc(u_int32_t fmt, u_int32_t *fmts, int cheq)
static SLIST_HEAD(feedertab_entry)
SYSUNINIT(feeder_root, SI_SUB_DRIVERS, SI_ORDER_FIRST, feeder_unregisterall, NULL)
static kobj_method_t feeder_root_methods[]
static struct feeder_class feeder_root_class
#define score_chgt(s1, s2)
void feeder_register(void *p)
#define FEEDRATE_ROUNDHZ_MIN
#define FEEDRATE_ROUNDHZ_MAX
struct pcm_feederdesc * desc
struct pcm_feeder * feeder
struct pcm_feeder * source
struct pcm_feederdesc desc_static
struct pcm_feeder * parent
struct pcm_feederdesc * desc
struct feeder_class * class