--- np2/sound/beepg.c 2003/10/16 17:58:03 1.1.1.1 +++ np2/sound/beepg.c 2011/01/15 18:04:43 1.7 @@ -1,103 +1,159 @@ #include "compiler.h" -#include "pccore.h" #include "sound.h" #include "beep.h" extern BEEPCFG beepcfg; - static void oneshot(BEEP bp, SINT32 *pcm, UINT count) { - SINT32 vol; - SINT32 samp; - SINT32 remain; - BPEVENT *bev; + SINT32 vol; +const BPEVENT *bev; + SINT32 clk; + int event; + SINT32 remain; + SINT32 samp; - vol = beepcfg.vol << 11; + vol = beepcfg.vol; bev = bp->event; - + if (bp->events) { + bp->events--; + clk = bev->clock; + event = bev->enable; + bev++; + } + else { + clk = 0x40000000; + event = bp->lastenable; + } do { - remain = pc.sampleclock; + remain = (1 << 16); samp = 0; - while(remain >= bev->clock) { - if (--bp->events) { - remain -= bev->clock; - if (bp->lastenable) { - samp += bev->clock; - } - bp->lastenable = bev->enable; + while(remain >= clk) { + remain -= clk; + if (bp->lastenable) { + samp += clk; + } + bp->lastenable = event; + if (bp->events) { + bp->events--; + clk = bev->clock; + event = bev->enable; bev++; } - else { // サンプルがぽなくなり - if (bp->lastenable) { - samp += remain; - samp *= vol; - samp /= pc.sampleclock; - do { - pcm[0] += samp; - pcm[1] += samp; - pcm += 2; - samp >>= 1; - } while(--count); - } - else { - samp *= vol; - samp /= pc.sampleclock; - pcm[0] += samp; - pcm[1] += samp; - } - return; + else { + clk = 0x40000000; } } - bev->clock -= remain; + clk -= remain; if (bp->lastenable) { samp += remain; } samp *= vol; - samp /= pc.sampleclock; + samp >>= (16 - 10); pcm[0] += samp; pcm[1] += samp; pcm += 2; } while(--count); + bp->lastenable = event; + bp->events = 0; } -static void rategenerate(BEEP bp, SINT32 *pcm, UINT count) { +static void rategenerator(BEEP bp, SINT32 *pcm, UINT count) { - UINT vol; - SINT32 samp; - UINT r; + SINT32 vol; +const BPEVENT *bev; + SINT32 samp; + SINT32 remain; + SINT32 clk; + int event; + UINT r; - vol = beepcfg.vol << 8; + vol = beepcfg.vol; + bev = bp->event; + if (bp->events) { + bp->events--; + clk = bev->clock; + event = bev->enable; + bev++; + } + else { + clk = 0x40000000; + event = bp->lastenable; + } do { - samp = 0; - r = 4; - do { - bp->cnt += bp->hz; - samp += vol * ((bp->cnt & 0x8000)?1:-1); - } while(--r); - pcm[0] += samp; - pcm[1] += samp; - pcm += 2; - } while(--count); + if (clk >= (1 << 16)) { + r = clk >> 16; + r = min(r, count); + clk -= r << 16; + count -= r; + if (bp->lastenable) { + do { + samp = (bp->cnt & 0x8000)?1:-1; + bp->cnt += bp->hz; + samp += (bp->cnt & 0x8000)?1:-1; + bp->cnt += bp->hz; + samp += (bp->cnt & 0x8000)?1:-1; + bp->cnt += bp->hz; + samp += (bp->cnt & 0x8000)?1:-1; + bp->cnt += bp->hz; + samp *= vol; + samp <<= (10 - 2); + pcm[0] += samp; + pcm[1] += samp; + pcm += 2; + } while(--r); + } + else { + pcm += 2 * r; + } + } + else { + remain = (1 << 16); + samp = 0; + while(remain >= clk) { + remain -= clk; + if (bp->lastenable) { + samp += clk; + } + bp->lastenable = event; + bp->cnt = 0; + if (bp->events) { + bp->events--; + clk = bev->clock; + event = bev->enable; + bev++; + } + else { + clk = 0x40000000; + } + } + clk -= remain; + if (bp->lastenable) { + samp += remain; + } + samp *= vol; + samp >>= (16 - 10); + pcm[0] += samp; + pcm[1] += samp; + pcm += 2; + count--; + } + } while(count); + bp->lastenable = event; + bp->events = 0; } void SOUNDCALL beep_getpcm(BEEP bp, SINT32 *pcm, UINT count) { if ((count) && (beepcfg.vol)) { if (bp->mode == 0) { - if ((bp->events) && (pc.sampleclock)) { + if (bp->events) { oneshot(bp, pcm, count); } } else if (bp->mode == 1) { - if (bp->buz) { - if (bp->hz) { - rategenerate(bp, pcm, count); - } - else { - } - } + rategenerator(bp, pcm, count); } } }