Module Name: src Committed By: isaki Date: Wed Apr 20 04:41:29 UTC 2022
Modified Files: src/sys/dev/audio: audio.c Log Message: audio(4): Make debug messages better in audio_ioctl() and mixier_ioctl(). Divide by case. Reduce to one line if possible. To generate a diff of this commit: cvs rdiff -u -r1.124 -r1.125 src/sys/dev/audio/audio.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/audio/audio.c diff -u src/sys/dev/audio/audio.c:1.124 src/sys/dev/audio/audio.c:1.125 --- src/sys/dev/audio/audio.c:1.124 Tue Apr 19 09:19:53 2022 +++ src/sys/dev/audio/audio.c Wed Apr 20 04:41:29 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: audio.c,v 1.124 2022/04/19 09:19:53 riastradh Exp $ */ +/* $NetBSD: audio.c,v 1.125 2022/04/20 04:41:29 isaki Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -181,7 +181,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.124 2022/04/19 09:19:53 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.125 2022/04/20 04:41:29 isaki Exp $"); #ifdef _KERNEL_OPT #include "audio.h" @@ -2992,40 +2992,44 @@ audio_ioctl(dev_t dev, struct audio_soft audio_format_query_t *query; u_int stamp; u_int offs; - int fd; + int val; int index; int error; #if defined(AUDIO_DEBUG) const char *ioctlnames[] = { - " AUDIO_GETINFO", /* 21 */ - " AUDIO_SETINFO", /* 22 */ - " AUDIO_DRAIN", /* 23 */ - " AUDIO_FLUSH", /* 24 */ - " AUDIO_WSEEK", /* 25 */ - " AUDIO_RERROR", /* 26 */ - " AUDIO_GETDEV", /* 27 */ - " AUDIO_GETENC", /* 28 */ - " AUDIO_GETFD", /* 29 */ - " AUDIO_SETFD", /* 30 */ - " AUDIO_PERROR", /* 31 */ - " AUDIO_GETIOFFS", /* 32 */ - " AUDIO_GETOOFFS", /* 33 */ - " AUDIO_GETPROPS", /* 34 */ - " AUDIO_GETBUFINFO", /* 35 */ - " AUDIO_SETCHAN", /* 36 */ - " AUDIO_GETCHAN", /* 37 */ - " AUDIO_QUERYFORMAT", /* 38 */ - " AUDIO_GETFORMAT", /* 39 */ - " AUDIO_SETFORMAT", /* 40 */ + "AUDIO_GETINFO", /* 21 */ + "AUDIO_SETINFO", /* 22 */ + "AUDIO_DRAIN", /* 23 */ + "AUDIO_FLUSH", /* 24 */ + "AUDIO_WSEEK", /* 25 */ + "AUDIO_RERROR", /* 26 */ + "AUDIO_GETDEV", /* 27 */ + "AUDIO_GETENC", /* 28 */ + "AUDIO_GETFD", /* 29 */ + "AUDIO_SETFD", /* 30 */ + "AUDIO_PERROR", /* 31 */ + "AUDIO_GETIOFFS", /* 32 */ + "AUDIO_GETOOFFS", /* 33 */ + "AUDIO_GETPROPS", /* 34 */ + "AUDIO_GETBUFINFO", /* 35 */ + "AUDIO_SETCHAN", /* 36 */ + "AUDIO_GETCHAN", /* 37 */ + "AUDIO_QUERYFORMAT", /* 38 */ + "AUDIO_GETFORMAT", /* 39 */ + "AUDIO_SETFORMAT", /* 40 */ }; + char pre[64]; int nameidx = (cmd & 0xff); - const char *ioctlname = ""; - if (21 <= nameidx && nameidx <= 21 + __arraycount(ioctlnames)) - ioctlname = ioctlnames[nameidx - 21]; - TRACEF(2, file, "(%lu,'%c',%lu)%s pid=%d.%d", - IOCPARM_LEN(cmd), (char)IOCGROUP(cmd), cmd&0xff, ioctlname, - (int)curproc->p_pid, (int)l->l_lid); + if (21 <= nameidx && nameidx <= 21 + __arraycount(ioctlnames)) { + snprintf(pre, sizeof(pre), "pid=%d.%d %s", + (int)curproc->p_pid, (int)l->l_lid, + ioctlnames[nameidx - 21]); + } else { + snprintf(pre, sizeof(pre), "pid=%d.%d (%lu,'%c',%u)", + (int)curproc->p_pid, (int)l->l_lid, + IOCPARM_LEN(cmd), (char)IOCGROUP(cmd), nameidx); + } #endif error = 0; @@ -3036,10 +3040,15 @@ audio_ioctl(dev_t dev, struct audio_soft case FIONREAD: /* Get the number of bytes that can be read. */ - if (file->rtrack) { - *(int *)addr = audio_track_readablebytes(file->rtrack); + track = file->rtrack; + if (track) { + val = audio_track_readablebytes(track); + *(int *)addr = val; + TRACET(2, track, "pid=%d.%d FIONREAD bytes=%d", + (int)curproc->p_pid, (int)l->l_lid, val); } else { - *(int *)addr = 0; + TRACEF(2, file, "pid=%d.%d FIONREAD no track", + (int)curproc->p_pid, (int)l->l_lid); } break; @@ -3047,48 +3056,42 @@ audio_ioctl(dev_t dev, struct audio_soft /* Set/Clear ASYNC I/O. */ if (*(int *)addr) { file->async_audio = curproc->p_pid; - TRACEF(2, file, "FIOASYNC pid %d", file->async_audio); } else { file->async_audio = 0; - TRACEF(2, file, "FIOASYNC off"); } + TRACEF(2, file, "pid=%d.%d FIOASYNC %s", + (int)curproc->p_pid, (int)l->l_lid, + file->async_audio ? "on" : "off"); break; case AUDIO_FLUSH: /* XXX TODO: clear errors and restart? */ + TRACEF(2, file, "%s", pre); audio_file_clear(sc, file); break; - case AUDIO_RERROR: - /* - * Number of read bytes dropped. We don't know where - * or when they were dropped (including conversion stage). - * Therefore, the number of accurate bytes or samples is - * also unknown. - */ - track = file->rtrack; - if (track) { - *(int *)addr = frametobyte(&track->usrbuf.fmt, - track->dropframes); - } - break; - case AUDIO_PERROR: + case AUDIO_RERROR: /* - * Number of write bytes dropped. We don't know where - * or when they were dropped (including conversion stage). - * Therefore, the number of accurate bytes or samples is - * also unknown. + * Number of dropped bytes during playback/record. We don't + * know where or when they were dropped (including conversion + * stage). Therefore, the number of accurate bytes or samples + * is also unknown. */ - track = file->ptrack; + track = (cmd == AUDIO_PERROR) ? file->ptrack : file->rtrack; if (track) { - *(int *)addr = frametobyte(&track->usrbuf.fmt, + val = frametobyte(&track->usrbuf.fmt, track->dropframes); + *(int *)addr = val; + TRACET(2, track, "%s bytes=%d", pre, val); + } else { + TRACEF(2, file, "%s no track", pre); } break; case AUDIO_GETIOFFS: /* XXX TODO */ + TRACEF(2, file, "%s", pre); ao = (struct audio_offset *)addr; ao->samples = 0; ao->deltablks = 0; @@ -3102,6 +3105,7 @@ audio_ioctl(dev_t dev, struct audio_soft ao->samples = 0; ao->deltablks = 0; ao->offset = 0; + TRACEF(2, file, "%s no ptrack", pre); break; } mutex_enter(sc->sc_lock); @@ -3122,17 +3126,24 @@ audio_ioctl(dev_t dev, struct audio_soft offs -= track->usrbuf.capacity; ao->offset = offs; - TRACET(3, track, "GETOOFFS: samples=%u deltablks=%u offset=%u", - ao->samples, ao->deltablks, ao->offset); + TRACET(2, track, "%s samples=%u deltablks=%u offset=%u", + pre, ao->samples, ao->deltablks, ao->offset); break; case AUDIO_WSEEK: /* XXX return value does not include outbuf one. */ - if (file->ptrack) - *(u_long *)addr = file->ptrack->usrbuf.used; + track = file->ptrack; + if (track) { + val = track->usrbuf.used; + *(u_long *)addr = val; + TRACET(2, track, "%s bytes=%d", pre, val); + } else { + TRACEF(2, file, "%s no ptrack", pre); + } break; case AUDIO_SETINFO: + TRACEF(2, file, "%s", pre); error = audio_exlock_enter(sc); if (error) break; @@ -3148,6 +3159,7 @@ audio_ioctl(dev_t dev, struct audio_soft break; case AUDIO_GETINFO: + TRACEF(2, file, "%s", pre); error = audio_exlock_enter(sc); if (error) break; @@ -3156,6 +3168,7 @@ audio_ioctl(dev_t dev, struct audio_soft break; case AUDIO_GETBUFINFO: + TRACEF(2, file, "%s", pre); error = audio_exlock_enter(sc); if (error) break; @@ -3164,20 +3177,26 @@ audio_ioctl(dev_t dev, struct audio_soft break; case AUDIO_DRAIN: - if (file->ptrack) { + track = file->ptrack; + if (track) { + TRACET(2, track, "%s", pre); mutex_enter(sc->sc_lock); - error = audio_track_drain(sc, file->ptrack); + error = audio_track_drain(sc, track); mutex_exit(sc->sc_lock); + } else { + TRACEF(2, file, "%s no ptrack", pre); } break; case AUDIO_GETDEV: + TRACEF(2, file, "%s", pre); error = sc->hw_if->getdev(sc->hw_hdl, (audio_device_t *)addr); break; case AUDIO_GETENC: ae = (audio_encoding_t *)addr; index = ae->index; + TRACEF(2, file, "%s index=%d", pre, index); if (index < 0 || index >= __arraycount(audio_encodings)) { error = EINVAL; break; @@ -3204,18 +3223,27 @@ audio_ioctl(dev_t dev, struct audio_soft error = audio_exlock_enter(sc); if (error) break; - fd = (sc->sc_props & AUDIO_PROP_FULLDUPLEX) + val = (sc->sc_props & AUDIO_PROP_FULLDUPLEX) && (sc->sc_pmixer && sc->sc_rmixer); audio_exlock_exit(sc); - *(int *)addr = fd; + *(int *)addr = val; + TRACEF(2, file, "%s fulldup=%d", pre, val); break; case AUDIO_GETPROPS: - *(int *)addr = sc->sc_props; + val = sc->sc_props; + *(int *)addr = val; +#if defined(AUDIO_DEBUG) + char pbuf[64]; + snprintb(pbuf, sizeof(pbuf), "\x10" + "\6CAPTURE" "\5PLAY" "\3INDEP" "\2MMAP" "\1FULLDUP", val); + TRACEF(2, file, "%s %s", pre, pbuf); +#endif break; case AUDIO_QUERYFORMAT: query = (audio_format_query_t *)addr; + TRACEF(2, file, "%s index=%u", pre, query->index); mutex_enter(sc->sc_lock); error = sc->hw_if->query_format(sc->hw_hdl, query); mutex_exit(sc->sc_lock); @@ -3224,6 +3252,7 @@ audio_ioctl(dev_t dev, struct audio_soft break; case AUDIO_GETFORMAT: + TRACEF(2, file, "%s", pre); error = audio_exlock_enter(sc); if (error) break; @@ -3232,6 +3261,7 @@ audio_ioctl(dev_t dev, struct audio_soft break; case AUDIO_SETFORMAT: + TRACEF(2, file, "%s", pre); error = audio_exlock_enter(sc); audio_mixers_get_format(sc, &ai); error = audio_mixers_set_format(sc, (struct audio_info *)addr); @@ -3246,23 +3276,24 @@ audio_ioctl(dev_t dev, struct audio_soft case AUDIO_SETCHAN: case AUDIO_GETCHAN: /* Obsoleted */ + TRACEF(2, file, "%s", pre); break; default: + TRACEF(2, file, "%s", pre); if (sc->hw_if->dev_ioctl) { mutex_enter(sc->sc_lock); error = sc->hw_if->dev_ioctl(sc->hw_hdl, cmd, addr, flag, l); mutex_exit(sc->sc_lock); } else { - TRACEF(2, file, "unknown ioctl"); error = EINVAL; } break; } - TRACEF(2, file, "(%lu,'%c',%lu)%s result %d", - IOCPARM_LEN(cmd), (char)IOCGROUP(cmd), cmd&0xff, ioctlname, - error); + + if (error) + TRACEF(2, file, "%s error=%d", pre, error); return error; } @@ -8321,10 +8352,14 @@ mixer_ioctl(struct audio_softc *sc, u_lo { mixer_devinfo_t *mi; mixer_ctrl_t *mc; + int val; int error; - TRACE(2, "(%lu,'%c',%lu)", - IOCPARM_LEN(cmd), (char)IOCGROUP(cmd), cmd & 0xff); +#if defined(AUDIO_DEBUG) + char pre[64]; + snprintf(pre, sizeof(pre), "pid=%d.%d", + (int)curproc->p_pid, (int)l->l_lid); +#endif error = EINVAL; /* we can return cached values if we are sleeping */ @@ -8336,10 +8371,12 @@ mixer_ioctl(struct audio_softc *sc, u_lo switch (cmd) { case FIOASYNC: + val = *(int *)addr; + TRACE(2, "%s FIOASYNC %s", pre, val ? "on" : "off"); error = audio_exlock_enter(sc); if (error) break; - if (*(int *)addr) { + if (val) { mixer_async_add(sc, curproc->p_pid); } else { mixer_async_remove(sc, curproc->p_pid); @@ -8348,12 +8385,12 @@ mixer_ioctl(struct audio_softc *sc, u_lo break; case AUDIO_GETDEV: - TRACE(2, "AUDIO_GETDEV"); + TRACE(2, "%s AUDIO_GETDEV", pre); error = sc->hw_if->getdev(sc->hw_hdl, (audio_device_t *)addr); break; case AUDIO_MIXER_DEVINFO: - TRACE(2, "AUDIO_MIXER_DEVINFO"); + TRACE(2, "%s AUDIO_MIXER_DEVINFO", pre); mi = (mixer_devinfo_t *)addr; mi->un.v.delta = 0; /* default */ @@ -8363,7 +8400,7 @@ mixer_ioctl(struct audio_softc *sc, u_lo break; case AUDIO_MIXER_READ: - TRACE(2, "AUDIO_MIXER_READ"); + TRACE(2, "%s AUDIO_MIXER_READ", pre); mc = (mixer_ctrl_t *)addr; error = audio_exlock_mutex_enter(sc); @@ -8383,7 +8420,7 @@ mixer_ioctl(struct audio_softc *sc, u_lo break; case AUDIO_MIXER_WRITE: - TRACE(2, "AUDIO_MIXER_WRITE"); + TRACE(2, "%s AUDIO_MIXER_WRITE", pre); error = audio_exlock_mutex_enter(sc); if (error) break; @@ -8406,6 +8443,8 @@ mixer_ioctl(struct audio_softc *sc, u_lo break; default: + TRACE(2, "(%lu,'%c',%lu)", + IOCPARM_LEN(cmd), (char)IOCGROUP(cmd), cmd & 0xff); if (sc->hw_if->dev_ioctl) { mutex_enter(sc->sc_lock); error = sc->hw_if->dev_ioctl(sc->hw_hdl, @@ -8415,8 +8454,9 @@ mixer_ioctl(struct audio_softc *sc, u_lo error = EINVAL; break; } - TRACE(2, "(%lu,'%c',%lu) result %d", - IOCPARM_LEN(cmd), (char)IOCGROUP(cmd), cmd & 0xff, error); + + if (error) + TRACE(2, "error=%d", error); return error; }