diff --git a/libaegisub/audio/provider_convert.cpp b/libaegisub/audio/provider_convert.cpp index 644cb37f2..1de536643 100644 --- a/libaegisub/audio/provider_convert.cpp +++ b/libaegisub/audio/provider_convert.cpp @@ -93,12 +93,9 @@ public: else expanded = static_cast(src_buf[i] * std::numeric_limits::max()); - if (expanded < std::numeric_limits::min()) - dest[i] = std::numeric_limits::min(); - else if (expanded > std::numeric_limits::max()) - dest[i] = std::numeric_limits::max(); - else - dest[i] = static_cast(expanded); + dest[i] = expanded < std::numeric_limits::min() ? std::numeric_limits::min() : + expanded > std::numeric_limits::max() ? std::numeric_limits::max() : + static_cast(expanded); } } }; diff --git a/tests/tests/audio.cpp b/tests/tests/audio.cpp index aedb5fd9a..ba5b0d4cc 100644 --- a/tests/tests/audio.cpp +++ b/tests/tests/audio.cpp @@ -265,6 +265,46 @@ TEST(lagi_audio, stereo_downmix) { EXPECT_EQ(i, samples[i]); } +template +struct FloatAudioProvider : agi::AudioProvider { + FloatAudioProvider() { + channels = 1; + num_samples = 90 * 480000; + decoded_samples = num_samples; + sample_rate = 480000; + bytes_per_sample = sizeof(Float); + float_samples = true; + } + + void FillBuffer(void *buf, int64_t start, int64_t count) const override { + auto out = static_cast(buf); + for (int64_t end = start + count; start < end; ++start) { + auto shifted = start + SHRT_MIN; + *out++ = (Float)(1.0 * shifted / (shifted < 0 ? -SHRT_MIN : SHRT_MAX)); + } + } +}; + +TEST(lagi_audio, float_conversion) { + auto provider = agi::CreateConvertAudioProvider(agi::make_unique>()); + EXPECT_FALSE(provider->AreSamplesFloat()); + + int16_t samples[1 << 16]; + provider->GetAudio(samples, 0, 1 << 16); + for (int i = 0; i < (1 << 16); ++i) + ASSERT_EQ(i + SHRT_MIN, samples[i]); +} + +TEST(lagi_audio, double_conversion) { + auto provider = agi::CreateConvertAudioProvider(agi::make_unique>()); + EXPECT_FALSE(provider->AreSamplesFloat()); + + int16_t samples[1 << 16]; + provider->GetAudio(samples, 0, 1 << 16); + for (int i = 0; i < (1 << 16); ++i) + ASSERT_EQ(i + SHRT_MIN, samples[i]); +} + TEST(lagi_audio, pcm_simple) { auto path = agi::Path().Decode("?temp/pcm_simple"); {