Skip to content

Commit 30fd79b

Browse files
committed
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
1 parent 52c4263 commit 30fd79b

File tree

1 file changed

+98
-91
lines changed

1 file changed

+98
-91
lines changed

usr.sbin/sndctl/sndctl.c

Lines changed: 98 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,96 @@ bytes2frames(int bytes, int fmt)
333333
return (bytes / (samplesz * ch));
334334
}
335335

336+
static int
337+
sysctl_int(const char *buf, const char *arg, int *var)
338+
{
339+
size_t size;
340+
int n, prev;
341+
342+
size = sizeof(int);
343+
/* Read current value. */
344+
if (sysctlbyname(buf, &prev, &size, NULL, 0) < 0) {
345+
warn("sysctlbyname(%s)", buf);
346+
return (-1);
347+
}
348+
349+
/* Read-only. */
350+
if (arg != NULL) {
351+
errno = 0;
352+
n = strtol(arg, NULL, 10);
353+
if (errno == EINVAL || errno == ERANGE) {
354+
warn("strtol(%s)", arg);
355+
return (-1);
356+
}
357+
358+
/* Apply new value. */
359+
if (sysctlbyname(buf, NULL, 0, &n, size) < 0) {
360+
warn("sysctlbyname(%s, %d)", buf, n);
361+
return (-1);
362+
}
363+
}
364+
365+
/* Read back applied value for good measure. */
366+
if (sysctlbyname(buf, &n, &size, NULL, 0) < 0) {
367+
warn("sysctlbyname(%s)", buf);
368+
return (-1);
369+
}
370+
371+
if (arg != NULL)
372+
printf("%s: %d -> %d\n", buf, prev, n);
373+
if (var != NULL)
374+
*var = n;
375+
376+
return (0);
377+
}
378+
379+
static int
380+
sysctl_str(const char *buf, const char *arg, char *var, size_t varsz)
381+
{
382+
size_t size;
383+
char prev[BUFSIZ];
384+
char *tmp;
385+
386+
/* Read current value. */
387+
size = sizeof(prev);
388+
if (sysctlbyname(buf, prev, &size, NULL, 0) < 0) {
389+
warn("sysctlbyname(%s)", buf);
390+
return (-1);
391+
}
392+
393+
/* Read-only. */
394+
if (arg != NULL) {
395+
size = strlen(arg);
396+
/* Apply new value. */
397+
if (sysctlbyname(buf, NULL, 0, arg, size) < 0) {
398+
warn("sysctlbyname(%s, %s)", buf, arg);
399+
return (-1);
400+
}
401+
/* Get size of new string. */
402+
if (sysctlbyname(buf, NULL, &size, NULL, 0) < 0) {
403+
warn("sysctlbyname(%s)", buf);
404+
return (-1);
405+
}
406+
}
407+
408+
if ((tmp = calloc(1, size)) == NULL)
409+
err(1, "calloc");
410+
/* Read back applied value for good measure. */
411+
if (sysctlbyname(buf, tmp, &size, NULL, 0) < 0) {
412+
warn("sysctlbyname(%s)", buf);
413+
free(tmp);
414+
return (-1);
415+
}
416+
417+
if (arg != NULL)
418+
printf("%s: %s -> %s\n", buf, prev, tmp);
419+
if (var != NULL)
420+
strlcpy(var, tmp, varsz);
421+
free(tmp);
422+
423+
return (0);
424+
}
425+
336426
static struct snd_dev *
337427
read_dev(char *path)
338428
{
@@ -343,7 +433,7 @@ read_dev(char *path)
343433
struct snd_dev *dp = NULL;
344434
struct snd_chan *ch;
345435
size_t nitems, nchans, i, j;
346-
int fd, caps, unit;
436+
int fd, caps, unit, t1, t2, t3;
347437

348438
if ((fd = open("/dev/sndstat", O_RDONLY)) < 0)
349439
err(1, "open(/dev/sndstat)");
@@ -456,6 +546,13 @@ read_dev(char *path)
456546

457547
dp->autoconv = (dp->play.vchans || dp->rec.vchans) && !dp->bitperfect;
458548

549+
if (sysctl_int("hw.snd.latency", NULL, &t1) ||
550+
sysctl_int("hw.snd.latency_profile", NULL, &t2) ||
551+
sysctl_int("kern.timecounter.alloweddeviation", NULL, &t3))
552+
err(1, "%s: sysctl", dp->name);
553+
if (t1 == 0 && t2 == 0 && t3 == 0)
554+
dp->realtime = 1;
555+
459556
if (!nvlist_exists(nvlist_get_nvlist(di[i],
460557
SNDST_DSPS_PROVIDER_INFO), SNDST_DSPS_SOUND4_CHAN_INFO))
461558
errx(1, "%s: channel info list empty", dp->name);
@@ -658,96 +755,6 @@ print_dev(struct snd_dev *dp)
658755
}
659756
}
660757

