30#ifdef HAVE_KERNEL_OPTION_HEADERS
39#include "snd_fxdiv_gen.h"
44#undef SND_FEEDER_MULTIFORMAT
45#define SND_FEEDER_MULTIFORMAT 1
49#define FEEDMIXER_DECLARE(SIGN, BIT, ENDIAN) \
51feed_mixer_##SIGN##BIT##ENDIAN(uint8_t *src, uint8_t *dst, \
61 src -= PCM_##BIT##_BPS; \
62 dst -= PCM_##BIT##_BPS; \
63 count -= PCM_##BIT##_BPS; \
64 x = PCM_READ_##SIGN##BIT##_##ENDIAN(src); \
65 y = PCM_READ_##SIGN##BIT##_##ENDIAN(dst); \
66 z = INTPCM##BIT##_T(x) + y; \
67 x = PCM_CLAMP_##SIGN##BIT(z); \
68 _PCM_WRITE_##SIGN##BIT##_##ENDIAN(dst, x); \
69 } while (count != 0); \
72#if BYTE_ORDER == LITTLE_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
76#if BYTE_ORDER == BIG_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
80#ifdef SND_FEEDER_MULTIFORMAT
99#define FEEDMIXER_ENTRY(SIGN, BIT, ENDIAN) \
101 AFMT_##SIGN##BIT##_##ENDIAN, PCM_##BIT##_BPS, \
102 feed_mixer_##SIGN##BIT##ENDIAN \
107#if BYTE_ORDER == LITTLE_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
111#if BYTE_ORDER == BIG_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
115#ifdef SND_FEEDER_MULTIFORMAT
127 { AFMT_MU_LAW,
PCM_8_BPS, feed_mixer_U8NE },
128 { AFMT_A_LAW,
PCM_8_BPS, feed_mixer_U8NE }
131#define FEEDMIXER_TAB_SIZE ((int32_t) \
132 (sizeof(feed_mixer_info_tab) / \
133 sizeof(feed_mixer_info_tab[0])))
135#define FEEDMIXER_DATA(i, c) ((void *) \
136 ((uintptr_t)((((i) & 0x1f) << 7) | \
138#define FEEDMIXER_INFOIDX(d) ((uint32_t)((uintptr_t)(d) >> 7) & 0x1f)
139#define FEEDMIXER_CHANNELS(d) ((uint32_t)((uintptr_t)(d)) & 0x7f)
184 uint32_t cnt, maxfeed;
245 min(cnt, maxfeed),
b);
288 uint32_t cnt, mcnt, rcnt, sz;
333 if (info->
mix == NULL) {
339 if (passthrough == 0 &&
341 rcnt = SND_FXROUND(FEEDER_FEED(ch->
feeder, ch,
354 rcnt = SND_FXROUND(FEEDER_FEED(ch->
feeder, ch,
362 rcnt = SND_FXROUND(FEEDER_FEED(ch->
feeder, ch,
366 cnt = SND_FXROUND(FEEDER_FEED(ch->
feeder, ch,
375 info->
mix(tmp,
b, cnt);
u_int8_t sndbuf_zerodata(u_int32_t fmt)
int sndbuf_acquire(struct snd_dbuf *b, u_int8_t *from, unsigned int count)
Acquire buffer space to extend ready area.
void * sndbuf_getbuf(struct snd_dbuf *b)
unsigned int sndbuf_getalign(struct snd_dbuf *b)
unsigned int sndbuf_getfree(struct snd_dbuf *b)
unsigned int sndbuf_getready(struct snd_dbuf *b)
unsigned int sndbuf_getsize(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.
#define CHN_FOREACH(x, y, z)
FEEDER_DECLARE(feeder_mixer, NULL)
#define FEEDMIXER_DECLARE(SIGN, BIT, ENDIAN)
static int feed_mixer_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b, uint32_t count, void *source)
#define FEEDMIXER_INFOIDX(d)
static int feed_mixer_init(struct pcm_feeder *f)
#define FEEDMIXER_CHANNELS(d)
SND_DECLARE_FILE("$FreeBSD$")
#define FEEDMIXER_DATA(i, c)
static int feed_mixer_set(struct pcm_feeder *f, int what, int value)
static struct feed_mixer_info feed_mixer_info_tab[]
static kobj_method_t feeder_mixer_methods[]
#define FEEDMIXER_ENTRY(SIGN, BIT, ENDIAN)
#define FEEDMIXER_TAB_SIZE
void(* feed_mixer_t)(uint8_t *, uint8_t *, uint32_t)
static __inline int feed_mixer_rec(struct pcm_channel *c)
static struct pcm_feederdesc feeder_mixer_desc[]
struct pcm_channel::@27 children
struct pcm_channel::@27::@29 busy
struct snd_dbuf * bufhard
struct snd_dbuf * bufsoft
struct pcm_feeder * feeder
struct pcm_feeder * source
struct pcm_feederdesc * desc
int vchan_sync(struct pcm_channel *c)
#define VCHAN_SYNC_REQUIRED(c)