Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 May 2025 19:31:37 GMT
From:      Christos Margiolis <christos@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 30fd79b0c0a3 - main - sndctl(8): Fix dp->realtime
Message-ID:  <202505211931.54LJVbkq077850@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by christos:

URL: https://cgit.FreeBSD.org/src/commit/?id=30fd79b0c0a328536b166e7fa9170b059e711303

commit 30fd79b0c0a328536b166e7fa9170b059e711303
Author:     Christos Margiolis <christos@FreeBSD.org>
AuthorDate: 2025-05-21 19:31:28 +0000
Commit:     Christos Margiolis <christos@FreeBSD.org>
CommitDate: 2025-05-21 19:31:28 +0000

    sndctl(8): Fix dp->realtime
    
    Currently it's automatically set to 0 in read_dev() as a result of
    allocating dp with calloc().
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 day
    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D50400
---
 usr.sbin/sndctl/sndctl.c | 189 ++++++++++++++++++++++++-----------------------
 1 file changed, 98 insertions(+), 91 deletions(-)

diff --git a/usr.sbin/sndctl/sndctl.c b/usr.sbin/sndctl/sndctl.c
index 4d3ae0cf526c..156c845481c5 100644
--- a/usr.sbin/sndctl/sndctl.c
+++ b/usr.sbin/sndctl/sndctl.c
@@ -333,6 +333,96 @@ bytes2frames(int bytes, int fmt)
 	return (bytes / (samplesz * ch));
 }
 
+static int
+sysctl_int(const char *buf, const char *arg, int *var)
+{
+	size_t size;
+	int n, prev;
+
+	size = sizeof(int);
+	/* Read current value. */
+	if (sysctlbyname(buf, &prev, &size, NULL, 0) < 0) {
+		warn("sysctlbyname(%s)", buf);
+		return (-1);
+	}
+
+	/* Read-only. */
+	if (arg != NULL) {
+		errno = 0;
+		n = strtol(arg, NULL, 10);
+		if (errno == EINVAL || errno == ERANGE) {
+			warn("strtol(%s)", arg);
+			return (-1);
+		}
+
+		/* Apply new value. */
+		if (sysctlbyname(buf, NULL, 0, &n, size) < 0) {
+			warn("sysctlbyname(%s, %d)", buf, n);
+			return (-1);
+		}
+	}
+
+	/* Read back applied value for good measure. */
+	if (sysctlbyname(buf, &n, &size, NULL, 0) < 0) {
+		warn("sysctlbyname(%s)", buf);
+		return (-1);
+	}
+
+	if (arg != NULL)
+		printf("%s: %d -> %d\n", buf, prev, n);
+	if (var != NULL)
+		*var = n;
+
+	return (0);
+}
+
+static int
+sysctl_str(const char *buf, const char *arg, char *var, size_t varsz)
+{
+	size_t size;
+	char prev[BUFSIZ];
+	char *tmp;
+
+	/* Read current value. */
+	size = sizeof(prev);
+	if (sysctlbyname(buf, prev, &size, NULL, 0) < 0) {
+		warn("sysctlbyname(%s)", buf);
+		return (-1);
+	}
+
+	/* Read-only. */
+	if (arg != NULL) {
+		size = strlen(arg);
+		/* Apply new value. */
+		if (sysctlbyname(buf, NULL, 0, arg, size) < 0) {
+			warn("sysctlbyname(%s, %s)", buf, arg);
+			return (-1);
+		}
+		/* Get size of new string. */
+		if (sysctlbyname(buf, NULL, &size, NULL, 0) < 0) {
+			warn("sysctlbyname(%s)", buf);
+			return (-1);
+		}
+	}
+
+	if ((tmp = calloc(1, size)) == NULL)
+		err(1, "calloc");
+	/* Read back applied value for good measure. */
+	if (sysctlbyname(buf, tmp, &size, NULL, 0) < 0) {
+		warn("sysctlbyname(%s)", buf);
+		free(tmp);
+		return (-1);
+	}
+
+	if (arg != NULL)
+		printf("%s: %s -> %s\n", buf, prev, tmp);
+	if (var != NULL)
+		strlcpy(var, tmp, varsz);
+	free(tmp);
+
+	return (0);
+}
+
 static struct snd_dev *
 read_dev(char *path)
 {
@@ -343,7 +433,7 @@ read_dev(char *path)
 	struct snd_dev *dp = NULL;
 	struct snd_chan *ch;
 	size_t nitems, nchans, i, j;
-	int fd, caps, unit;
+	int fd, caps, unit, t1, t2, t3;
 
 	if ((fd = open("/dev/sndstat", O_RDONLY)) < 0)
 		err(1, "open(/dev/sndstat)");
@@ -456,6 +546,13 @@ read_dev(char *path)
 
 	dp->autoconv = (dp->play.vchans || dp->rec.vchans) && !dp->bitperfect;
 
+	if (sysctl_int("hw.snd.latency", NULL, &t1) ||
+	    sysctl_int("hw.snd.latency_profile", NULL, &t2) ||
+	    sysctl_int("kern.timecounter.alloweddeviation", NULL, &t3))
+		err(1, "%s: sysctl", dp->name);
+	if (t1 == 0 && t2 == 0 && t3 == 0)
+		dp->realtime = 1;
+
 	if (!nvlist_exists(nvlist_get_nvlist(di[i],
 	    SNDST_DSPS_PROVIDER_INFO), SNDST_DSPS_SOUND4_CHAN_INFO))
 		errx(1, "%s: channel info list empty", dp->name);
@@ -658,96 +755,6 @@ print_dev(struct snd_dev *dp)
 	}
 }
 
