summaryrefslogtreecommitdiff
path: root/sys/src/games/nes/apu.c
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2014-02-24 19:33:26 +0100
committeraiju <devnull@localhost>2014-02-24 19:33:26 +0100
commit9486df09c2455ee3b22df8507db77e7d7276ad58 (patch)
treecb2fb874b0699b16fa44bba826eca5d0ec8fec9d /sys/src/games/nes/apu.c
parentad9047ab2cdbdbc5897d799fecacdda98f6cd707 (diff)
games/nes: best commit (fixed audio and timing)
Diffstat (limited to 'sys/src/games/nes/apu.c')
-rw-r--r--sys/src/games/nes/apu.c46
1 files changed, 26 insertions, 20 deletions
diff --git a/sys/src/games/nes/apu.c b/sys/src/games/nes/apu.c
index f34704506..53b851d86 100644
--- a/sys/src/games/nes/apu.c
+++ b/sys/src/games/nes/apu.c
@@ -5,10 +5,11 @@
#include "dat.h"
#include "fns.h"
+enum { MAXBUF = 2000 };
+
u8int apuseq, apuctr[10];
static int fd;
-
-enum { RATE = 44100 };
+static short sbuf[2*MAXBUF], *sbufp;
int
targperiod(int i)
@@ -204,31 +205,36 @@ dmc(void)
return 0;
}
-static void
-sample(short *s)
+void
+audiosample(void)
{
double d;
+ if(sbufp == nil)
+ return;
d = 95.88 / (8128.0 / (0.01 + pulse(0) + pulse(1)) + 100);
d += 159.79 / (1.0 / (0.01 + tri()/8227.0 + noise()/12241.0 + dmc()/22638.0) + 100.0);
- *s++ = d * 20000;
- *s = d * 20000;
+ if(sbufp < sbuf + nelem(sbuf) - 1){
+ *sbufp++ = d * 20000;
+ *sbufp++ = d * 20000;
+ }
}
-static void
-audioproc(void *)
+int
+audioout(void)
{
- static short samples[500 * 2];
- int i;
-
- for(;;){
- if(paused)
- memset(samples, 0, sizeof samples);
- else
- for(i = 0; i < sizeof samples/4; i++)
- sample(samples + 2 * i);
- write(fd, samples, sizeof samples);
- }
+ int rc;
+
+ if(sbufp == nil)
+ return -1;
+ if(sbufp == sbuf)
+ return 0;
+ rc = write(fd, sbuf, (sbufp - sbuf) * 2);
+ if(rc > 0)
+ sbufp -= (rc+1)/2;
+ if(sbufp < sbuf)
+ sbufp = sbuf;
+ return 0;
}
void
@@ -237,7 +243,7 @@ initaudio(void)
fd = open("/dev/audio", OWRITE);
if(fd < 0)
return;
- proccreate(audioproc, nil, 8192);
+ sbufp = sbuf;
}
u8int apulen[32] = {