| return; | return; | ||||
| } | } | ||||
| if (modinput) { | if (modinput) { | ||||
| const uint32_t _duration = duration; | |||||
| uint32_t _elapsed = elapsed; | |||||
| int32_t _magnitude = magnitude; | |||||
| for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { | for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { | ||||
| elapsed += 65536; | |||||
| _elapsed += 65536; | |||||
| int32_t in = modinput->data[i]; | int32_t in = modinput->data[i]; | ||||
| if (magnitude < 0) in = -in; | |||||
| uint32_t dur = ((uint64_t)(in + 32768) * duration) >> 15; | |||||
| if (elapsed < dur) { | |||||
| out = magnitude; | |||||
| if (_magnitude < 0) in = -in; | |||||
| uint32_t dur = ((uint64_t)(in + 32768) * _duration) >> 15; | |||||
| if (_elapsed < dur) { | |||||
| out = _magnitude; | |||||
| } else { | } else { | ||||
| int32_t e = elapsed - dur; | |||||
| int32_t e = _elapsed - dur; | |||||
| signed_saturate_rshift(e, 17, 0); | |||||
| if (e < 0) e = 0; | if (e < 0) e = 0; | ||||
| else if (e > 65535) e = 65535; | |||||
| elapsed = e; | |||||
| _elapsed = e; | |||||
| // elapsed must be 0 to 65535 | // elapsed must be 0 to 65535 | ||||
| // magnitude must be -32767 to +32767 | // magnitude must be -32767 to +32767 | ||||
| out = magnitude - ((magnitude * elapsed * 2) >> 16); | |||||
| magnitude = -magnitude; | |||||
| out = _magnitude - ((_magnitude * _elapsed) >> 15); | |||||
| _magnitude = -_magnitude; | |||||
| } | } | ||||
| block->data[i] = out; | block->data[i] = out; | ||||
| } | } | ||||
| elapsed = _elapsed; | |||||
| magnitude = _magnitude; | |||||
| release(modinput); | release(modinput); | ||||
| } else { | } else { | ||||
| for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { | for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { | ||||
| elapsed -= duration; | elapsed -= duration; | ||||
| // elapsed must be 0 to 65535 | // elapsed must be 0 to 65535 | ||||
| // magnitude must be -32767 to +32767 | // magnitude must be -32767 to +32767 | ||||
| out = magnitude - ((magnitude * elapsed * 2) >> 16); | |||||
| out = magnitude - ((magnitude * elapsed) >> 15); | |||||
| magnitude = -magnitude; | magnitude = -magnitude; | ||||
| } | } | ||||
| block->data[i] = out; | block->data[i] = out; |