Lines Matching +full:current +full:- +full:mode
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2008-2009 Ariff Abdullah <ariff@FreeBSD.org>
50 struct feeder_chain_state current; /* current state */ member
54 int mode; /* chain mode */ member
82 /* 'Lean' mode, signed 16 or 32 bit native endian. */
132 "feeder chain mode "
146 desc = &(cdesc->desc); in feeder_build_format()
147 desc->type = FEEDER_FORMAT; in feeder_build_format()
148 desc->in = 0; in feeder_build_format()
149 desc->out = 0; in feeder_build_format()
150 desc->flags = 0; in feeder_build_format()
154 device_printf(c->dev, in feeder_build_format()
159 desc->in = cdesc->current.afmt; in feeder_build_format()
160 desc->out = cdesc->target.afmt; in feeder_build_format()
164 device_printf(c->dev, in feeder_build_format()
169 c->feederflags |= 1 << FEEDER_FORMAT; in feeder_build_format()
171 cdesc->current.afmt = cdesc->target.afmt; in feeder_build_format()
186 if (cdesc->afmt_ne == 0 || in feeder_build_formatne()
187 AFMT_ENCODING(cdesc->current.afmt) == cdesc->afmt_ne) in feeder_build_formatne()
190 otarget = cdesc->target; in feeder_build_formatne()
191 cdesc->target = cdesc->current; in feeder_build_formatne()
192 cdesc->target.afmt = SND_FORMAT(cdesc->afmt_ne, in feeder_build_formatne()
193 cdesc->current.matrix->channels, cdesc->current.matrix->ext); in feeder_build_formatne()
199 cdesc->target = otarget; in feeder_build_formatne()
219 desc = &(cdesc->desc); in feeder_build_rate()
220 desc->type = FEEDER_RATE; in feeder_build_rate()
221 desc->in = 0; in feeder_build_rate()
222 desc->out = 0; in feeder_build_rate()
223 desc->flags = 0; in feeder_build_rate()
227 device_printf(c->dev, in feeder_build_rate()
232 desc->in = cdesc->current.afmt; in feeder_build_rate()
233 desc->out = desc->in; in feeder_build_rate()
237 device_printf(c->dev, in feeder_build_rate()
242 f = c->feeder; in feeder_build_rate()
245 * If in 'dummy' mode (possibly due to passthrough mode), set the in feeder_build_rate()
252 if (cdesc->dummy != 0) { in feeder_build_rate()
255 device_printf(c->dev, in feeder_build_rate()
261 ret = FEEDER_SET(f, FEEDRATE_SRC, cdesc->current.rate); in feeder_build_rate()
263 device_printf(c->dev, in feeder_build_rate()
268 ret = FEEDER_SET(f, FEEDRATE_DST, cdesc->target.rate); in feeder_build_rate()
270 device_printf(c->dev, in feeder_build_rate()
275 c->feederflags |= 1 << FEEDER_RATE; in feeder_build_rate()
277 cdesc->current.rate = cdesc->target.rate; in feeder_build_rate()
297 desc = &(cdesc->desc); in feeder_build_matrix()
298 desc->type = FEEDER_MATRIX; in feeder_build_matrix()
299 desc->in = 0; in feeder_build_matrix()
300 desc->out = 0; in feeder_build_matrix()
301 desc->flags = 0; in feeder_build_matrix()
305 device_printf(c->dev, in feeder_build_matrix()
310 desc->in = cdesc->current.afmt; in feeder_build_matrix()
311 desc->out = SND_FORMAT(cdesc->current.afmt, in feeder_build_matrix()
312 cdesc->target.matrix->channels, cdesc->target.matrix->ext); in feeder_build_matrix()
316 device_printf(c->dev, in feeder_build_matrix()
321 f = c->feeder; in feeder_build_matrix()
322 ret = feeder_matrix_setup(f, cdesc->current.matrix, in feeder_build_matrix()
323 cdesc->target.matrix); in feeder_build_matrix()
325 device_printf(c->dev, in feeder_build_matrix()
330 c->feederflags |= 1 << FEEDER_MATRIX; in feeder_build_matrix()
332 cdesc->current.afmt = desc->out; in feeder_build_matrix()
333 cdesc->current.matrix = cdesc->target.matrix; in feeder_build_matrix()
334 cdesc->use_matrix = 0; in feeder_build_matrix()
354 desc = &(cdesc->desc); in feeder_build_volume()
355 desc->type = FEEDER_VOLUME; in feeder_build_volume()
356 desc->in = 0; in feeder_build_volume()
357 desc->out = 0; in feeder_build_volume()
358 desc->flags = 0; in feeder_build_volume()
362 device_printf(c->dev, in feeder_build_volume()
367 desc->in = cdesc->current.afmt; in feeder_build_volume()
368 desc->out = desc->in; in feeder_build_volume()
372 device_printf(c->dev, in feeder_build_volume()
377 f = c->feeder; in feeder_build_volume()
380 * If in 'dummy' mode (possibly due to passthrough mode), set BYPASS in feeder_build_volume()
381 * mode since listener won't be hearing anything. Theoretically we can in feeder_build_volume()
384 if (cdesc->dummy != 0) { in feeder_build_volume()
387 device_printf(c->dev, in feeder_build_volume()
393 ret = feeder_volume_apply_matrix(f, cdesc->current.matrix); in feeder_build_volume()
395 device_printf(c->dev, in feeder_build_volume()
400 c->feederflags |= 1 << FEEDER_VOLUME; in feeder_build_volume()
402 cdesc->use_volume = 0; in feeder_build_volume()
422 desc = &(cdesc->desc); in feeder_build_eq()
423 desc->type = FEEDER_EQ; in feeder_build_eq()
424 desc->in = 0; in feeder_build_eq()
425 desc->out = 0; in feeder_build_eq()
426 desc->flags = 0; in feeder_build_eq()
430 device_printf(c->dev, in feeder_build_eq()
435 desc->in = cdesc->current.afmt; in feeder_build_eq()
436 desc->out = desc->in; in feeder_build_eq()
440 device_printf(c->dev, in feeder_build_eq()
445 f = c->feeder; in feeder_build_eq()
447 ret = FEEDER_SET(f, FEEDEQ_RATE, cdesc->current.rate); in feeder_build_eq()
449 device_printf(c->dev, in feeder_build_eq()
454 c->feederflags |= 1 << FEEDER_EQ; in feeder_build_eq()
456 cdesc->use_eq = 0; in feeder_build_eq()
472 device_printf(c->dev, in feeder_build_root()
479 device_printf(c->dev, in feeder_build_root()
484 c->feederflags |= 1 << FEEDER_ROOT; in feeder_build_root()
486 c->feeder->desc->in = cdesc->current.afmt; in feeder_build_root()
487 c->feeder->desc->out = cdesc->current.afmt; in feeder_build_root()
502 desc = &(cdesc->desc); in feeder_build_mixer()
503 desc->type = FEEDER_MIXER; in feeder_build_mixer()
504 desc->in = 0; in feeder_build_mixer()
505 desc->out = 0; in feeder_build_mixer()
506 desc->flags = 0; in feeder_build_mixer()
510 device_printf(c->dev, in feeder_build_mixer()
515 desc->in = cdesc->current.afmt; in feeder_build_mixer()
516 desc->out = desc->in; in feeder_build_mixer()
520 device_printf(c->dev, in feeder_build_mixer()
525 c->feederflags |= 1 << FEEDER_MIXER; in feeder_build_mixer()
531 #define FEEDER_BW(c, t) ((c)->t.matrix->channels * (c)->t.rate)
533 #define FEEDRATE_UP(c) ((c)->target.rate > (c)->current.rate)
534 #define FEEDRATE_DOWN(c) ((c)->target.rate < (c)->current.rate)
537 #define FEEDMATRIX_UP(c) ((c)->target.matrix->channels > \
538 (c)->current.matrix->channels)
539 #define FEEDMATRIX_DOWN(c) ((c)->target.matrix->channels < \
540 (c)->current.matrix->channels)
542 FEEDMATRIX_DOWN(c) || (c)->use_matrix != 0)
544 #define FEEDFORMAT_REQUIRED(c) (AFMT_ENCODING((c)->current.afmt) != \
545 AFMT_ENCODING((c)->target.afmt))
547 #define FEEDVOLUME_REQUIRED(c) ((c)->use_volume != 0)
549 #define FEEDEQ_VALIDRATE(c, t) (feeder_eq_validrate((c)->t.rate) != 0)
550 #define FEEDEQ_ECONOMY(c) (FEEDER_BW(c, current) < FEEDER_BW(c, target))
551 #define FEEDEQ_REQUIRED(c) ((c)->use_eq != 0 && \
552 FEEDEQ_VALIDRATE(c, current))
555 ((c)->afmt_ne != AFMT_S32_NE && \
556 (((c)->mode == FEEDER_CHAIN_16 && \
557 AFMT_ENCODING((c)->current.afmt) != AFMT_S16_NE) || \
558 ((c)->mode == FEEDER_CHAIN_32 && \
559 AFMT_ENCODING((c)->current.afmt) != AFMT_S32_NE) || \
560 (c)->mode == FEEDER_CHAIN_FULLMULTI || \
561 ((c)->mode == FEEDER_CHAIN_MULTI && \
562 ((c)->current.afmt & AFMT_8BIT)) || \
563 ((c)->mode == FEEDER_CHAIN_LEAN && \
564 !((c)->current.afmt & (AFMT_S16_NE | AFMT_S32_NE)))))
573 m->id = id; in feeder_default_matrix()
574 m->channels = AFMT_CHANNEL(fmt); in feeder_default_matrix()
575 m->ext = AFMT_EXTCHANNEL(fmt); in feeder_default_matrix()
577 m->offset[x] = -1; in feeder_default_matrix()
595 KASSERT(c->feeder == NULL, ("feeder chain not empty")); in feeder_chain()
616 cdesc.mode = feeder_chain_mode; in feeder_chain()
619 #define VCHAN_PASSTHROUGH(c) (((c)->flags & (CHN_F_VIRTUAL | \ in feeder_chain()
625 hwfmt = c->parentchannel->format; in feeder_chain()
628 if (caps == NULL || caps->fmtlist == NULL) { in feeder_chain()
629 device_printf(c->dev, in feeder_chain()
634 if ((c->format & AFMT_PASSTHROUGH) && in feeder_chain()
635 !snd_fmtvalid(c->format, caps->fmtlist)) in feeder_chain()
638 hwfmt = snd_fmtbest(c->format, caps->fmtlist); in feeder_chain()
639 if (hwfmt == 0 || !snd_fmtvalid(hwfmt, caps->fmtlist)) { in feeder_chain()
640 device_printf(c->dev, in feeder_chain()
645 for (i = 0; caps->fmtlist[i] != 0; i++) in feeder_chain()
646 printf("0x%08x\n", caps->fmtlist[i]); in feeder_chain()
647 printf("Req: 0x%08x\n", c->format); in feeder_chain()
657 hwmatrix = CHANNEL_GETMATRIX(c->methods, c->devinfo, hwfmt); in feeder_chain()
660 hwmatrix = &c->matrix_scratch; in feeder_chain()
665 hwfmt = SND_FORMAT(hwfmt, hwmatrix->channels, hwmatrix->ext); in feeder_chain()
668 softfmt = c->format; in feeder_chain()
669 softmatrix = &c->matrix; in feeder_chain()
670 if (softmatrix->channels != AFMT_CHANNEL(softfmt) || in feeder_chain()
671 softmatrix->ext != AFMT_EXTCHANNEL(softfmt)) { in feeder_chain()
675 softmatrix = &c->matrix; in feeder_chain()
679 c->matrix = *softmatrix; in feeder_chain()
680 c->matrix.id = SND_CHN_MATRIX_PCMCHANNEL; in feeder_chain()
683 softfmt = SND_FORMAT(softfmt, softmatrix->channels, softmatrix->ext); in feeder_chain()
684 if (softfmt != c->format) in feeder_chain()
685 device_printf(c->dev, in feeder_chain()
686 "%s(): WARNING: %s Soft format 0x%08x -> 0x%08x\n", in feeder_chain()
687 __func__, CHN_DIRSTR(c), c->format, softfmt); in feeder_chain()
692 if (c->direction == PCMDIR_PLAY) { in feeder_chain()
695 cdesc.origin.rate = c->speed; in feeder_chain()
698 cdesc.target.rate = sndbuf_getspd(c->bufhard); in feeder_chain()
702 cdesc.origin.rate = sndbuf_getspd(c->bufhard); in feeder_chain()
705 cdesc.target.rate = c->speed; in feeder_chain()
708 d = c->parentsnddev; in feeder_chain()
711 * If channel is in bitperfect or passthrough mode, make it appear in feeder_chain()
715 if (CHN_BITPERFECT(c) || (c->format & AFMT_PASSTHROUGH)) { in feeder_chain()
716 if (c->direction == PCMDIR_PLAY) in feeder_chain()
720 c->format = cdesc.target.afmt; in feeder_chain()
721 c->speed = cdesc.target.rate; in feeder_chain()
728 device_printf(c->dev, in feeder_chain()
739 (((d->flags & SD_F_VPC) && !(c->flags & CHN_F_HAS_VCHAN)) || in feeder_chain()
740 (!(d->flags & SD_F_VPC) && (d->flags & SD_F_SOFTPCMVOL) && in feeder_chain()
741 !(c->flags & CHN_F_VIRTUAL)))) in feeder_chain()
750 c->direction == PCMDIR_PLAY && (d->flags & SD_F_EQ) && in feeder_chain()
751 (((d->flags & SD_F_EQ_PC) && in feeder_chain()
752 !(c->flags & CHN_F_HAS_VCHAN)) || in feeder_chain()
753 (!(d->flags & SD_F_EQ_PC) && !(c->flags & CHN_F_VIRTUAL)))) in feeder_chain()
760 feeder_chain_formats[cdesc.mode]) : in feeder_chain()
762 feeder_chain_formats[cdesc.mode]); in feeder_chain()
764 device_printf(c->dev, in feeder_chain()
775 cdesc.current = cdesc.origin; in feeder_chain()
779 c->feederflags = 0; in feeder_chain()
787 if (!(c->flags & CHN_F_HAS_VCHAN) || c->direction == PCMDIR_REC) in feeder_chain()
789 else if (c->direction == PCMDIR_PLAY && (c->flags & CHN_F_HAS_VCHAN)) in feeder_chain()
796 * conversion process, with following constraints:- in feeder_chain()
801 * PASSTHROUGH mode. in feeder_chain()
858 if (c->direction == PCMDIR_REC && (c->flags & CHN_F_HAS_VCHAN)) in feeder_chain()
861 sndbuf_setfmt(c->bufsoft, c->format); in feeder_chain()
862 sndbuf_setspd(c->bufsoft, c->speed); in feeder_chain()
864 sndbuf_setfmt(c->bufhard, hwfmt); in feeder_chain()