--- np2/sound/psggeng.c 2003/10/16 17:58:05 1.1 +++ np2/sound/psggeng.c 2005/02/07 14:46:12 1.8 @@ -1,4 +1,5 @@ #include "compiler.h" +#include "parts.h" #include "sound.h" #include "psggen.h" @@ -9,17 +10,24 @@ extern PSGGENCFG psggencfg; void SOUNDCALL psggen_getpcm(PSGGEN psg, SINT32 *pcm, UINT count) { SINT32 noisevol; - BYTE mixer; + UINT8 mixer; UINT noisetbl = 0; PSGTONE *tone; PSGTONE *toneterm; SINT32 samp; - UINT psgvol; +// UINT psgvol; SINT32 vol; UINT i; UINT noise; - while(count--) { + if ((psg->mixer & 0x3f) == 0) { + count = min(count, psg->puchicount); + psg->puchicount -= count; + } + if (count == 0) { + return; + } + do { noisevol = 0; if (psg->envcnt) { psg->envcnt--; @@ -42,6 +50,7 @@ void SOUNDCALL psggen_getpcm(PSGGEN psg, psg->envcnt = psg->envmax; psg->envvol = (psg->envvolcnt ^ psg->envmode) & 0x0f; } + psg->evol = psggencfg.volume[psg->envvol]; } } mixer = psg->mixer; @@ -51,7 +60,8 @@ void SOUNDCALL psggen_getpcm(PSGGEN psg, countbak = psg->noise.count; psg->noise.count -= psg->noise.freq; if (psg->noise.count > countbak) { - psg->noise.base = rand() & (1 << (1 << PSGADDEDBIT)); +// psg->noise.base = GETRAND() & (1 << (1 << PSGADDEDBIT)); + psg->noise.base = rand_get() & (1 << (1 << PSGADDEDBIT)); } noisetbl += psg->noise.base; noisetbl >>= 1; @@ -59,16 +69,15 @@ void SOUNDCALL psggen_getpcm(PSGGEN psg, } tone = psg->tone; toneterm = tone + 3; - samp = 0; do { - psgvol = (*(tone->pvol)) & 15; - if (psgvol) { - vol = psggencfg.volume[psgvol]; + vol = *(tone->pvol); + if (vol) { + samp = 0; switch(mixer & 9) { case 0: // no mix if (tone->puchi) { tone->puchi--; - samp += vol; + samp += vol << PSGADDEDBIT; } break; @@ -101,12 +110,16 @@ void SOUNDCALL psggen_getpcm(PSGGEN psg, } break; } + if (!(tone->pan & 1)) { + pcm[0] += samp; + } + if (!(tone->pan & 2)) { + pcm[1] += samp; + } } mixer >>= 1; } while(++tone < toneterm); - pcm[0] += samp; - pcm[1] += samp; pcm += 2; - } + } while(--count); }