diff --git a/sys/dev/sound/pcm/vchan.c b/sys/dev/sound/pcm/vchan.c --- a/sys/dev/sound/pcm/vchan.c +++ b/sys/dev/sound/pcm/vchan.c @@ -192,14 +192,14 @@ vchan_getcaps(kobj_t obj, void *data) { struct vchan_info *info; - struct pcm_channel *c; - uint32_t pformat, pspeed, pflags, i; + struct pcm_channel *c, *p; + uint32_t pformat, pflags, i; info = data; c = info->channel; - pformat = c->parentchannel->format; - pspeed = c->parentchannel->speed; - pflags = c->parentchannel->flags; + p = c->parentchannel; + pformat = p->format; + pflags = p->flags; CHN_LOCKASSERT(c); @@ -213,11 +213,6 @@ } info->caps.fmtlist[i] = pformat; } - if (c->format & AFMT_PASSTHROUGH) - info->caps.minspeed = c->speed; - else - info->caps.minspeed = pspeed; - info->caps.maxspeed = info->caps.minspeed; } else { info->caps.fmtlist = info->fmtlist + FMTLIST_OFFSET; if (pformat & AFMT_VCHAN) @@ -228,8 +223,18 @@ __func__, pformat); info->caps.fmtlist[0] = VCHAN_DEFAULT_FORMAT; } - info->caps.minspeed = pspeed; - info->caps.maxspeed = info->caps.minspeed; + } + if (feeder_rate_round || CHN_BITPERFECT(c) || + (c->format & AFMT_PASSTHROUGH)) { + CHN_UNLOCK(c); + CHN_LOCK(p); + info->caps.minspeed = chn_getcaps(p)->minspeed; + info->caps.maxspeed = chn_getcaps(p)->maxspeed; + CHN_UNLOCK(p); + CHN_LOCK(c); + } else { + info->caps.minspeed = feeder_rate_min; + info->caps.maxspeed = feeder_rate_max; } return (&info->caps);