@@ -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+
336426static struct snd_dev *
337427read_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-
751758static int
752759mod_bitperfect (struct snd_dev * dp , void * arg )
753760{
0 commit comments