From a5c2ef273f6787b7a7e77046bfe3e57908cc2f64 Mon Sep 17 00:00:00 2001
From: Thomas Goyne <plorkyeran@aegisub.org>
Date: Thu, 10 Jul 2014 10:27:48 -0700
Subject: [PATCH] Add tests for floating point sample conversion

---
 libaegisub/audio/provider_convert.cpp |  9 ++----
 tests/tests/audio.cpp                 | 40 +++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 6 deletions(-)

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<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 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<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");
 	{
-- 
GitLab