case 14: // loop?\r
//WaitForSingleObject(s_chan[ch].hMutex,2000); // -> no multithread fuckups\r
s_chan[ch].pLoop=spuMemC+((unsigned long)((val<<3)&~0xf));\r
- s_chan[ch].bIgnoreLoop=1;\r
+ //s_chan[ch].bIgnoreLoop=1;\r
//ReleaseMutex(s_chan[ch].hMutex); // -> oki, on with the thread\r
break;\r
//------------------------------------------------//\r
{
// We play this block out first...
//if(!(flags&2)) // 1+2: do loop... otherwise: stop
- if(flags!=3 || s_chan[ch].pLoop==NULL) // PETE: if we don't check exactly for 3, loop hang ups will happen (DQ4, for example)
- { // and checking if pLoop is set avoids crashes, yeah
+ if((flags!=3 && flags!=7) // PETE: if we don't check exactly for 3, loop hang ups will happen (DQ4, for example)
+ || s_chan[ch].pLoop==NULL) // and checking if pLoop is set avoids crashes, yeah
+ {
start = (unsigned char*)-1;
+ // Actua Soccer 2, Jungle Book, other games that check for this condition
+ s_chan[ch].ADSRX.EnvelopeVol = 0;
}
else
{
}
}
+ if (start - spuMemC >= 0x80000)
+ start = (unsigned char*)-1;
+
s_chan[ch].pCurr=start; // store values for next cycle
s_chan[ch].s_1=s_1;
s_chan[ch].s_2=s_2;