47#ifdef HAVE_KERNEL_OPTION_HEADERS
55#include "snd_fxdiv_gen.h"
60#define FEEDMATRIX_RESERVOIR (SND_CHN_MAX * PCM_32_BPS)
62#define SND_CHN_T_EOF 0x00e0fe0f
63#define SND_CHN_T_NULL 0x0e0e0e0e
75#ifdef FEEDMATRIX_GENERIC
115#define FEEDMATRIX_CLIP_CHECK(...)
117#define FEEDMATRIX_CLIP_CHECK(v, BIT) do { \
118 if ((v) < PCM_S##BIT##_MIN || (v) > PCM_S##BIT##_MAX) \
119 errx(1, "\n\n%s(): Sample clipping: %jd\n", \
120 __func__, (intmax_t)(v)); \
124#define FEEDMATRIX_DECLARE(SIGN, BIT, ENDIAN) \
126feed_matrix_##SIGN##BIT##ENDIAN(struct feed_matrix_info *info, \
127 uint8_t *src, uint8_t *dst, uint32_t count) \
134 for (i = 0; info->matrix[i].chn[0] != SND_CHN_T_EOF; \
136 if (info->matrix[i].chn[0] == SND_CHN_T_NULL) { \
137 _PCM_WRITE_##SIGN##BIT##_##ENDIAN(dst, \
139 dst += PCM_##BIT##_BPS; \
141 } else if (info->matrix[i].chn[1] == \
143 v = _PCM_READ_##SIGN##BIT##_##ENDIAN( \
144 src + info->matrix[i].chn[0]); \
145 _PCM_WRITE_##SIGN##BIT##_##ENDIAN(dst, \
147 dst += PCM_##BIT##_BPS; \
153 info->matrix[i].chn[j] != SND_CHN_T_EOF; \
155 v = _PCM_READ_##SIGN##BIT##_##ENDIAN( \
156 src + info->matrix[i].chn[j]); \
160 accum = (accum * info->matrix[i].mul) >> \
161 info->matrix[i].shift; \
163 FEEDMATRIX_CLIP_CHECK(accum, BIT); \
165 v = (accum > PCM_S##BIT##_MAX) ? \
167 ((accum < PCM_S##BIT##_MIN) ? \
170 _PCM_WRITE_##SIGN##BIT##_##ENDIAN(dst, v); \
171 dst += PCM_##BIT##_BPS; \
173 src += info->ialign; \
174 } while (--count != 0); \
177#if BYTE_ORDER == LITTLE_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
181#if BYTE_ORDER == BIG_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
185#ifdef SND_FEEDER_MULTIFORMAT
198#define FEEDMATRIX_ENTRY(SIGN, BIT, ENDIAN) \
200 AFMT_##SIGN##BIT##_##ENDIAN, \
201 feed_matrix_##SIGN##BIT##ENDIAN \
208#if BYTE_ORDER == LITTLE_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
212#if BYTE_ORDER == BIG_ENDIAN || defined(SND_FEEDER_MULTIFORMAT)
216#ifdef SND_FEEDER_MULTIFORMAT
235 for (i = 0; i < (
sizeof(info->
matrix) /
sizeof(info->
matrix[0])); i++) {
246#ifdef FEEDMATRIX_GENERIC
249 uint8_t *
src, uint8_t *dst, uint32_t
count)
289 }
while (--
count != 0);
297 uint32_t i, j, ch, in_mask, merge_mask;
300 if (info == NULL || m_in == NULL || m_out == NULL ||
330 in_mask = m_in->
mask;
335 merge_mask = m_out->
map[ch].
members & in_mask;
336 if (merge_mask == 0) {
344 if (merge_mask & (1 << i)) {
345 if (m_in->
offset[i] >= 0 &&
357#define FEEDMATRIX_ATTN_SHIFT 16
367 while ((
mul & 1) == 0 && shift > 0) {
377 fprintf(stderr,
"Total: %d\n", ch);
380 fprintf(stderr,
"%d: [", i);
383 fprintf(stderr,
", ");
384 fprintf(stderr,
"%d",
388 fprintf(stderr,
"] attn: (x * %d) >> %d\n",
407 info = malloc(
sizeof(*info), M_DEVBUF, M_NOWAIT | M_ZERO);
418 for (i = 0; info->
apply == NULL &&
424 if (info->
apply == NULL) {
425#ifdef FEEDMATRIX_GENERIC
428 if (info->rd == NULL || info->wr == NULL) {
429 free(info, M_DEVBUF);
432 info->
apply = feed_matrix_apply_generic;
434 free(info, M_DEVBUF);
444 free(info, M_DEVBUF);
460 free(info, M_DEVBUF);
521 }
while (
count != 0);
684 for (i = 0; i < (
sizeof(m_in->
map) /
sizeof(m_in->
map[0])); i++) {
717#define SND_CHN_OSS_VALIDMASK \
718 (SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
719 SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF | \
720 SND_CHN_T_MASK_SL | SND_CHN_T_MASK_SR | \
721 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR)
723#define SND_CHN_OSS_MAX 8
724#define SND_CHN_OSS_BEGIN CHID_L
725#define SND_CHN_OSS_END CHID_RR
743 unsigned long long *
map)
745 unsigned long long tmpmap;
752 tmpmap = 0x0000000000000000ULL;
773 unsigned long long *
map)
791 ch = (*
map >> (i * 4)) & 0xf;
805 if (!(chmask &
m->
mask))
808 if (chmask & tmp.
mask)
struct pcmchan_matrix * m
int feeder_matrix_setup(struct pcm_feeder *f, struct pcmchan_matrix *m_in, struct pcmchan_matrix *m_out)
int feeder_matrix_compare(struct pcmchan_matrix *m_in, struct pcmchan_matrix *m_out)
#define FEEDMATRIX_DECLARE(SIGN, BIT, ENDIAN)
static int oss_to_snd_chn[SND_CHN_OSS_END+1]
static int feeder_matrix_default_ids[9]
static void feed_matrix_reset(struct feed_matrix_info *info)
static int feed_matrix_init(struct pcm_feeder *f)
static struct pcmchan_matrix feeder_matrix_maps[SND_CHN_MATRIX_MAX]
static int feed_matrix_free(struct pcm_feeder *f)
uint32_t feeder_matrix_default_format(uint32_t format)
static int snd_chn_to_oss[SND_CHN_T_MAX]
static const struct @44 feed_matrix_tab[]
#define SND_CHN_OSS_BEGIN
struct pcmchan_matrix * feeder_matrix_id_map(int id)
SND_DECLARE_FILE("$FreeBSD$")
int feeder_matrix_oss_set_channel_order(struct pcmchan_matrix *m, unsigned long long *map)
#define FEEDMATRIX_ATTN_SHIFT
FEEDER_DECLARE(feeder_matrix, NULL)
struct pcmchan_matrix * feeder_matrix_format_map(uint32_t format)
#define FEEDMATRIX_CLIP_CHECK(...)
void(* feed_matrix_t)(struct feed_matrix_info *, uint8_t *, uint8_t *, uint32_t)
static int feed_matrix_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b, uint32_t count, void *source)
int feeder_matrix_format_id(uint32_t format)
#define FEEDMATRIX_RESERVOIR
int feeder_matrix_default_id(uint32_t ch)
#define FEEDMATRIX_ENTRY(SIGN, BIT, ENDIAN)
int feeder_matrix_oss_get_channel_order(struct pcmchan_matrix *m, unsigned long long *map)
struct pcmchan_matrix * feeder_matrix_default_channel_map(uint32_t ch)
#define SND_CHN_OSS_VALIDMASK
static struct pcm_feederdesc feeder_matrix_desc[]
static int feed_matrix_setup(struct feed_matrix_info *info, struct pcmchan_matrix *m_in, struct pcmchan_matrix *m_out)
static kobj_method_t feeder_matrix_methods[]
intpcm_t intpcm_read_t(uint8_t *)
void intpcm_write_t(uint8_t *, intpcm_t)
#define SND_CHN_MATRIX_2_1
#define SND_CHN_T_MASK_FL
#define SND_CHN_MATRIX_6_1
#define SND_CHN_T_MASK_LF
#define SND_CHN_MATRIX_7_0
#define SND_CHN_MATRIX_BEGIN
#define SND_CHN_MATRIX_4_1
#define SND_CHN_MATRIX_7_1
#define SND_CHN_MATRIX_END
#define SND_CHN_MATRIX_5_0
#define SND_CHN_MATRIX_MAX
#define SND_CHN_T_MASK_FR
#define SND_CHN_MATRIX_1_0
#define SND_CHN_MATRIX_3_0
#define SND_CHN_MATRIX_2_0
#define SND_CHN_MATRIX_4_0
#define SND_CHN_MATRIX_6_0
#define SND_CHN_MATRIX_UNKNOWN
#define SND_CHN_MATRIX_3_1
#define SND_CHN_MATRIX_5_1
#define SND_CHN_T_MASK_FC
#define SND_CHN_MATRIX_MAP_4_1
#define SND_CHN_MATRIX_MAP_4_0
#define SND_CHN_MATRIX_MAP_7_1
#define SND_CHN_MATRIX_MAP_2_0
#define SND_CHN_MATRIX_MAP_3_0
#define SND_CHN_MATRIX_MAP_2_1
#define SND_CHN_MATRIX_MAP_1_0
#define SND_CHN_MATRIX_MAP_6_0
#define SND_CHN_MATRIX_MAP_6_1
#define SND_CHN_MATRIX_MAP_7_0
#define SND_CHN_MATRIX_MAP_3_1
#define SND_CHN_MATRIX_MAP_5_1
#define SND_CHN_MATRIX_MAP_5_0
#define SND_FORMAT(f, c, e)
#define AFMT_EXTCHANNEL(v)
uint8_t reservoir[FEEDMATRIX_RESERVOIR]
struct feed_matrix_info::@45 matrix[SND_CHN_T_MAX+1]
struct pcm_feeder * source
struct pcm_feederdesc * desc
struct pcmchan_matrix::@26 map[SND_CHN_T_MAX+1]
int8_t offset[SND_CHN_T_MAX]