32#ifdef HAVE_KERNEL_OPTION_HEADERS
40#include "snd_fxdiv_gen.h"
45typedef void (*
feed_volume_t)(
int *,
int *, uint32_t, uint8_t *, uint32_t);
47#define FEEDVOLUME_CALC8(s, v) (SND_VOL_CALC_SAMPLE((intpcm_t) \
49#define FEEDVOLUME_CALC16(s, v) SND_VOL_CALC_SAMPLE((intpcm_t)(s), v)
50#define FEEDVOLUME_CALC24(s, v) SND_VOL_CALC_SAMPLE((intpcm64_t)(s), v)
51#define FEEDVOLUME_CALC32(s, v) SND_VOL_CALC_SAMPLE((intpcm64_t)(s), v)
53#define FEEDVOLUME_DECLARE(SIGN, BIT, ENDIAN) \
55feed_volume_##SIGN##BIT##ENDIAN(int *vol, int *matrix, \
56 uint32_t channels, uint8_t *dst, uint32_t count) \
62 dst += count * PCM_##BIT##_BPS * channels; \
66 dst -= PCM_##BIT##_BPS; \
68 x = PCM_READ_##SIGN##BIT##_##ENDIAN(dst); \
69 v = FEEDVOLUME_CALC##BIT(x, vol[matrix[i]]); \
70 x = PCM_CLAMP_##SIGN##BIT(v); \
71 _PCM_WRITE_##SIGN##BIT##_##ENDIAN(dst, x); \
73 } while (--count != 0); \
76#if BYTE_ORDER == LITTLE_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
80#if BYTE_ORDER == BIG_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
84#ifdef SND_FEEDER_MULTIFORMAT
105#define FEEDVOLUME_ENTRY(SIGN, BIT, ENDIAN) \
107 AFMT_##SIGN##BIT##_##ENDIAN, \
108 feed_volume_##SIGN##BIT##ENDIAN \
115#if BYTE_ORDER == LITTLE_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
119#if BYTE_ORDER == BIG_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
123#ifdef SND_FEEDER_MULTIFORMAT
137#define FEEDVOLUME_TAB_SIZE ((int32_t) \
138 (sizeof(feed_volume_info_tab) / \
139 sizeof(feed_volume_info_tab[0])))
156 info = malloc(
sizeof(*info), M_DEVBUF,
170 free(info, M_DEVBUF);
176 free(info, M_DEVBUF);
192 free(info, M_DEVBUF);
279 temp_vol[j] = muted[j] ? 0 : vol[j];
299 }
while (
count != 0);
342 for (i = 0; i < (
sizeof(info->
matrix) /
sizeof(info->
matrix[0])); i++) {
struct pcmchan_matrix * m
struct pcmchan_matrix * feeder_matrix_default_channel_map(uint32_t)
static struct pcm_feederdesc feeder_volume_desc[]
static kobj_method_t feeder_volume_methods[]
#define FEEDVOLUME_DECLARE(SIGN, BIT, ENDIAN)
static int feed_volume_init(struct pcm_feeder *f)
#define FEEDVOLUME_ENTRY(SIGN, BIT, ENDIAN)
SND_DECLARE_FILE("$FreeBSD$")
static int feed_volume_free(struct pcm_feeder *f)
static int feed_volume_set(struct pcm_feeder *f, int what, int value)
void(* feed_volume_t)(int *, int *, uint32_t, uint8_t *, uint32_t)
static int feed_volume_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b, uint32_t count, void *source)
FEEDER_DECLARE(feeder_volume, NULL)
static const struct @48 feed_volume_info_tab[]
#define FEEDVOLUME_TAB_SIZE
int feeder_volume_apply_matrix(struct pcm_feeder *f, struct pcmchan_matrix *m)
#define SND_CHN_T_VOL_MAX
int8_t muted[SND_VOL_C_MAX][SND_CHN_T_VOL_MAX]
int16_t volume[SND_VOL_C_MAX][SND_CHN_T_VOL_MAX]
struct pcm_feeder * source
struct pcm_feederdesc * desc
struct pcmchan_matrix::@26 map[SND_CHN_T_MAX+1]