From 90148cbe87e347d9cc9a86d11e76ba1615291805 Mon Sep 17 00:00:00 2001 From: aiju Date: Wed, 19 Mar 2014 20:25:06 +0100 Subject: games/snes: audio improvements --- sys/src/games/snes/dsp.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) (limited to 'sys/src') diff --git a/sys/src/games/snes/dsp.c b/sys/src/games/snes/dsp.c index 353fcbd07..019b93cd4 100644 --- a/sys/src/games/snes/dsp.c +++ b/sys/src/games/snes/dsp.c @@ -159,7 +159,7 @@ typedef struct { u8int *r; u16int hdrp, dp, sp; - u8int hdr; + u8int hdr, bp; u16int brr; u8int envst; @@ -167,7 +167,7 @@ typedef struct { u8int init; u16int interp; - s16int buf[12]; + s16int buf[24]; u16int pitch; s16int sample, modin; @@ -243,8 +243,8 @@ decode(vctxt *p) f = (p->hdr >> 2) & 3; s = p->hdr >> 4; brr = p->brr; - s1 = p->buf[7]; - s2 = p->buf[6]; + s1 = p->buf[p->bp + 11]; + s2 = p->buf[p->bp + 10]; for(i = 0; i < 4; i++){ d = brr >> 12; if(s >= 13) @@ -273,11 +273,14 @@ decode(vctxt *p) break; } d = (s16int)(clamp16(d) << 1); - p->buf[8 + i] = d; + p->buf[p->bp] = d; + p->buf[p->bp++ + 12] = d; s1 = d; s2 = s1; brr <<= 4; } + if(p->bp == 12) + p->bp = 0; } static s16int @@ -337,6 +340,8 @@ voice(int n, int s) } if((dsp[INT|NON] & 1<sample = noise; + else + p->sample = interp(p->interp, p->buf + p->bp); p->sample = (((int)p->sample * p->env) >> 11) & ~1; p->modin = p->sample; r[INT|OUTX] = p->sample >> 8; @@ -362,10 +367,11 @@ voice(int n, int s) if(p->init == 1){ p->hdrp = p->sp; p->dp = p->hdrp + 1; + p->bp = 0; } if(p->interp >= 0x4000 || p->init <= 4 && p->init >= 2){ - memmove(p->buf, p->buf + 4, 8 * sizeof(s16int)); p->brr |= spcmem[++p->dp]; + decode(p); if(++p->dp == p->hdrp + 9){ if((p->hdr & 1) != 0){ dsp[INT|ENDX] |= 1<hdrp += 9; p->dp = p->hdrp + 1; } - decode(p); } - if(p->interp >= 0x4000) - p->interp -= 0x4000; - p->interp += p->pitch; + p->interp = (p->interp & 0x3fff) + p->pitch; if(p->interp >= 0x7fff) p->interp = 0x7fff; break; @@ -387,7 +390,6 @@ voice(int n, int s) samp[1] = clamp16(samp[1] + v); if((dsp[INT|EON] & (1<sample = interp(p->interp, p->buf); break; case 7: m = 1<