661-
static int
662-
sysctl_int(const char *buf, const char *arg, int *var)
663-
{
664-
size_t size;
665-
int n, prev;
666-
667-
size = sizeof(int);
668-
/* Read current value. */
669-
if (sysctlbyname(buf, &prev, &size, NULL, 0) < 0) {
670-
warn("sysctlbyname(%s)", buf);
671-
return (-1);
672-
}
673-
674-
/* Read-only. */
675-
if (arg != NULL) {
676-
errno = 0;
677-
n = strtol(arg, NULL, 10);
678-
if (errno == EINVAL || errno == ERANGE) {
679-
warn("strtol(%s)", arg);
680-
return (-1);
681-
}
682-
683-
/* Apply new value. */
684-
if (sysctlbyname(buf, NULL, 0, &n, size) < 0) {
685-
warn("sysctlbyname(%s, %d)", buf, n);
686-
return (-1);
687-
}
688-
}
689-
690-
/* Read back applied value for good measure. */
691-
if (sysctlbyname(buf, &n, &size, NULL, 0) < 0) {
692-
warn("sysctlbyname(%s)", buf);
693-
return (-1);
694-
}
695-
696-
if (arg != NULL)
697-
printf("%s: %d -> %d\n", buf, prev, n);
698-
if (var != NULL)
699-
*var = n;
700-
701-
return (0);
702-
}
703-
704-
static int
705-
sysctl_str(const char *buf, const char *arg, char *var, size_t varsz)
706-
{
707-
size_t size;
708-
char prev[BUFSIZ];
709-
char *tmp;
710-
711-
/* Read current value. */
712-
size = sizeof(prev);
713-
if (sysctlbyname(buf, prev, &size, NULL, 0) < 0) {
714-
warn("sysctlbyname(%s)", buf);
715-
return (-1);
716-
}
717-
718-
/* Read-only. */
719-
if (arg != NULL) {
720-
size = strlen(arg);
721-
/* Apply new value. */
722-
if (sysctlbyname(buf, NULL, 0, arg, size) < 0) {
723-
warn("sysctlbyname(%s, %s)", buf, arg);
724-
return (-1);
725-
}
726-
/* Get size of new string. */
727-
if (sysctlbyname(buf, NULL, &size, NULL, 0) < 0) {
728-
warn("sysctlbyname(%s)", buf);
729-
return (-1);
730-
}
731-
}
732-
733-
if ((tmp = calloc(1, size)) == NULL)
734-
err(1, "calloc");
735-
/* Read back applied value for good measure. */
736-
if (sysctlbyname(buf, tmp, &size, NULL, 0) < 0) {
737-
warn("sysctlbyname(%s)", buf);
738-
free(tmp);
739-
return (-1);
740-
}
741-
742-
if (arg != NULL)
743-
printf("%s: %s -> %s\n", buf, prev, tmp);
744-
if (var != NULL)
745-
strlcpy(var, tmp, varsz);
746-
free(tmp);
747-
748-
return (0);
749-
}
750-
751758
static int
752759
mod_bitperfect(struct snd_dev *dp, void *arg)
753760
{

0 commit comments

Comments
 (0)