diff --git a/sys/dev/sound/pcm/feeder.h b/sys/dev/sound/pcm/feeder.h --- a/sys/dev/sound/pcm/feeder.h +++ b/sys/dev/sound/pcm/feeder.h @@ -87,6 +87,15 @@ FEEDER_LAST, }; +#define FEEDER_F_BITS "\020" \ + "\001ROOT" \ + "\002FORMAT" \ + "\003MIXER" \ + "\004RATE" \ + "\005EQ" \ + "\006VOLUME" \ + "\007MATRIX" + /* feeder_format */ enum { FEEDFORMAT_CHANNELS diff --git a/sys/dev/sound/pcm/sound.c b/sys/dev/sound/pcm/sound.c --- a/sys/dev/sound/pcm/sound.c +++ b/sys/dev/sound/pcm/sound.c @@ -80,6 +80,7 @@ struct snddev_info *d; struct pcm_channel *c; struct pcm_feeder *f; + char fmtstr[AFMTSTR_LEN]; d = device_get_softc(dev); PCM_BUSYASSERT(d); @@ -89,20 +90,13 @@ return (0); } - if (verbose < 1) { - sbuf_printf(s, " (%s%s%s", - d->playcount ? "play" : "", - (d->playcount && d->reccount) ? "/" : "", - d->reccount ? "rec" : ""); - } else { - sbuf_printf(s, " (%dp:%dv/%dr:%dv", - d->playcount, d->pvchancount, - d->reccount, d->rvchancount); - } - sbuf_printf(s, "%s)%s", - ((d->playcount != 0 && d->reccount != 0) && - (d->flags & SD_F_SIMPLEX)) ? " simplex" : "", - (device_get_unit(dev) == snd_unit) ? " default" : ""); + sbuf_printf(s, " (%s%s%s)", + d->playcount ? "play" : "", + (d->playcount && d->reccount) ? "/" : "", + d->reccount ? "rec" : ""); + + sbuf_printf(s, "%s", + (device_get_unit(dev) == snd_unit) ? " (default)" : ""); if (verbose <= 1) return (0); @@ -110,77 +104,102 @@ sbuf_printf(s, "\n\t"); sbuf_printf(s, "snddev flags=0x%b", d->flags, SD_F_BITS); + sbuf_printf(s, "\n\t"); + sbuf_printf(s, "playback channels=[hardware=%d, virtual=%d]", + d->playcount, d->pvchancount); + + sbuf_printf(s, "\n\t"); + sbuf_printf(s, "recording channels=[hardware=%d, virtual=%d]", + d->reccount, d->rvchancount); + CHN_FOREACH(c, d, channels.pcm) { KASSERT(c->bufhard != NULL && c->bufsoft != NULL, ("hosed pcm channel setup")); sbuf_printf(s, "\n\t"); + sbuf_printf(s, "%s", c->name); - sbuf_printf(s, "%s[%s]: ", - (c->parentchannel != NULL) ? - c->parentchannel->name : "", c->name); - sbuf_printf(s, "spd %d", c->speed); - if (c->speed != sndbuf_getspd(c->bufhard)) { - sbuf_printf(s, "/%d", - sndbuf_getspd(c->bufhard)); + if (c->parentchannel != NULL) { + sbuf_printf(s, "\n\t\t"); + sbuf_printf(s, "parent channel=%s", + c->parentchannel->name); } - sbuf_printf(s, ", fmt 0x%08x", c->format); + + sbuf_printf(s, "\n\t\t"); + sbuf_printf(s, "channel flags=0x%b", c->flags, CHN_F_BITS); + + sbuf_printf(s, "\n\t\t"); + sbuf_printf(s, "rate=%d", c->speed); + if (c->speed != sndbuf_getspd(c->bufhard)) + sbuf_printf(s, "/%d", sndbuf_getspd(c->bufhard)); + + snd_afmt2str(c->format, fmtstr, sizeof(fmtstr)); + sbuf_printf(s, "\n\t\t"); + sbuf_printf(s, "format=%s", fmtstr); if (c->format != sndbuf_getfmt(c->bufhard)) { - sbuf_printf(s, "/0x%08x", - sndbuf_getfmt(c->bufhard)); + snd_afmt2str(sndbuf_getfmt(c->bufhard), fmtstr, + sizeof(fmtstr)); + sbuf_printf(s, "/%s", fmtstr); } - sbuf_printf(s, ", flags 0x%08x, 0x%08x", - c->flags, c->feederflags); + if (c->pid != -1) { - sbuf_printf(s, ", pid %d (%s)", - c->pid, c->comm); + sbuf_printf(s, "\n\t\t"); + sbuf_printf(s, "pid=%d (%s)", c->pid, c->comm); } - sbuf_printf(s, "\n\t"); - sbuf_printf(s, "interrupts %d, ", c->interrupts); + sbuf_printf(s, "\n\t\t"); + sbuf_printf(s, "interrupts=%d, ", c->interrupts); + sbuf_printf(s, "\n\t\t"); if (c->direction == PCMDIR_REC) { sbuf_printf(s, - "overruns %d, feed %u, hfree %d, " - "sfree %d [b:%d/%d/%d|bs:%d/%d/%d]", - c->xruns, c->feedcount, - sndbuf_getfree(c->bufhard), - sndbuf_getfree(c->bufsoft), - sndbuf_getsize(c->bufhard), - sndbuf_getblksz(c->bufhard), - sndbuf_getblkcnt(c->bufhard), - sndbuf_getsize(c->bufsoft), - sndbuf_getblksz(c->bufsoft), - sndbuf_getblkcnt(c->bufsoft)); + "overruns=%d\n\t\tfeed=%u\n\t\t" + "hfree=%d\n\t\tsfree=%d", + c->xruns, c->feedcount, + sndbuf_getfree(c->bufhard), + sndbuf_getfree(c->bufsoft)); + } else { sbuf_printf(s, - "underruns %d, feed %u, ready %d " - "[b:%d/%d/%d|bs:%d/%d/%d]", - c->xruns, c->feedcount, - sndbuf_getready(c->bufsoft), - sndbuf_getsize(c->bufhard), - sndbuf_getblksz(c->bufhard), - sndbuf_getblkcnt(c->bufhard), - sndbuf_getsize(c->bufsoft), - sndbuf_getblksz(c->bufsoft), - sndbuf_getblkcnt(c->bufsoft)); + "underruns=%d\n\t\tfeed=%u\n\t\tready=%d", + c->xruns, c->feedcount, + sndbuf_getready(c->bufsoft)); } - sbuf_printf(s, "\n\t"); - - sbuf_printf(s, "channel flags=0x%b", c->flags, CHN_F_BITS); - sbuf_printf(s, "\n\t"); - sbuf_printf(s, "{%s}", + sbuf_printf(s, "\n\t\t"); + sbuf_printf(s, + "hardware buffer=[size=%d, blocksize=%d, blockcount=%d]", + sndbuf_getsize(c->bufhard), + sndbuf_getblksz(c->bufhard), + sndbuf_getblkcnt(c->bufhard)); + + sbuf_printf(s, "\n\t\t"); + sbuf_printf(s, + "software buffer=[size=%d, blocksize=%d, blockcount=%d]", + sndbuf_getsize(c->bufsoft), + sndbuf_getblksz(c->bufsoft), + sndbuf_getblkcnt(c->bufsoft)); + + sbuf_printf(s, "\n\t\t"); + sbuf_printf(s, "feeder flags=0x%b", c->feederflags, FEEDER_F_BITS); + + sbuf_printf(s, "\n\t\t"); + sbuf_printf(s, "feeder chain=[%s", (c->direction == PCMDIR_REC) ? "hardware" : "userland"); sbuf_printf(s, " -> "); + f = c->feeder; while (f->source != NULL) f = f->source; while (f != NULL) { sbuf_printf(s, "%s", f->class->name); + if (f->desc->type == FEEDER_FORMAT) { - sbuf_printf(s, "(0x%08x -> 0x%08x)", - f->desc->in, f->desc->out); + snd_afmt2str(f->desc->in, fmtstr, sizeof(fmtstr)); + sbuf_printf(s, "(%s -> ", fmtstr); + + snd_afmt2str(f->desc->out, fmtstr, sizeof(fmtstr)); + sbuf_printf(s, "%s)", fmtstr); } else if (f->desc->type == FEEDER_MATRIX) { sbuf_printf(s, "(%d.%d -> %d.%d)", AFMT_CHANNEL(f->desc->in) - @@ -196,14 +215,13 @@ FEEDER_GET(f, FEEDRATE_QUALITY), FEEDER_GET(f, FEEDRATE_SRC), FEEDER_GET(f, FEEDRATE_DST)); - } else { - sbuf_printf(s, "(0x%08x)", - f->desc->out); - } + } else + sbuf_printf(s, "(0x%08x)", f->desc->out); + sbuf_printf(s, " -> "); f = f->parent; } - sbuf_printf(s, "{%s}", + sbuf_printf(s, "%s]", (c->direction == PCMDIR_REC) ? "userland" : "hardware"); }