From 174c454a98a71475b72958c9f76293af7d6fb502 Mon Sep 17 00:00:00 2001 From: notaz Date: Wed, 21 Sep 2011 04:03:48 +0300 Subject: spu: get rid of pCurr -1, pass right chans to silent handler pCurr -1 would work weird with savestates and could screw things up in general.. --- plugins/dfsound/externals.h | 1 + plugins/dfsound/freeze.c | 2 ++ plugins/dfsound/registers.c | 2 ++ plugins/dfsound/spu.c | 36 +++++++++++++++++++++--------------- 4 files changed, 26 insertions(+), 15 deletions(-) (limited to 'plugins') diff --git a/plugins/dfsound/externals.h b/plugins/dfsound/externals.h index c69af81..5d72002 100644 --- a/plugins/dfsound/externals.h +++ b/plugins/dfsound/externals.h @@ -227,6 +227,7 @@ extern int bSpuInit; extern unsigned int dwNewChannel; extern unsigned int dwChannelOn; extern unsigned int dwPendingChanOff; +extern unsigned int dwChannelDead; extern int SSumR[]; extern int SSumL[]; diff --git a/plugins/dfsound/freeze.c b/plugins/dfsound/freeze.c index 41c6f16..d09a9b0 100644 --- a/plugins/dfsound/freeze.c +++ b/plugins/dfsound/freeze.c @@ -315,6 +315,7 @@ void LoadStateV5(SPUFreeze_t * pF) dwNewChannel=0; dwChannelOn=0; + dwChannelDead=0; for(i=0;is_chan[i],i); @@ -341,6 +342,7 @@ void LoadStateUnknown(SPUFreeze_t * pF) dwNewChannel=0; dwChannelOn=0; + dwChannelDead=0; pSpuIrq=0; for(i=0;i<0xc0;i++) diff --git a/plugins/dfsound/registers.c b/plugins/dfsound/registers.c index 83b9e43..f6c3058 100644 --- a/plugins/dfsound/registers.c +++ b/plugins/dfsound/registers.c @@ -169,6 +169,7 @@ void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val) s_chan[ch].pLoop=spuMemC+((unsigned long)((val<<3)&~0xf)); //s_chan[ch].bIgnoreLoop=1; //ReleaseMutex(s_chan[ch].hMutex); // -> oki, on with the thread + dwChannelDead&=~(1< turn everything off dwPendingChanOff&=~(1< and done for this channel } //////////////////////////////////////////// irq check @@ -495,8 +494,11 @@ static int decode_block(int ch) start = s_chan[ch].pLoop; } - if (start - spuMemC >= 0x80000) - start = (unsigned char*)-1; + if (start - spuMemC >= 0x80000) { + // most likely wrong + start = spuMemC; + printf("ch%d oflow\n", ch); + } s_chan[ch].pCurr = start; // store values for next cycle @@ -697,7 +699,7 @@ static void *MAINThread(void *arg) { int volmult = iVolume; int ns,ns_from,ns_to; - int ch,d; + int ch,d,silentch; int bIRQReturn=0; while(!bEndThread) // until we are shutting down @@ -737,6 +739,8 @@ static void *MAINThread(void *arg) ch=lastch; ns_from=lastns; lastch=-1; // -> setup all kind of vars to continue } + silentch=~(dwChannelOn|dwNewChannel); + //--------------------------------------------------// //- main channel loop -// //--------------------------------------------------// @@ -782,9 +786,8 @@ static void *MAINThread(void *arg) if(!bIRQReturn && (spuCtrl&CTRL_IRQ)) for(ch=0;ch pSpuIrq && s_chan[ch].pLoop > pSpuIrq) continue; @@ -801,7 +804,7 @@ static void *MAINThread(void *arg) if(start == s_chan[ch].pCurr) { // looping on self - s_chan[ch].pCurr=(unsigned char *)-1; + dwChannelDead|=1<