ref: 8178edf7dadc13301de98099b987eefffd3adca6
parent: 8e5f152d104f69afa38b12e80439d378a369c71d
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Wed Nov 8 21:13:28 EST 2023
snd: don't queue more audio than needed
--- a/fns.h
+++ b/fns.h
@@ -59,6 +59,7 @@
char *lerr(void);
int sys_mkdir(char *path);
+long sndqueued(void);
void sndstop(void);
void sndwrite(uchar *buf, long sz);
void sndclose(void);
--- a/snd.c
+++ b/snd.c
@@ -492,6 +492,27 @@
if(!ainit)
return;
+
+ if(sndt == 0)
+ sndt = nanosec() - Te9 / Fpsmax;
+ nsamp = (nanosec() - sndt) / (Te9 / Srate);
+ if(!cls.timedemo)
+ nsamp = (nsamp + 15) & ~15;
+ nsamp -= sndqueued()/Sblk - Srate/Fpsmax;
+ if(nsamp < 1)
+ return;
+ if(nsamp > Ssamp)
+ nsamp = Ssamp;
+ ns = nsamp * Sblk;
+ mixbuf = mixbufs[mixbufi];
+ samplesfx();
+ sampt += nsamp;
+ if(ns != 0){
+ sndwrite(mixbuf, ns);
+ mixbufi = (mixbufi + 1) % nelem(mixbufs);
+ }
+ sndt = nanosec();
+
VectorCopy(origin, listener_origin);
VectorCopy(forward, listener_forward);
VectorCopy(right, listener_right);
@@ -524,22 +545,6 @@
}
}
}
- if(sndt == 0)
- sndt = nanosec() - Te9 / Fpsmax;
- nsamp = (nanosec() - sndt) / (Te9 / Srate);
- if(!cls.timedemo)
- nsamp = (nsamp + 15) & ~15;
- if(nsamp > Ssamp)
- nsamp = Ssamp;
- ns = nsamp * Sblk;
- mixbuf = mixbufs[mixbufi];
- samplesfx();
- sampt += nsamp;
- if(ns != 0){
- sndwrite(mixbuf, ns);
- mixbufi = (mixbufi + 1) % nelem(mixbufs);
- }
- sndt = nanosec();
}
void
--- a/snd_plan9.c
+++ b/snd_plan9.c
@@ -6,6 +6,17 @@
static uchar *mixbuf;
static Channel *ach;
+long
+sndqueued(void)
+{
+ Dir *d;
+ long n;
+
+ n = (d = dirfstat(afd)) != nil ? d->length : 0;
+ free(d);
+ return n;
+}
+
static void
auproc(void *p)
{
--- a/unix/snd_sdl.c
+++ b/unix/snd_sdl.c
@@ -3,6 +3,12 @@
static SDL_AudioDeviceID adev;
+long
+sndqueued(void)
+{
+ return SDL_GetQueuedAudioSize(adev);
+}
+
void
sndstop(void)
{