Avoid (expensive) audio interpolation when sample rates already match
This commit is contained in:
		| @@ -54,8 +54,9 @@ std::vector<s16> Interpolate(InterpolationState& state, std::vector<s16> input, | |||||||
|             double l = 0.0; |             double l = 0.0; | ||||||
|             double r = 0.0; |             double r = 0.0; | ||||||
|             for (std::size_t j = 0; j < h.size(); j++) { |             for (std::size_t j = 0; j < h.size(); j++) { | ||||||
|                 l += Lanczos(taps, pos + j - taps + 1) * h[j][0]; |                 const double lanczos_calc = Lanczos(taps, pos + j - taps + 1); | ||||||
|                 r += Lanczos(taps, pos + j - taps + 1) * h[j][1]; |                 l += lanczos_calc * h[j][0]; | ||||||
|  |                 r += lanczos_calc * h[j][1]; | ||||||
|             } |             } | ||||||
|             output.emplace_back(static_cast<s16>(std::clamp(l, -32768.0, 32767.0))); |             output.emplace_back(static_cast<s16>(std::clamp(l, -32768.0, 32767.0))); | ||||||
|             output.emplace_back(static_cast<s16>(std::clamp(r, -32768.0, 32767.0))); |             output.emplace_back(static_cast<s16>(std::clamp(r, -32768.0, 32767.0))); | ||||||
|   | |||||||
| @@ -285,8 +285,11 @@ void AudioRenderer::VoiceState::RefreshBuffer() { | |||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     samples = |     // Only interpolate when necessary, expensive. | ||||||
|         Interpolate(interp_state, std::move(samples), GetInfo().sample_rate, STREAM_SAMPLE_RATE); |     if (GetInfo().sample_rate != STREAM_SAMPLE_RATE) { | ||||||
|  |         samples = Interpolate(interp_state, std::move(samples), GetInfo().sample_rate, | ||||||
|  |                               STREAM_SAMPLE_RATE); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     is_refresh_pending = false; |     is_refresh_pending = false; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user