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;
}