Lines Matching +full:reserved +full:- +full:channels

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2008-2009 Ariff Abdullah <ariff@FreeBSD.org>
5 * All rights reserved.
6 * Copyright (c) 2024-2025 The FreeBSD Foundation
34 * feeder_matrix: Generic any-to-any channel matrixing. Probably not the
37 * possible non-standard way of multichannel interleaving
126 for (i = 0; info->matrix[i].chn[0] != SND_CHN_T_EOF; i++) { in feed_matrix_apply()
127 if (info->matrix[i].chn[0] == SND_CHN_T_NULL) { in feed_matrix_apply()
129 dst += info->bps; in feed_matrix_apply()
131 } else if (info->matrix[i].chn[1] == SND_CHN_T_EOF) { in feed_matrix_apply()
133 info->matrix[i].chn[0], fmt); in feed_matrix_apply()
135 dst += info->bps; in feed_matrix_apply()
140 for (j = 0; info->matrix[i].chn[j] != SND_CHN_T_EOF; in feed_matrix_apply()
143 info->matrix[i].chn[j], fmt); in feed_matrix_apply()
147 accum = (accum * info->matrix[i].mul) >> in feed_matrix_apply()
148 info->matrix[i].shift; in feed_matrix_apply()
154 dst += info->bps; in feed_matrix_apply()
156 src += info->ialign; in feed_matrix_apply()
157 } while (--count != 0); in feed_matrix_apply()
165 for (i = 0; i < nitems(info->matrix); i++) { in feed_matrix_reset()
167 j < (sizeof(info->matrix[i].chn) / in feed_matrix_reset()
168 sizeof(info->matrix[i].chn[0])); j++) { in feed_matrix_reset()
169 info->matrix[i].chn[j] = SND_CHN_T_EOF; in feed_matrix_reset()
171 info->matrix[i].mul = 1; in feed_matrix_reset()
172 info->matrix[i].shift = 0; in feed_matrix_reset()
184 AFMT_CHANNEL(info->in) != m_in->channels || in feed_matrix_setup()
185 AFMT_CHANNEL(info->out) != m_out->channels || in feed_matrix_setup()
186 m_in->channels < SND_CHN_MIN || m_in->channels > SND_CHN_MAX || in feed_matrix_setup()
187 m_out->channels < SND_CHN_MIN || m_out->channels > SND_CHN_MAX) in feed_matrix_setup()
196 if (m_in->id == m_out->id && !(m_in->id < SND_CHN_MATRIX_BEGIN || in feed_matrix_setup()
197 m_in->id > SND_CHN_MATRIX_END)) in feed_matrix_setup()
205 if (m_in->id == SND_CHN_MATRIX_1_0) { in feed_matrix_setup()
206 if (m_out->id == SND_CHN_MATRIX_1_0) in feed_matrix_setup()
208 else if (m_out->mask & SND_CHN_T_MASK_FC) in feed_matrix_setup()
213 in_mask = m_in->mask; in feed_matrix_setup()
217 m_out->map[ch].type != SND_CHN_T_MAX; ch += SND_CHN_T_STEP) { in feed_matrix_setup()
218 merge_mask = m_out->map[ch].members & in_mask; in feed_matrix_setup()
220 info->matrix[ch].chn[0] = SND_CHN_T_NULL; in feed_matrix_setup()
228 if (m_in->offset[i] >= 0 && in feed_matrix_setup()
229 m_in->offset[i] < (int)m_in->channels) in feed_matrix_setup()
230 info->matrix[ch].chn[j++] = in feed_matrix_setup()
231 m_in->offset[i] * info->bps; in feed_matrix_setup()
233 info->matrix[ch].chn[j++] = in feed_matrix_setup()
245 * multiple channels, apply a slight attenuation to in feed_matrix_setup()
248 mul = (1 << (FEEDMATRIX_ATTN_SHIFT - 1)) + 143 - j; in feed_matrix_setup()
252 shift--; in feed_matrix_setup()
254 info->matrix[ch].mul = mul; in feed_matrix_setup()
255 info->matrix[ch].shift = shift; in feed_matrix_setup()
262 for (i = 0; info->matrix[i].chn[0] != SND_CHN_T_EOF; i++) { in feed_matrix_setup()
264 for (j = 0; info->matrix[i].chn[j] != SND_CHN_T_EOF; j++) { in feed_matrix_setup()
268 (info->matrix[i].chn[j] == SND_CHN_T_NULL) ? in feed_matrix_setup()
269 0xffffffff : info->matrix[i].chn[j] / info->bps); in feed_matrix_setup()
272 info->matrix[i].mul, info->matrix[i].shift); in feed_matrix_setup()
286 if (AFMT_ENCODING(f->desc->in) != AFMT_ENCODING(f->desc->out)) in feed_matrix_init()
293 info->in = f->desc->in; in feed_matrix_init()
294 info->out = f->desc->out; in feed_matrix_init()
295 info->fmt = AFMT_ENCODING(info->in); in feed_matrix_init()
296 info->bps = AFMT_BPS(info->in); in feed_matrix_init()
297 info->ialign = AFMT_ALIGN(info->in); in feed_matrix_init()
298 info->oalign = AFMT_ALIGN(info->out); in feed_matrix_init()
300 m_in = feeder_matrix_format_map(info->in); in feed_matrix_init()
301 m_out = feeder_matrix_format_map(info->out); in feed_matrix_init()
309 f->data = info; in feed_matrix_init()
319 info = f->data; in feed_matrix_free()
323 f->data = NULL; in feed_matrix_free()
336 info = f->data; in feed_matrix_feed()
337 if (info->matrix[0].chn[0] == SND_CHN_T_EOF) in feed_matrix_feed()
338 return (FEEDER_FEED(f->source, c, b, count, source)); in feed_matrix_feed()
341 count = SND_FXROUND(count, info->oalign); in feed_matrix_feed()
342 inmax = info->ialign + info->oalign; in feed_matrix_feed()
353 if (count < info->oalign) in feed_matrix_feed()
357 src = info->reservoir; in feed_matrix_feed()
358 j = info->ialign; in feed_matrix_feed()
360 if (info->ialign == info->oalign) in feed_matrix_feed()
361 j = count - info->oalign; in feed_matrix_feed()
362 else if (info->ialign > info->oalign) in feed_matrix_feed()
363 j = SND_FXROUND(count - info->oalign, in feed_matrix_feed()
364 info->ialign); in feed_matrix_feed()
366 j = (SND_FXDIV(count, info->oalign) - 1) * in feed_matrix_feed()
367 info->ialign; in feed_matrix_feed()
368 src = dst + count - j; in feed_matrix_feed()
371 j = SND_FXDIV(FEEDER_FEED(f->source, c, src, j, source), in feed_matrix_feed()
372 info->ialign); in feed_matrix_feed()
377 switch (info->fmt) { in feed_matrix_feed()
388 feed_matrix_apply(info, src, dst, j, info->fmt); in feed_matrix_feed()
392 j *= info->oalign; in feed_matrix_feed()
394 count -= j; in feed_matrix_feed()
398 return (dst - b); in feed_matrix_feed()
421 if (f == NULL || f->desc == NULL || f->desc->type != FEEDER_MATRIX || in feeder_matrix_setup()
422 f->data == NULL) in feeder_matrix_setup()
425 return (feed_matrix_setup(f->data, m_in, m_out)); in feeder_matrix_setup()
429 * feeder_matrix_default_id(): For a given number of channels, return
431 * 6.0 are simply 6 channels, but 5.1 is more
438 if (ch < feeder_matrix_maps[SND_CHN_MATRIX_BEGIN].channels || in feeder_matrix_default_id()
439 ch > feeder_matrix_maps[SND_CHN_MATRIX_END].channels) in feeder_matrix_default_id()
453 if (ch < feeder_matrix_maps[SND_CHN_MATRIX_BEGIN].channels || in feeder_matrix_default_channel_map()
454 ch > feeder_matrix_maps[SND_CHN_MATRIX_END].channels) in feeder_matrix_default_channel_map()
476 if (feeder_matrix_maps[i].channels == ch && in feeder_matrix_default_format()
486 return (SND_FORMAT(format, ch, m->ext)); in feeder_matrix_default_format()
502 if (feeder_matrix_maps[i].channels == ch && in feeder_matrix_format_id()
523 if (feeder_matrix_maps[i].channels == ch && in feeder_matrix_format_map()
555 if (m_in->channels != m_out->channels || m_in->ext != m_out->ext || in feeder_matrix_compare()
556 m_in->mask != m_out->mask) in feeder_matrix_compare()
559 for (i = 0; i < nitems(m_in->map); i++) { in feeder_matrix_compare()
560 if (m_in->map[i].type != m_out->map[i].type) in feeder_matrix_compare()
562 if (m_in->map[i].type == SND_CHN_T_MAX) in feeder_matrix_compare()
564 if (m_in->map[i].members != m_out->map[i].members) in feeder_matrix_compare()
567 if (m_in->offset[m_in->map[i].type] != in feeder_matrix_compare()
568 m_out->offset[m_out->map[i].type]) in feeder_matrix_compare()
623 if (m == NULL || map == NULL || (m->mask & ~SND_CHN_OSS_VALIDMASK) || in feeder_matrix_oss_get_channel_order()
624 m->channels > SND_CHN_OSS_MAX) in feeder_matrix_oss_get_channel_order()
629 for (i = 0; i < SND_CHN_OSS_MAX && m->map[i].type != SND_CHN_T_MAX; in feeder_matrix_oss_get_channel_order()
631 if ((1 << m->map[i].type) & ~SND_CHN_OSS_VALIDMASK) in feeder_matrix_oss_get_channel_order()
634 (unsigned long long)snd_chn_to_oss[m->map[i].type] << in feeder_matrix_oss_get_channel_order()
654 if (m == NULL || map == NULL || (m->mask & ~SND_CHN_OSS_VALIDMASK) || in feeder_matrix_oss_set_channel_order()
655 m->channels > SND_CHN_OSS_MAX || (*map & 0xffffffff00000000ULL)) in feeder_matrix_oss_set_channel_order()
659 tmp.channels = 0; in feeder_matrix_oss_set_channel_order()
662 memset(tmp.offset, -1, sizeof(tmp.offset)); in feeder_matrix_oss_set_channel_order()
668 if (cheof == 0 && m->map[i].type != SND_CHN_T_MAX) in feeder_matrix_oss_set_channel_order()
671 tmp.map[i] = m->map[i]; in feeder_matrix_oss_set_channel_order()
680 if (!(chmask & m->mask)) in feeder_matrix_oss_set_channel_order()
685 tmp.map[i] = m->map[m->offset[ch]]; in feeder_matrix_oss_set_channel_order()
690 tmp.channels++; in feeder_matrix_oss_set_channel_order()
695 if (tmp.channels != m->channels || tmp.ext != m->ext || in feeder_matrix_oss_set_channel_order()
696 tmp.mask != m->mask || in feeder_matrix_oss_set_channel_order()
697 tmp.map[m->channels].type != SND_CHN_T_MAX) in feeder_matrix_oss_set_channel_order()