diff options
| author | 2020-09-11 10:57:27 -0400 | |
|---|---|---|
| committer | 2020-09-11 10:57:27 -0400 | |
| commit | 324029d4f9fd2381f474e608a2859360324161e5 (patch) | |
| tree | d2dc348235f05f20686c526f7092590f596f65c2 /src/audio_core/algorithm | |
| parent | Merge pull request #4597 from Morph1984/mjolnir-p2 (diff) | |
| parent | Preliminary effects (diff) | |
| download | yuzu-324029d4f9fd2381f474e608a2859360324161e5.tar.gz yuzu-324029d4f9fd2381f474e608a2859360324161e5.tar.xz yuzu-324029d4f9fd2381f474e608a2859360324161e5.zip | |
Merge pull request #4310 from ogniK5377/apollo-1-prod
audio_core: Apollo Part 1, AudioRenderer refactor
Diffstat (limited to 'src/audio_core/algorithm')
| -rw-r--r-- | src/audio_core/algorithm/interpolate.cpp | 32 | ||||
| -rw-r--r-- | src/audio_core/algorithm/interpolate.h | 3 |
2 files changed, 35 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, | |||
| 197 | return output; | 197 | return output; |
| 198 | } | 198 | } |
| 199 | 199 | ||
| 200 | void Resample(s32* output, const s32* input, s32 pitch, s32& fraction, std::size_t sample_count) { | ||
| 201 | const std::array<s16, 512>& lut = [pitch] { | ||
| 202 | if (pitch > 0xaaaa) { | ||
| 203 | return curve_lut0; | ||
| 204 | } | ||
| 205 | if (pitch <= 0x8000) { | ||
| 206 | return curve_lut1; | ||
| 207 | } | ||
| 208 | return curve_lut2; | ||
| 209 | }(); | ||
| 210 | |||
| 211 | std::size_t index{}; | ||
| 212 | |||
| 213 | for (std::size_t i = 0; i < sample_count; i++) { | ||
| 214 | const std::size_t lut_index{(static_cast<std::size_t>(fraction) >> 8) * 4}; | ||
| 215 | const auto l0 = lut[lut_index + 0]; | ||
| 216 | const auto l1 = lut[lut_index + 1]; | ||
| 217 | const auto l2 = lut[lut_index + 2]; | ||
| 218 | const auto l3 = lut[lut_index + 3]; | ||
| 219 | |||
| 220 | const auto s0 = static_cast<s32>(input[index]); | ||
| 221 | const auto s1 = static_cast<s32>(input[index + 1]); | ||
| 222 | const auto s2 = static_cast<s32>(input[index + 2]); | ||
| 223 | const auto s3 = static_cast<s32>(input[index + 3]); | ||
| 224 | |||
| 225 | output[i] = (l0 * s0 + l1 * s1 + l2 * s2 + l3 * s3) >> 15; | ||
| 226 | fraction += pitch; | ||
| 227 | index += (fraction >> 15); | ||
| 228 | fraction &= 0x7fff; | ||
| 229 | } | ||
| 230 | } | ||
| 231 | |||
| 200 | } // namespace AudioCore | 232 | } // namespace AudioCore |
diff --git a/src/audio_core/algorithm/interpolate.h b/src/audio_core/algorithm/interpolate.h index ab1a31754..d534077af 100644 --- a/src/audio_core/algorithm/interpolate.h +++ b/src/audio_core/algorithm/interpolate.h | |||
| @@ -38,4 +38,7 @@ inline std::vector<s16> Interpolate(InterpolationState& state, std::vector<s16> | |||
| 38 | return Interpolate(state, std::move(input), ratio); | 38 | return Interpolate(state, std::move(input), ratio); |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | /// Nintendo Switchs DSP resampling algorithm. Based on a single channel | ||
| 42 | void Resample(s32* output, const s32* input, s32 pitch, s32& fraction, std::size_t sample_count); | ||
| 43 | |||
| 41 | } // namespace AudioCore | 44 | } // namespace AudioCore |