Index: channel.c =================================================================== RCS file: /home/xorpc/u2/freebsd/src/sys/dev/sound/pcm/channel.c,v retrieving revision 1.88 diff -u -r1.88 channel.c --- channel.c 26 Feb 2003 14:38:19 -0000 1.88 +++ channel.c 17 Aug 2003 23:28:15 -0000 @@ -37,9 +37,8 @@ #define CANCHANGE(c) (!(c->flags & CHN_F_TRIGGERED)) -/* -#define DEB(x) x -*/ +#define DEB(x) /* x */ +#define DEBC(x) x static int chn_targetirqrate = 32; TUNABLE_INT("hw.snd.targetirqrate", &chn_targetirqrate); @@ -64,7 +63,9 @@ SYSCTL_INT(_hw_snd, OID_AUTO, report_soft_formats, CTLFLAG_RW, &report_soft_formats, 1, "report software-emulated formats"); -static int chn_buildfeeder(struct pcm_channel *c); +static int chn_buildfeeder(struct pcm_channel *c, + struct snd_dbuf* srcbuf, + struct snd_dbuf* dstbuf); static void chn_lockinit(struct pcm_channel *c) @@ -238,6 +239,40 @@ printf("chn_wrintr: chn_wrfeed returned %d\n", ret);) } +/** + * Attempt to get best quality pcm h/w format. + */ +static uint32_t +chn_best_hwfmt(struct pcm_channel *c, int stereo) +{ + const uint32_t *x, *caps; + uint32_t stereo_req = stereo ? AFMT_STEREO : 0; + uint32_t best_fmt = 0; + uint32_t best_score = 0; + + caps = chn_getcaps(c)->fmtlist; + for (x = caps; *x != 0; x++) { + uint32_t score = 0; + if ((*x & AFMT_STEREO) != stereo_req) + continue; + if (AFMT_16BIT & *x) { + score = 16; + } else if (AFMT_LAW & *x) { + score = 11; + } else if (AFMT_8BIT & *x) { + score = 8; + } else { + /* no 32bit formats as there are no feeders for them */ + } + if (score > best_score) { + best_fmt = *x; + best_score = score; + } + } + + return best_fmt ? best_fmt : *caps; +} + /* * user write routine - uiomove data into secondary buffer, trigger if necessary * if blocking, sleep, rinse and repeat. @@ -647,7 +682,6 @@ /* only do this on a record channel until feederbuilder works */ if (c->direction == PCMDIR_REC) RANGE(hwspd, chn_getcaps(c)->minspeed, chn_getcaps(c)->maxspeed); - c->speed = hwspd; if (r == 0) r = chn_setformat(c, fmt); @@ -720,6 +754,8 @@ if (ret) goto out; + sndbuf_setspd(b, DSP_DEFAULT_SPEED); + sndbuf_setspd(bs, DSP_DEFAULT_SPEED); out: if (ret) { @@ -787,118 +823,161 @@ struct pcm_feeder *f; struct snd_dbuf *b = c->bufhard; struct snd_dbuf *bs = c->bufsoft; - struct snd_dbuf *x; + struct snd_dbuf *src, *dst; int r, delta; CHN_LOCKASSERT(c); - DEB(printf("setspeed, channel %s\n", c->name)); - DEB(printf("want speed %d, ", speed)); + DEBC(printf("setspeed, channel %s\n", c->name)); + DEBC(printf("want speed %d, ", speed)); if (speed <= 0) return EINVAL; - if (CANCHANGE(c)) { - r = 0; - c->speed = speed; - sndbuf_setspd(bs, speed); - RANGE(speed, chn_getcaps(c)->minspeed, chn_getcaps(c)->maxspeed); - DEB(printf("try speed %d, ", speed)); - sndbuf_setspd(b, CHANNEL_SETSPEED(c->methods, c->devinfo, speed)); - DEB(printf("got speed %d\n", sndbuf_getspd(b))); - - delta = sndbuf_getspd(b) - sndbuf_getspd(bs); - if (delta < 0) - delta = -delta; - - c->feederflags &= ~(1 << FEEDER_RATE); - if (delta > 500) - c->feederflags |= 1 << FEEDER_RATE; - else - sndbuf_setspd(bs, sndbuf_getspd(b)); + if (CANCHANGE(c) == 0) + return EINVAL; - r = chn_buildfeeder(c); - DEB(printf("r = %d\n", r)); - if (r) - goto out; + if (c->direction == PCMDIR_REC) { + src = b; + dst = bs; + } else { + src = bs; + dst = b; + } - r = chn_setblocksize(c, 0, 0); - if (r) - goto out; + r = 0; + sndbuf_setspd(bs, speed); + RANGE(speed, chn_getcaps(c)->minspeed, chn_getcaps(c)->maxspeed); + DEBC(printf("try speed %d, ", speed)); + sndbuf_setspd(b, CHANNEL_SETSPEED(c->methods, c->devinfo, speed)); + DEBC(printf("got speed %d\n", sndbuf_getspd(b))); + + delta = sndbuf_getspd(b) - sndbuf_getspd(bs); + if (delta < 0) + delta = -delta; + + c->feederflags &= ~(1 << FEEDER_RATE); + if (delta > 500) + c->feederflags |= 1 << FEEDER_RATE; + else + sndbuf_setspd(bs, sndbuf_getspd(b)); - if (!(c->feederflags & (1 << FEEDER_RATE))) - goto out; + r = chn_buildfeeder(c, src, dst); + DEBC(printf("build feeder r = %d\n", r)); + if (r) + goto out; - r = EINVAL; - f = chn_findfeeder(c, FEEDER_RATE); - DEB(printf("feedrate = %p\n", f)); - if (f == NULL) - goto out; + r = chn_setblocksize(c, 0, 0); + if (r) + goto out; - x = (c->direction == PCMDIR_REC)? b : bs; - r = FEEDER_SET(f, FEEDRATE_SRC, sndbuf_getspd(x)); - DEB(printf("feeder_set(FEEDRATE_SRC, %d) = %d\n", sndbuf_getspd(x), r)); - if (r) - goto out; + if (!(c->feederflags & (1 << FEEDER_RATE))) + goto out; - x = (c->direction == PCMDIR_REC)? bs : b; - r = FEEDER_SET(f, FEEDRATE_DST, sndbuf_getspd(x)); - DEB(printf("feeder_set(FEEDRATE_DST, %d) = %d\n", sndbuf_getspd(x), r)); -out: - DEB(printf("setspeed done, r = %d\n", r)); - return r; - } else - return EINVAL; + r = EINVAL; + f = chn_findfeeder(c, FEEDER_RATE); + DEBC(printf("feedrate = %p\n", f)); + if (f == NULL) + goto out; + + r = FEEDER_SET(f, FEEDRATE_SRC, sndbuf_getspd(src)); + DEBC(printf("feeder_set(FEEDRATE_SRC, %d) = %d\n", + sndbuf_getspd(src), r)); + if (r) + goto out; + + r = FEEDER_SET(f, FEEDRATE_DST, sndbuf_getspd(dst)); + DEBC(printf("feeder_set(FEEDRATE_DST, %d) = %d\n", + sndbuf_getspd(dst), r)); + out: + DEBC(printf("setspeed done, r = %d\n", r)); + return r; } int chn_setspeed(struct pcm_channel *c, int speed) { - int r, oldspeed = c->speed; + struct snd_dbuf *bs = c->bufsoft; + int r, oldspeed; + oldspeed = sndbuf_getspd(bs); r = chn_tryspeed(c, speed); if (r) { - DEB(printf("Failed to set speed %d falling back to %d\n", speed, oldspeed)); + DEBC(printf("Failed to set speed %d falling back to %d\n", + speed, oldspeed)); r = chn_tryspeed(c, oldspeed); } + DEBC(printf("After setspeed hard fmt = %08x soft fmt = %08x\n", + sndbuf_getfmt(c->bufhard), sndbuf_getfmt(c->bufsoft))); return r; } +int +chn_getspeed(struct pcm_channel *c) +{ + struct snd_dbuf *bs = c->bufsoft; + return sndbuf_getspd(bs); +} + static int chn_tryformat(struct pcm_channel *c, u_int32_t fmt) { struct snd_dbuf *b = c->bufhard; struct snd_dbuf *bs = c->bufsoft; + uint32_t hwfmt, spd; int r; CHN_LOCKASSERT(c); - if (CANCHANGE(c)) { - DEB(printf("want format %d\n", fmt)); - c->format = fmt; - r = chn_buildfeeder(c); - if (r == 0) { - sndbuf_setfmt(bs, c->format); - chn_resetbuf(c); - r = CHANNEL_SETFORMAT(c->methods, c->devinfo, sndbuf_getfmt(b)); - if (r == 0) - r = chn_tryspeed(c, c->speed); - } - return r; - } else + if (CANCHANGE(c) == 0) return EINVAL; + DEBC(printf("want format %d\n", fmt)); + + if (fmtvalid(fmt, chn_getcaps(c)->fmtlist)) { + hwfmt = fmt; + } else { + hwfmt = chn_best_hwfmt(c, fmt); + DEBC(printf("Format %08x not valid, best hw = %08x\n", + fmt, hwfmt)); + } + + sndbuf_setfmt(bs, fmt); + sndbuf_setfmt(b, hwfmt); + CHANNEL_SETFORMAT(c->methods, c->devinfo, hwfmt); + + r = 0; + spd = sndbuf_getspd(bs); + if (spd != 0) + r = chn_tryspeed(c, spd); + + if (r == 0) + chn_resetbuf(c); + + return r; } int chn_setformat(struct pcm_channel *c, u_int32_t fmt) { - u_int32_t oldfmt = c->format; + struct snd_dbuf *bs = c->bufsoft; + u_int32_t oldfmt; int r; + oldfmt = sndbuf_getfmt(bs); r = chn_tryformat(c, fmt); if (r) { - DEB(printf("Format change %d failed, reverting to %d\n", fmt, oldfmt)); + DEBC(printf("Format change %d failed (r), reverting to %d\n", + fmt, r, oldfmt)); chn_tryformat(c, oldfmt); } + DEBC(printf("After setformat hard fmt = %08x soft fmt = %08x\n", + sndbuf_getfmt(c->bufhard), sndbuf_getfmt(c->bufsoft))); return r; } +uint32_t +chn_getformat(struct pcm_channel *c) +{ + struct snd_dbuf *bs = c->bufsoft; + return sndbuf_getfmt(bs); +} + int chn_setblocksize(struct pcm_channel *c, int blkcnt, int blksz) { @@ -1030,18 +1109,20 @@ } static int -chn_buildfeeder(struct pcm_channel *c) +chn_buildfeeder(struct pcm_channel *c, + struct snd_dbuf *srcbuf, + struct snd_dbuf *dstbuf) { struct feeder_class *fc; struct pcm_feederdesc desc; - u_int32_t tmp[2], type, flags, hwfmt; + u_int32_t tmp[2], type, flags; int err; CHN_LOCKASSERT(c); while (chn_removefeeder(c) == 0); KASSERT((c->feeder == NULL), ("feeder chain not empty")); - c->align = sndbuf_getalign(c->bufsoft); + c->align = sndbuf_getalign(srcbuf); if (SLIST_EMPTY(&c->children)) { fc = feeder_getclass(NULL); @@ -1049,33 +1130,33 @@ err = chn_addfeeder(c, fc, NULL); if (err) { - DEB(printf("can't add root feeder, err %d\n", err)); + DEBC(printf("can't add root feeder, err %d\n", err)); return err; } - c->feeder->desc->out = c->format; + c->feeder->desc->out = sndbuf_getfmt(srcbuf); } else { desc.type = FEEDER_MIXER; desc.in = 0; - desc.out = c->format; + desc.out = sndbuf_getfmt(srcbuf); desc.flags = 0; fc = feeder_getclass(&desc); if (fc == NULL) { - DEB(printf("can't find vchan feeder\n")); + DEBC(printf("can't find vchan feeder\n")); return EOPNOTSUPP; } err = chn_addfeeder(c, fc, &desc); if (err) { - DEB(printf("can't add vchan feeder, err %d\n", err)); + DEBC(printf("can't add vchan feeder, err %d\n", err)); return err; } } flags = c->feederflags; - DEB(printf("not mapped, feederflags %x\n", flags)); + DEBC(printf("not mapped, feederflags %x\n", flags)); for (type = FEEDER_RATE; type <= FEEDER_LAST; type++) { if (flags & (1 << type)) { @@ -1083,62 +1164,50 @@ desc.in = 0; desc.out = 0; desc.flags = 0; - DEB(printf("find feeder type %d, ", type)); + DEBC(printf("find feeder type %d, ", type)); fc = feeder_getclass(&desc); - DEB(printf("got %p\n", fc)); + DEBC(printf("got %p\n", fc)); if (fc == NULL) { - DEB(printf("can't find required feeder type %d\n", type)); + DEBC(printf("can't find required feeder type %d\n", type)); return EOPNOTSUPP; } if (c->feeder->desc->out != fc->desc->in) { - DEB(printf("build fmtchain from %x to %x: ", c->feeder->desc->out, fc->desc->in)); + DEBC(printf("build fmtchain from %x to %x: ", c->feeder->desc->out, fc->desc->in)); tmp[0] = fc->desc->in; tmp[1] = 0; if (chn_fmtchain(c, tmp) == 0) { - DEB(printf("failed\n")); + DEBC(printf("failed\n")); return ENODEV; } - DEB(printf("ok\n")); + DEBC(printf("ok\n")); } err = chn_addfeeder(c, fc, fc->desc); if (err) { - DEB(printf("can't add feeder %p, output %x, err %d\n", fc, fc->desc->out, err)); + DEBC(printf("can't add feeder %p, output %x, err %d\n", fc, fc->desc->out, err)); return err; } - DEB(printf("added feeder %p, output %x\n", fc, c->feeder->desc->out)); + DEBC(printf("added feeder %p, output %x\n", + fc, c->feeder->desc->out)); } } - if (fmtvalid(c->feeder->desc->out, chn_getcaps(c)->fmtlist)) { - hwfmt = c->feeder->desc->out; - } else { - if (c->direction == PCMDIR_REC) { - tmp[0] = c->format; - tmp[1] = 0; - hwfmt = chn_fmtchain(c, tmp); - } else { -#if 0 - u_int32_t *x = chn_getcaps(c)->fmtlist; - printf("acceptable formats for %s:\n", c->name); - while (*x) { - printf("[%8x] ", *x); - x++; - } -#endif - hwfmt = chn_fmtchain(c, chn_getcaps(c)->fmtlist); + tmp[0] = sndbuf_getfmt(dstbuf); + DEBC(printf("Final feeder (ifmt = %08x, ofmt = %08x), want %08x\n", + c->feeder->desc->in, c->feeder->desc->out, tmp[0])); + if (c->feeder->desc->out != tmp[0]) { + tmp[1] = 0; + if (chn_fmtchain(c, tmp) == 0) { + DEBC(printf("failed\n")); + return ENODEV; } + DEBC(printf("ok\n")); } - - if (hwfmt == 0) - return ENODEV; - - sndbuf_setfmt(c->bufhard, hwfmt); - + feeder_printchain(c->feeder); return 0; } Index: channel.h =================================================================== RCS file: /home/xorpc/u2/freebsd/src/sys/dev/sound/pcm/channel.h,v retrieving revision 1.27 diff -u -r1.27 channel.h --- channel.h 26 Nov 2002 18:16:26 -0000 1.27 +++ channel.h 17 Aug 2003 23:28:15 -0000 @@ -48,8 +48,10 @@ u_int32_t align; int volume; +#if 0 u_int32_t speed; u_int32_t format; +#endif u_int32_t flags; u_int32_t feederflags; u_int32_t blocks; @@ -82,12 +84,16 @@ int chn_reset(struct pcm_channel *c, u_int32_t fmt); int chn_setvolume(struct pcm_channel *c, int left, int right); int chn_setspeed(struct pcm_channel *c, int speed); + int chn_setformat(struct pcm_channel *c, u_int32_t fmt); int chn_setblocksize(struct pcm_channel *c, int blkcnt, int blksz); int chn_trigger(struct pcm_channel *c, int go); int chn_getptr(struct pcm_channel *c); struct pcmchan_caps *chn_getcaps(struct pcm_channel *c); u_int32_t chn_getformats(struct pcm_channel *c); + +int chn_getspeed(struct pcm_channel *c); +uint32_t chn_getformat(struct pcm_channel *c); void chn_resetbuf(struct pcm_channel *c); void chn_intr(struct pcm_channel *c); Index: dsp.c =================================================================== RCS file: /home/xorpc/u2/freebsd/src/sys/dev/sound/pcm/dsp.c,v retrieving revision 1.65 diff -u -r1.65 dsp.c --- dsp.c 15 Aug 2003 02:31:13 -0000 1.65 +++ dsp.c 17 Aug 2003 23:28:15 -0000 @@ -541,10 +541,10 @@ { snd_chan_param *p = (snd_chan_param *)arg; - p->play_rate = wrch? wrch->speed : 0; - p->rec_rate = rdch? rdch->speed : 0; - p->play_format = wrch? wrch->format : 0; - p->rec_format = rdch? rdch->format : 0; + p->play_rate = wrch? chn_getspeed(wrch) : 0; + p->rec_rate = rdch? chn_getspeed(rdch) : 0; + p->play_format = wrch? chn_getformat(wrch) : 0; + p->rec_format = rdch? chn_getformat(rdch) : 0; } break; @@ -679,21 +679,21 @@ if (wrch) { CHN_LOCK(wrch); ret = chn_setspeed(wrch, *arg_i); - tmp = wrch->speed; + tmp = chn_getspeed(wrch); CHN_UNLOCK(wrch); } if (rdch && ret == 0) { CHN_LOCK(rdch); ret = chn_setspeed(rdch, *arg_i); if (tmp == 0) - tmp = rdch->speed; + tmp = chn_getspeed(rdch); CHN_UNLOCK(rdch); } *arg_i = tmp; break; case SOUND_PCM_READ_RATE: - *arg_i = wrch? wrch->speed : rdch->speed; + *arg_i = wrch? chn_getspeed(wrch) : chn_getspeed(rdch); break; case SNDCTL_DSP_STEREO: @@ -701,15 +701,15 @@ *arg_i = (*arg_i)? AFMT_STEREO : 0; if (wrch) { CHN_LOCK(wrch); - ret = chn_setformat(wrch, (wrch->format & ~AFMT_STEREO) | *arg_i); - tmp = (wrch->format & AFMT_STEREO)? 1 : 0; + ret = chn_setformat(wrch, (chn_getformat(wrch) & ~AFMT_STEREO) | *arg_i); + tmp = (chn_getformat(wrch) & AFMT_STEREO)? 1 : 0; CHN_UNLOCK(wrch); } if (rdch && ret == 0) { CHN_LOCK(rdch); - ret = chn_setformat(rdch, (rdch->format & ~AFMT_STEREO) | *arg_i); + ret = chn_setformat(rdch, (chn_getformat(rdch) & ~AFMT_STEREO) | *arg_i); if (tmp == -1) - tmp = (rdch->format & AFMT_STEREO)? 1 : 0; + tmp = (chn_getformat(rdch) & AFMT_STEREO)? 1 : 0; CHN_UNLOCK(rdch); } *arg_i = tmp; @@ -722,25 +722,25 @@ *arg_i = (*arg_i != 1)? AFMT_STEREO : 0; if (wrch) { CHN_LOCK(wrch); - ret = chn_setformat(wrch, (wrch->format & ~AFMT_STEREO) | *arg_i); - tmp = (wrch->format & AFMT_STEREO)? 2 : 1; + ret = chn_setformat(wrch, (chn_getformat(wrch) & ~AFMT_STEREO) | *arg_i); + tmp = (chn_getformat(wrch) & AFMT_STEREO)? 2 : 1; CHN_UNLOCK(wrch); } if (rdch && ret == 0) { CHN_LOCK(rdch); - ret = chn_setformat(rdch, (rdch->format & ~AFMT_STEREO) | *arg_i); + ret = chn_setformat(rdch, (chn_getformat(rdch) & ~AFMT_STEREO) | *arg_i); if (tmp == 0) - tmp = (rdch->format & AFMT_STEREO)? 2 : 1; + tmp = (chn_getformat(rdch) & AFMT_STEREO)? 2 : 1; CHN_UNLOCK(rdch); } *arg_i = tmp; } else { - *arg_i = ((wrch? wrch->format : rdch->format) & AFMT_STEREO)? 2 : 1; + *arg_i = ((wrch? chn_getformat(wrch) : chn_getformat(rdch)) & AFMT_STEREO)? 2 : 1; } break; case SOUND_PCM_READ_CHANNELS: - *arg_i = ((wrch? wrch->format : rdch->format) & AFMT_STEREO)? 2 : 1; + *arg_i = ((wrch? chn_getformat(wrch) : chn_getformat(rdch)) & AFMT_STEREO)? 2 : 1; break; case SNDCTL_DSP_GETFMTS: /* returns a mask of supported fmts */ @@ -753,20 +753,20 @@ tmp = 0; if (wrch) { CHN_LOCK(wrch); - ret = chn_setformat(wrch, (*arg_i) | (wrch->format & AFMT_STEREO)); - tmp = wrch->format & ~AFMT_STEREO; + ret = chn_setformat(wrch, (*arg_i) | (chn_getformat(wrch) & AFMT_STEREO)); + tmp = chn_getformat(wrch) & ~AFMT_STEREO; CHN_UNLOCK(wrch); } if (rdch && ret == 0) { CHN_LOCK(rdch); - ret = chn_setformat(rdch, (*arg_i) | (rdch->format & AFMT_STEREO)); + ret = chn_setformat(rdch, (*arg_i) | (chn_getformat(rdch) & AFMT_STEREO)); if (tmp == 0) - tmp = rdch->format & ~AFMT_STEREO; + tmp = chn_getformat(rdch) & ~AFMT_STEREO; CHN_UNLOCK(rdch); } *arg_i = tmp; } else - *arg_i = (wrch? wrch->format : rdch->format) & ~AFMT_STEREO; + *arg_i = (wrch? chn_getformat(wrch) : chn_getformat(rdch)) & ~AFMT_STEREO; break; case SNDCTL_DSP_SETFRAGMENT: @@ -890,7 +890,7 @@ break; case SOUND_PCM_READ_BITS: - *arg_i = ((wrch? wrch->format : rdch->format) & AFMT_16BIT)? 16 : 8; + *arg_i = ((wrch? chn_getformat(wrch) : chn_getformat(rdch)) & AFMT_16BIT)? 16 : 8; break; case SNDCTL_DSP_SETTRIGGER: Index: feeder.c =================================================================== RCS file: /home/xorpc/u2/freebsd/src/sys/dev/sound/pcm/feeder.c,v retrieving revision 1.31 diff -u -r1.31 feeder.c --- feeder.c 5 Aug 2003 07:23:35 -0000 1.31 +++ feeder.c 17 Aug 2003 23:28:16 -0000 @@ -309,13 +309,9 @@ stop = c->feeder; - if (c->direction == PCMDIR_REC && c->feeder->desc->type == FEEDER_ROOT) { - from = chn_getcaps(c)->fmtlist; - } else { - tmpfrom[0] = c->feeder->desc->out; - tmpfrom[1] = 0; - from = tmpfrom; - } + tmpfrom[0] = c->feeder->desc->out; + tmpfrom[1] = 0; + from = tmpfrom; i = 0; best = 0; @@ -371,7 +367,7 @@ printf("%s [%d]\n", try->class->name, try->desc->idx); #endif - return (c->direction == PCMDIR_REC)? best : c->feeder->desc->out; + return c->feeder->desc->out; } void Index: sound.c =================================================================== RCS file: /home/xorpc/u2/freebsd/src/sys/dev/sound/pcm/sound.c,v retrieving revision 1.83 diff -u -r1.83 sound.c --- sound.c 19 Feb 2003 05:47:12 -0000 1.83 +++ sound.c 17 Aug 2003 23:28:16 -0000 @@ -752,11 +752,11 @@ sbuf_printf(s, "\n\t"); sbuf_printf(s, "%s[%s]: ", c->parentchannel? c->parentchannel->name : "", c->name); - sbuf_printf(s, "spd %d", c->speed); - if (c->speed != sndbuf_getspd(c->bufhard)) + sbuf_printf(s, "spd %d", chn_getspeed(c)); + if (chn_getspeed(c) != sndbuf_getspd(c->bufhard)) sbuf_printf(s, "/%d", sndbuf_getspd(c->bufhard)); - sbuf_printf(s, ", fmt 0x%08x", c->format); - if (c->format != sndbuf_getfmt(c->bufhard)) + sbuf_printf(s, ", fmt 0x%08x", chn_getformat(c)); + if (chn_getformat(c) != sndbuf_getfmt(c->bufhard)) sbuf_printf(s, "/0x%08x", sndbuf_getfmt(c->bufhard)); sbuf_printf(s, ", flags %08x", c->flags); if (c->pid != -1) Index: sound.h =================================================================== RCS file: /home/xorpc/u2/freebsd/src/sys/dev/sound/pcm/sound.h,v retrieving revision 1.50 diff -u -r1.50 sound.h --- sound.h 7 Feb 2003 14:05:34 -0000 1.50 +++ sound.h 17 Aug 2003 23:28:16 -0000 @@ -151,6 +151,7 @@ /* make figuring out what a format is easier. got AFMT_STEREO already */ #define AFMT_32BIT (AFMT_S32_LE | AFMT_S32_BE | AFMT_U32_LE | AFMT_U32_BE) #define AFMT_16BIT (AFMT_S16_LE | AFMT_S16_BE | AFMT_U16_LE | AFMT_U16_BE) +#define AFMT_LAW (AFMT_MU_LAW | AFMT_A_LAW) #define AFMT_8BIT (AFMT_U8 | AFMT_S8) #define AFMT_SIGNED (AFMT_S16_LE | AFMT_S16_BE | AFMT_S8) #define AFMT_BIGENDIAN (AFMT_S16_BE | AFMT_U16_BE) Index: vchan.c =================================================================== RCS file: /home/xorpc/u2/freebsd/src/sys/dev/sound/pcm/vchan.c,v retrieving revision 1.12 diff -u -r1.12 vchan.c --- vchan.c 19 Feb 2003 05:47:12 -0000 1.12 +++ vchan.c 17 Aug 2003 23:28:16 -0000 @@ -205,7 +205,7 @@ { struct vchinfo *ch = data; - ch->caps.minspeed = sndbuf_getspd(ch->parent->bufhard); + ch->caps.minspeed = sndbuf_getspd(ch->parent->bufsoft); ch->caps.maxspeed = ch->caps.minspeed; ch->caps.fmtlist = vchan_fmt; ch->caps.caps = 0;