Module Name:    src
Committed By:   nat
Date:           Sat May 27 10:02:26 UTC 2017

Modified Files:
        src/sys/dev/pad: pad.c padvar.h

Log Message:
Rework of previous.
Math for BYTESTOSLEEP and TIMENEXTREAD is now correct.


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/sys/dev/pad/pad.c
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/pad/padvar.h

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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.28 src/sys/dev/pad/pad.c:1.29
--- src/sys/dev/pad/pad.c:1.28	Thu Feb 23 23:13:27 2017
+++ src/sys/dev/pad/pad.c	Sat May 27 10:02:26 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.28 2017/02/23 23:13:27 nat Exp $ */
+/* $NetBSD: pad.c,v 1.29 2017/05/27 10:02:26 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.28 2017/02/23 23:13:27 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.29 2017/05/27 10:02:26 nat Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -321,6 +321,8 @@ pad_open(dev_t dev, int flags, int fmt, 
 	}
 	
 	getmicrotime(&sc->sc_last);
+	sc->sc_bytes_count = 0;
+	sc->sc_remainder = 0;
 
 	return 0;
 }
@@ -340,8 +342,9 @@ pad_close(dev_t dev, int flags, int fmt,
 	return 0;
 }
 
-#define PAD_BYTES_PER_SEC (44100 * sizeof(int16_t) * 2)
-#define TIMENEXTREAD	(PAD_BLKSIZE * 1000 / PAD_BYTES_PER_SEC)
+#define PAD_BYTES_PER_SEC   (44100 * sizeof(int16_t) * 2)
+#define TIMENEXTREAD	    (PAD_BLKSIZE * 1000000 / PAD_BYTES_PER_SEC)
+#define BYTESTOSLEEP 	    (PAD_BLKSIZE)
 
 int
 pad_read(dev_t dev, struct uio *uio, int flags)
@@ -369,18 +372,28 @@ pad_read(dev_t dev, struct uio *uio, int
 		nowusec = (now.tv_sec * 1000000) + now.tv_usec;
 		lastusec = (sc->sc_last.tv_sec * 1000000) +
 		     sc->sc_last.tv_usec;
-		if (lastusec + TIMENEXTREAD > nowusec) {
-			wait_ticks = (hz * ((lastusec + TIMENEXTREAD) -
-			     nowusec)) / 1000000;
+		if (lastusec + TIMENEXTREAD > nowusec &&
+		     sc->sc_bytes_count >= BYTESTOSLEEP) {
+			sc->sc_remainder +=
+			    ((lastusec + TIMENEXTREAD) - nowusec);
+			
+			wait_ticks = (hz * sc->sc_remainder) / 1000000;
 			if (wait_ticks > 0) {
+				sc->sc_remainder -= wait_ticks * 1000000 / hz;
 				kpause("padwait", TRUE, wait_ticks,
 				    &sc->sc_lock);
 			}
+
+			sc->sc_bytes_count -= BYTESTOSLEEP;
+			getmicrotime(&sc->sc_last);
+		} else if (sc->sc_bytes_count >= BYTESTOSLEEP) {
+			sc->sc_bytes_count -= BYTESTOSLEEP;
+			getmicrotime(&sc->sc_last);
+		} else if (lastusec + TIMENEXTREAD <= nowusec) {
+			getmicrotime(&sc->sc_last);
+			sc->sc_remainder = 0;
 		}
-		sc->sc_last.tv_sec =
-			(lastusec + TIMENEXTREAD) / 1000000;
-		sc->sc_last.tv_usec =
-			(lastusec + TIMENEXTREAD) % 1000000;
+
 		err = pad_get_block(sc, &pb, min(uio->uio_resid, PAD_BLKSIZE));
 		if (!err) {
 			mutex_exit(&sc->sc_lock);
@@ -422,6 +435,8 @@ pad_audio_open(void *opaque, int flags)
 		return EIO;
 
 	getmicrotime(&sc->sc_last);
+	sc->sc_remainder = 0;
+
 	return 0;
 }
 

Index: src/sys/dev/pad/padvar.h
diff -u src/sys/dev/pad/padvar.h:1.7 src/sys/dev/pad/padvar.h:1.8
--- src/sys/dev/pad/padvar.h:1.7	Thu Feb 23 23:13:27 2017
+++ src/sys/dev/pad/padvar.h	Sat May 27 10:02:26 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: padvar.h,v 1.7 2017/02/23 23:13:27 nat Exp $ */
+/* $NetBSD: padvar.h,v 1.8 2017/05/27 10:02:26 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill <jmcne...@invisible.ca>
@@ -52,6 +52,8 @@ typedef struct pad_softc {
 
 	uint8_t		sc_swvol;
 	struct timeval	sc_last;
+	int		sc_bytes_count;
+	uint32_t	sc_remainder;
 } pad_softc_t;
 
 #endif /* !_SYS_DEV_PAD_PADVAR_H */

Reply via email to