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 r = 0.0; | ||||
|             for (std::size_t j = 0; j < h.size(); j++) { | ||||
|                 l += Lanczos(taps, pos + j - taps + 1) * h[j][0]; | ||||
|                 r += Lanczos(taps, pos + j - taps + 1) * h[j][1]; | ||||
|                 const double lanczos_calc = Lanczos(taps, pos + j - taps + 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(r, -32768.0, 32767.0))); | ||||
|   | ||||
| @@ -285,8 +285,11 @@ void AudioRenderer::VoiceState::RefreshBuffer() { | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     samples = | ||||
|         Interpolate(interp_state, std::move(samples), GetInfo().sample_rate, STREAM_SAMPLE_RATE); | ||||
|     // Only interpolate when necessary, expensive. | ||||
|     if (GetInfo().sample_rate != STREAM_SAMPLE_RATE) { | ||||
|         samples = Interpolate(interp_state, std::move(samples), GetInfo().sample_rate, | ||||
|                               STREAM_SAMPLE_RATE); | ||||
|     } | ||||
|  | ||||
|     is_refresh_pending = false; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user