-static int
-sysctl_int(const char *buf, const char *arg, int *var)
-{
-	size_t size;
-	int n, prev;
-
-	size = sizeof(int);
-	/* Read current value. */
-	if (sysctlbyname(buf, &prev, &size, NULL, 0) < 0) {
-		warn("sysctlbyname(%s)", buf);
-		return (-1);
-	}
-
-	/* Read-only. */
-	if (arg != NULL) {
-		errno = 0;
-		n = strtol(arg, NULL, 10);
-		if (errno == EINVAL || errno == ERANGE) {
-			warn("strtol(%s)", arg);
-			return (-1);
-		}
-
-		/* Apply new value. */
-		if (sysctlbyname(buf, NULL, 0, &n, size) < 0) {
-			warn("sysctlbyname(%s, %d)", buf, n);
-			return (-1);
-		}
-	}
-
-	/* Read back applied value for good measure. */
-	if (sysctlbyname(buf, &n, &size, NULL, 0) < 0) {
-		warn("sysctlbyname(%s)", buf);
-		return (-1);
-	}
-
-	if (arg != NULL)
-		printf("%s: %d -> %d\n", buf, prev, n);
-	if (var != NULL)
-		*var = n;
-
-	return (0);
-}
-
-static int
-sysctl_str(const char *buf, const char *arg, char *var, size_t varsz)
-{
-	size_t size;
-	char prev[BUFSIZ];
-	char *tmp;
-
-	/* Read current value. */
-	size = sizeof(prev);
-	if (sysctlbyname(buf, prev, &size, NULL, 0) < 0) {
-		warn("sysctlbyname(%s)", buf);
-		return (-1);
-	}
-
-	/* Read-only. */
-	if (arg != NULL) {
-		size = strlen(arg);
-		/* Apply new value. */
-		if (sysctlbyname(buf, NULL, 0, arg, size) < 0) {
-			warn("sysctlbyname(%s, %s)", buf, arg);
-			return (-1);
-		}
-		/* Get size of new string. */
-		if (sysctlbyname(buf, NULL, &size, NULL, 0) < 0) {
-			warn("sysctlbyname(%s)", buf);
-			return (-1);
-		}
-	}
-
-	if ((tmp = calloc(1, size)) == NULL)
-		err(1, "calloc");
-	/* Read back applied value for good measure. */
-	if (sysctlbyname(buf, tmp, &size, NULL, 0) < 0) {
-		warn("sysctlbyname(%s)", buf);
-		free(tmp);
-		return (-1);
-	}
-
-	if (arg != NULL)
-		printf("%s: %s -> %s\n", buf, prev, tmp);
-	if (var != NULL)
-		strlcpy(var, tmp, varsz);
-	free(tmp);
-
-	return (0);
-}
-
 static int
 mod_bitperfect(struct snd_dev *dp, void *arg)
 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202505211931.54LJVbkq077850>