--- np2/sound/pcm86c.c 2004/03/30 07:12:03 1.6 +++ np2/sound/pcm86c.c 2004/06/02 11:02:53 1.8 @@ -75,6 +75,7 @@ void pcm86_cb(NEVENTITEM item) { // RECALC_NOWCLKP; if (pcm86.virbuf <= pcm86.fifosize) { pcm86.reqirq = 0; + pcm86.irqflag = 1; pic_setirq(fmtimer.irq); } else { @@ -122,7 +123,9 @@ void SOUNDCALL pcm86gen_checkbuf(void) { past <<= 6; past -= pcm86.lastclock; if (past >= pcm86.stepclock) { - RECALC_NOWCLKWAIT; + past = past / pcm86.stepclock; + pcm86.lastclock += (past * pcm86.stepclock); + RECALC_NOWCLKWAIT(past); } bufs = pcm86.realbuf - pcm86.virbuf; @@ -131,6 +134,7 @@ void SOUNDCALL pcm86gen_checkbuf(void) { pcm86.virbuf += bufs; if (pcm86.virbuf <= pcm86.fifosize) { pcm86.reqirq = 0; + pcm86.irqflag = 1; pic_setirq(fmtimer.irq); } else { @@ -150,9 +154,14 @@ void SOUNDCALL pcm86gen_checkbuf(void) { BOOL pcm86gen_intrq(void) { + if (pcm86.irqflag) { + return(TRUE); + } if (pcm86.fifo & 0x20) { sound_sync(); - if ((pcm86.write) && (pcm86.virbuf <= pcm86.fifosize)) { + if ((pcm86.reqirq) && (pcm86.virbuf <= pcm86.fifosize)) { + pcm86.reqirq = 0; + pcm86.irqflag = 1; return(TRUE); } }