diff options
author | bunnei <bunneidev@gmail.com> | 2020-09-11 16:57:27 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-11 16:57:27 +0200 |
commit | 324029d4f9fd2381f474e608a2859360324161e5 (patch) | |
tree | d2dc348235f05f20686c526f7092590f596f65c2 /src/audio_core/algorithm/interpolate.cpp | |
parent | Merge pull request #4597 from Morph1984/mjolnir-p2 (diff) | |
parent | Preliminary effects (diff) | |
download | yuzu-324029d4f9fd2381f474e608a2859360324161e5.tar yuzu-324029d4f9fd2381f474e608a2859360324161e5.tar.gz yuzu-324029d4f9fd2381f474e608a2859360324161e5.tar.bz2 yuzu-324029d4f9fd2381f474e608a2859360324161e5.tar.lz yuzu-324029d4f9fd2381f474e608a2859360324161e5.tar.xz yuzu-324029d4f9fd2381f474e608a2859360324161e5.tar.zst yuzu-324029d4f9fd2381f474e608a2859360324161e5.zip |
Diffstat (limited to 'src/audio_core/algorithm/interpolate.cpp')
-rw-r--r-- | src/audio_core/algorithm/interpolate.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/audio_core/algorithm/interpolate.cpp b/src/audio_core/algorithm/interpolate.cpp index 49ab9d3e1..689a54508 100644 --- a/src/audio_core/algorithm/interpolate.cpp +++ b/src/audio_core/algorithm/interpolate.cpp @@ -197,4 +197,36 @@ std::vector<s16> Interpolate(InterpolationState& state, std::vector<s16> input, return output; } +void Resample(s32* output, const s32* input, s32 pitch, s32& fraction, std::size_t sample_count) { + const std::array<s16, 512>& lut = [pitch] { + if (pitch > 0xaaaa) { + return curve_lut0; + } + if (pitch <= 0x8000) { + return curve_lut1; + } + return curve_lut2; + }(); + + std::size_t index{}; + + for (std::size_t i = 0; i < sample_count; i++) { + const std::size_t lut_index{(static_cast<std::size_t>(fraction) >> 8) * 4}; + const auto l0 = lut[lut_index + 0]; + const auto l1 = lut[lut_index + 1]; + const auto l2 = lut[lut_index + 2]; + const auto l3 = lut[lut_index + 3]; + + const auto s0 = static_cast<s32>(input[index]); + const auto s1 = static_cast<s32>(input[index + 1]); + const auto s2 = static_cast<s32>(input[index + 2]); + const auto s3 = static_cast<s32>(input[index + 3]); + + output[i] = (l0 * s0 + l1 * s1 + l2 * s2 + l3 * s3) >> 15; + fraction += pitch; + index += (fraction >> 15); + fraction &= 0x7fff; + } +} + } // namespace AudioCore |