mirror of https://github.com/PCSX2/pcsx2.git
Simplify the code in MixADSR, and restore a few values I changed inadvertantly.
git-svn-id: http://pcsx2-playground.googlecode.com/svn/trunk@506 a6443dda-0b58-4228-96e9-037be469359c
This commit is contained in:
parent
4531a1406f
commit
8b00b31411
|
@ -397,29 +397,18 @@ int MixADSR(VOICE_PROCESSED* pvoice) // MIX ADSR
|
||||||
|
|
||||||
if (pvoice->bStop) // should be stopped:
|
if (pvoice->bStop) // should be stopped:
|
||||||
{
|
{
|
||||||
if (pvoice->bIgnoreLoop == 0)
|
|
||||||
{
|
|
||||||
pvoice->ADSRX.EnvelopeVol=0;
|
|
||||||
pvoice->bOn=false;
|
|
||||||
pvoice->pStart= (u8*)(spu2mem+pvoice->iStartAddr);
|
|
||||||
pvoice->pLoop= (u8*)(spu2mem+pvoice->iStartAddr);
|
|
||||||
pvoice->pCurr= (u8*)(spu2mem+pvoice->iStartAddr);
|
|
||||||
pvoice->bStop=true;
|
|
||||||
pvoice->bIgnoreLoop=false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pvoice->ADSRX.ReleaseModeExp) // do release
|
if (pvoice->ADSRX.ReleaseModeExp) // do release
|
||||||
{
|
{
|
||||||
s32 temp = ((pvoice->ADSRX.EnvelopeVol>>28)&0x7);
|
s32 temp = ((pvoice->ADSRX.EnvelopeVol>>28)&0x7);
|
||||||
pvoice->ADSRX.EnvelopeVol-=RateTable[(4*(pvoice->ADSRX.ReleaseRate^0x1F))-0x18 + rateadd[temp] + 32];
|
pvoice->ADSRX.EnvelopeVol-=RateTable[(4*(pvoice->ADSRX.ReleaseRate^0x1F)) - 0x18 + rateadd[temp] + 32];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pvoice->ADSRX.EnvelopeVol-=RateTable[(4*(pvoice->ADSRX.ReleaseRate^0x1F))-0x0C + 32];
|
pvoice->ADSRX.EnvelopeVol-=RateTable[(4*(pvoice->ADSRX.ReleaseRate^0x1F)) - 0x0C + 32];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pvoice->ADSRX.EnvelopeVol<0)
|
// bIgnoreLoop sets EnvelopeVol to 0 anyways, so we can use one if statement rather then two.
|
||||||
|
if ((pvoice->ADSRX.EnvelopeVol<0) || (pvoice->bIgnoreLoop == 0))
|
||||||
{
|
{
|
||||||
pvoice->ADSRX.EnvelopeVol=0;
|
pvoice->ADSRX.EnvelopeVol=0;
|
||||||
pvoice->bOn=false;
|
pvoice->bOn=false;
|
||||||
|
@ -438,8 +427,11 @@ int MixADSR(VOICE_PROCESSED* pvoice) // MIX ADSR
|
||||||
}
|
}
|
||||||
else // not stopped yet?
|
else // not stopped yet?
|
||||||
{
|
{
|
||||||
if (pvoice->ADSRX.State==0) // -> attack
|
s32 temp = ((pvoice->ADSRX.EnvelopeVol>>28)&0x7);
|
||||||
|
|
||||||
|
switch (pvoice->ADSRX.State)
|
||||||
{
|
{
|
||||||
|
case 0: // -> attack
|
||||||
if (pvoice->ADSRX.AttackModeExp)
|
if (pvoice->ADSRX.AttackModeExp)
|
||||||
{
|
{
|
||||||
if (pvoice->ADSRX.EnvelopeVol<0x60000000)
|
if (pvoice->ADSRX.EnvelopeVol<0x60000000)
|
||||||
|
@ -457,69 +449,47 @@ int MixADSR(VOICE_PROCESSED* pvoice) // MIX ADSR
|
||||||
pvoice->ADSRX.EnvelopeVol=0x7FFFFFFF;
|
pvoice->ADSRX.EnvelopeVol=0x7FFFFFFF;
|
||||||
pvoice->ADSRX.State=1;
|
pvoice->ADSRX.State=1;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
pvoice->ADSRX.lVolume=pvoice->ADSRX.EnvelopeVol>>21;
|
|
||||||
return pvoice->ADSRX.lVolume;
|
|
||||||
}
|
|
||||||
//--------------------------------------------------//
|
|
||||||
if (pvoice->ADSRX.State==1) // -> decay
|
|
||||||
{
|
|
||||||
s32 temp = ((pvoice->ADSRX.EnvelopeVol>>28)&0x7);
|
|
||||||
|
|
||||||
pvoice->ADSRX.EnvelopeVol-=RateTable[(4*(pvoice->ADSRX.ReleaseRate^0x1F))-0x18 + rateadd[temp] + 32];
|
case 1: // -> decay
|
||||||
|
pvoice->ADSRX.EnvelopeVol-=RateTable[(4*(pvoice->ADSRX.DecayRate^0x1F)) - 0x18+ rateadd[temp] + 32];
|
||||||
|
|
||||||
if (pvoice->ADSRX.EnvelopeVol<0)
|
if (pvoice->ADSRX.EnvelopeVol<0) pvoice->ADSRX.EnvelopeVol=0;
|
||||||
pvoice->ADSRX.EnvelopeVol=0;
|
|
||||||
if (((pvoice->ADSRX.EnvelopeVol>>27)&0xF) <= pvoice->ADSRX.SustainLevel)
|
if (((pvoice->ADSRX.EnvelopeVol>>27)&0xF) <= pvoice->ADSRX.SustainLevel)
|
||||||
pvoice->ADSRX.State=2;
|
pvoice->ADSRX.State=2;
|
||||||
|
break;
|
||||||
pvoice->ADSRX.lVolume=pvoice->ADSRX.EnvelopeVol>>21;
|
|
||||||
return pvoice->ADSRX.lVolume;
|
case 2: // -> sustain
|
||||||
}
|
|
||||||
//--------------------------------------------------//
|
|
||||||
if (pvoice->ADSRX.State==2) // -> sustain
|
|
||||||
{
|
|
||||||
if (pvoice->ADSRX.SustainIncrease)
|
if (pvoice->ADSRX.SustainIncrease)
|
||||||
{
|
{
|
||||||
if (pvoice->ADSRX.SustainModeExp)
|
if ((pvoice->ADSRX.SustainModeExp) && (pvoice->ADSRX.EnvelopeVol>=0x60000000))
|
||||||
{
|
pvoice->ADSRX.EnvelopeVol+=RateTable[(pvoice->ADSRX.SustainRate^0x7F) - 0x18 + 32];
|
||||||
if (pvoice->ADSRX.EnvelopeVol<0x60000000)
|
|
||||||
pvoice->ADSRX.EnvelopeVol+=RateTable[(pvoice->ADSRX.SustainRate^0x7F)-0x10 + 32];
|
|
||||||
else
|
|
||||||
pvoice->ADSRX.EnvelopeVol+=RateTable[(pvoice->ADSRX.SustainRate^0x7F)-0x18 + 32];
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
pvoice->ADSRX.EnvelopeVol+=RateTable[(pvoice->ADSRX.SustainRate^0x7F) - 0x10 + 32];
|
||||||
pvoice->ADSRX.EnvelopeVol+=RateTable[(pvoice->ADSRX.SustainRate^0x7F)-0x10 + 32];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pvoice->ADSRX.EnvelopeVol<0)
|
if (pvoice->ADSRX.EnvelopeVol<0) pvoice->ADSRX.EnvelopeVol=0x7FFFFFFF;
|
||||||
{
|
|
||||||
pvoice->ADSRX.EnvelopeVol=0x7FFFFFFF;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (pvoice->ADSRX.SustainModeExp)
|
if (pvoice->ADSRX.SustainModeExp)
|
||||||
{
|
pvoice->ADSRX.EnvelopeVol-=RateTable[((pvoice->ADSRX.SustainRate^0x7F)) - 0x1B +rateadd[temp] + 32];
|
||||||
s32 temp = ((pvoice->ADSRX.EnvelopeVol>>28)&0x7);
|
|
||||||
|
|
||||||
pvoice->ADSRX.EnvelopeVol-=RateTable[(4*(pvoice->ADSRX.ReleaseRate^0x1F))-0x18 + rateadd[temp] + 32];
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
pvoice->ADSRX.EnvelopeVol-=RateTable[((pvoice->ADSRX.SustainRate^0x7F)) - 0x0F + 32];
|
||||||
pvoice->ADSRX.EnvelopeVol-=RateTable[((pvoice->ADSRX.SustainRate^0x7F))-0x0F + 32];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pvoice->ADSRX.EnvelopeVol<0)
|
if (pvoice->ADSRX.EnvelopeVol<0) pvoice->ADSRX.EnvelopeVol=0;
|
||||||
{
|
|
||||||
pvoice->ADSRX.EnvelopeVol=0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
pvoice->ADSRX.lVolume=pvoice->ADSRX.EnvelopeVol>>21;
|
break;
|
||||||
return pvoice->ADSRX.lVolume;
|
|
||||||
|
default:
|
||||||
|
// This should never happen.
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pvoice->ADSRX.lVolume=pvoice->ADSRX.EnvelopeVol>>21;
|
||||||
|
return pvoice->ADSRX.lVolume;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1662,19 +1632,18 @@ void VOICE_PROCESSED::SetVolume(int iProcessRight)
|
||||||
|
|
||||||
if (vol&0x8000) // sweep not working
|
if (vol&0x8000) // sweep not working
|
||||||
{
|
{
|
||||||
short sInc=1; // -> sweep up?
|
short sInc=1; // -> sweep up?
|
||||||
|
|
||||||
if (vol&0x2000) sInc=-1; // -> or down?
|
if (vol&0x2000) sInc=-1; // -> or down?
|
||||||
if (vol&0x1000) vol^=0xffff; // -> mmm... phase inverted? have to investigate this
|
if (vol&0x1000) vol^=0xffff; // -> mmm... phase inverted? have to investigate this
|
||||||
|
|
||||||
vol=((vol&0x7f)+1)/2; // -> sweep: 0..127 -> 0..64
|
vol=((vol&0x7f)+1)/2; // -> sweep: 0..127 -> 0..64
|
||||||
vol+=vol/(2*sInc); // -> HACK: we don't sweep right now, so we just raise/lower the volume by the half!
|
vol+=vol/(2*sInc); // -> HACK: we don't sweep right now, so we just raise/lower the volume by the half!
|
||||||
vol*=128;
|
vol*=128;
|
||||||
}
|
}
|
||||||
else // no sweep:
|
else // no sweep:
|
||||||
{
|
{
|
||||||
if (vol&0x4000) // -> mmm... phase inverted? have to investigate this
|
if (vol&0x4000) vol=0x3fff-(vol&0x3fff); // -> mmm... phase inverted? have to investigate this
|
||||||
vol=0x3fff-(vol&0x3fff);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( iProcessRight )
|
if ( iProcessRight )
|
||||||
|
|
Loading…
Reference in New Issue