X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=plugins%2Fdfsound%2Fadsr.c;h=c1e98b3227a21678c25c63d2ab92d5da577800aa;hp=e4873dfd418cdf203b0a9beabd7f4b96fbeda27c;hb=bdd050c3ed792381df2e744fee5b7ee80b93fd68;hpb=1ab7621a76d1ef82fde77322c12d4076889bed01 diff --git a/plugins/dfsound/adsr.c b/plugins/dfsound/adsr.c index e4873dfd..c1e98b32 100644 --- a/plugins/dfsound/adsr.c +++ b/plugins/dfsound/adsr.c @@ -46,6 +46,10 @@ void InitADSR(void) // INIT ADSR RateTableAdd[lcv] = ((7 - (lcv&3)) << 16) / denom; RateTableSub[lcv] = ((-8 + (lcv&3)) << 16) / denom; + + // XXX: this is wrong, we need more bits.. + if (RateTableAdd[lcv] == 0) + RateTableAdd[lcv] = 1; } } @@ -67,12 +71,13 @@ static void MixADSR(int ch, int ns, int ns_to) // MIX ADSR if (s_chan[ch].bStop) // should be stopped: { // do release val = RateTableSub[s_chan[ch].ADSRX.ReleaseRate * 4]; + if (s_chan[ch].ADSRX.ReleaseModeExp) { for (; ns < ns_to; ns++) { EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16); - if (EnvelopeVol < 0) + if (EnvelopeVol <= 0) break; ChanBuf[ns] *= EnvelopeVol >> 21; @@ -84,7 +89,7 @@ static void MixADSR(int ch, int ns, int ns_to) // MIX ADSR for (; ns < ns_to; ns++) { EnvelopeVol += val; - if (EnvelopeVol < 0) + if (EnvelopeVol <= 0) break; ChanBuf[ns] *= EnvelopeVol >> 21; @@ -92,7 +97,7 @@ static void MixADSR(int ch, int ns, int ns_to) // MIX ADSR } } - if (EnvelopeVol < 0) + if (EnvelopeVol <= 0) goto stop; goto done; @@ -213,7 +218,7 @@ done: stop: memset(&ChanBuf[ns], 0, (ns_to - ns) * sizeof(ChanBuf[0])); s_chan[ch].ADSRX.EnvelopeVol = 0; - dwChannelOn &= ~(1<