From 9e3ebdb1f7a6bc9079955e921e19db50443125d6 Mon Sep 17 00:00:00 2001 From: Kp Date: Sat, 7 Jan 2023 22:17:31 +0000 Subject: [PATCH] Add static asserts that the custom resampler does not truncate input --- similar/arch/sdl/digi_mixer.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/similar/arch/sdl/digi_mixer.cpp b/similar/arch/sdl/digi_mixer.cpp index 4d36b7b1d..0a3d193b0 100644 --- a/similar/arch/sdl/digi_mixer.cpp +++ b/similar/arch/sdl/digi_mixer.cpp @@ -234,10 +234,18 @@ static auto upsample(const std::span input, const std::size_t ups */ unique_span result(upsampledLen); const auto output{result.span()}; + using output_type = decltype(output)::value_type; for (const auto ii : xrange(input.size())) { + /* Assert that the minimum and maximum possible values in the input can + * be represented in the output without truncation. */ + using conversion_type = int16_t; + using input_type = decltype(input)::value_type; + constexpr int8_t convert_u8_to_s8 = INT8_MIN; + static_assert(std::in_range(conversion_type{input_type{0}} + convert_u8_to_s8)); + static_assert(std::in_range(conversion_type{input_type{UINT8_MAX}} + convert_u8_to_s8)); // Save input sample, convert to signed - output[ii*factor] = int16_t{input[ii]} - 128; + output[ii*factor] = conversion_type{input[ii]} + convert_u8_to_s8; } return result; }