diff --git a/libaegisub/audio/provider_convert.cpp b/libaegisub/audio/provider_convert.cpp index 644cb37f26a58d27e074ec192eda1d945e9235de..1de536643318577841420f56cd8d3a78ba81cb7b 100644 --- a/libaegisub/audio/provider_convert.cpp +++ b/libaegisub/audio/provider_convert.cpp @@ -93,12 +93,9 @@ public: else expanded = static_cast<Target>(src_buf[i] * std::numeric_limits<Target>::max()); - if (expanded < std::numeric_limits<Target>::min()) - dest[i] = std::numeric_limits<Target>::min(); - else if (expanded > std::numeric_limits<Target>::max()) - dest[i] = std::numeric_limits<Target>::max(); - else - dest[i] = static_cast<Target>(expanded); + dest[i] = expanded < std::numeric_limits<Target>::min() ? std::numeric_limits<Target>::min() : + expanded > std::numeric_limits<Target>::max() ? std::numeric_limits<Target>::max() : + static_cast<Target>(expanded); } } }; diff --git a/tests/tests/audio.cpp b/tests/tests/audio.cpp index aedb5fd9aae6ef3baa02b506213563bb1fb8968d..ba5b0d4ccbbecfabf44c9123de0e51df028c82f8 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<typename Float> +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<Float *>(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<FloatAudioProvider<float>>()); + 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<FloatAudioProvider<double>>()); + 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"); {