+ adsr->EnvelopeVol = EnvelopeVol;\r
+ return ns;\r
+}\r
+\r
+static int SkipADSR(ADSRInfoEx *adsr, int ns_to)\r
+{\r
+ int EnvelopeVol = adsr->EnvelopeVol;\r
+ int ns = 0, val, rto, level;\r
+ int64_t v64;\r
+\r
+ if (adsr->State == ADSR_RELEASE)\r
+ {\r
+ val = RateTableSub[adsr->ReleaseRate * 4];\r
+ if (adsr->ReleaseModeExp)\r
+ {\r
+ for (; ns < ns_to; ns++)\r
+ {\r
+ EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16);\r
+ if (EnvelopeVol <= 0)\r
+ break;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ v64 = EnvelopeVol;\r
+ v64 += (int64_t)val * ns_to;\r
+ EnvelopeVol = (int)v64;\r
+ if (v64 > 0)\r
+ ns = ns_to;\r
+ }\r
+ goto done;\r
+ }\r
+\r
+ switch (adsr->State)\r
+ {\r
+ case ADSR_ATTACK: // -> attack\r
+ rto = 0;\r
+ if (adsr->AttackModeExp && EnvelopeVol >= 0x60000000)\r
+ rto = 8;\r
+ val = RateTableAdd[adsr->AttackRate + rto];\r
+\r
+ for (; ns < ns_to; ns++)\r
+ {\r
+ EnvelopeVol += val;\r
+ if (EnvelopeVol < 0)\r
+ break;\r
+ }\r
+ if (EnvelopeVol < 0) // overflow\r
+ {\r
+ EnvelopeVol = 0x7fffffff;\r
+ adsr->State = ADSR_DECAY;\r
+ ns++;\r
+ goto decay;\r
+ }\r
+ break;\r
+\r
+ //--------------------------------------------------//\r
+ decay:\r
+ case ADSR_DECAY: // -> decay\r
+ val = RateTableSub[adsr->DecayRate * 4];\r
+ level = adsr->SustainLevel;\r