From c6f101884b282a938c9c996ff613153520367b2a Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 30 Oct 2013 17:06:40 +0100 Subject: CrossFade: use negative value for invalid MixRamp overlap Avoid NaN to allow -ffast-math. --- src/CrossFade.cxx | 17 ++++++++++++----- test/test_mixramp.cxx | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/CrossFade.cxx b/src/CrossFade.cxx index 098987d19..8e6baf885 100644 --- a/src/CrossFade.cxx +++ b/src/CrossFade.cxx @@ -83,7 +83,7 @@ mixramp_interpolate(const char *ramp_list, float required_db) return secs; } - return nan(""); + return -1; } unsigned @@ -96,7 +96,6 @@ CrossFadeSettings::Calculate(float total_time, { unsigned int chunks = 0; float chunks_f; - float mixramp_overlap; if (duration < 0 || duration >= total_time || /* we can't crossfade when the audio formats are different */ @@ -112,9 +111,17 @@ CrossFadeSettings::Calculate(float total_time, chunks = (chunks_f * duration + 0.5); } else { /* Calculate mixramp overlap. */ - mixramp_overlap = mixramp_interpolate(mixramp_start, mixramp_db - replay_gain_db) - + mixramp_interpolate(mixramp_prev_end, mixramp_db - replay_gain_prev_db); - if (!std::isnan(mixramp_overlap) && + const float mixramp_overlap_current = + mixramp_interpolate(mixramp_start, + mixramp_db - replay_gain_db); + const float mixramp_overlap_prev = + mixramp_interpolate(mixramp_prev_end, + mixramp_db - replay_gain_prev_db); + const float mixramp_overlap = + mixramp_overlap_current + mixramp_overlap_prev; + + if (mixramp_overlap_current >= 0 && + mixramp_overlap_prev >= 0 && mixramp_delay <= mixramp_overlap) { chunks = (chunks_f * (mixramp_overlap - mixramp_delay)); FormatDebug(cross_fade_domain, diff --git a/test/test_mixramp.cxx b/test/test_mixramp.cxx index 74d49dd87..0dc67db77 100644 --- a/test/test_mixramp.cxx +++ b/test/test_mixramp.cxx @@ -43,7 +43,7 @@ public: free(foo); foo = strdup(input); - CPPUNIT_ASSERT(std::isnan(mixramp_interpolate(foo, 6.1))); + CPPUNIT_ASSERT(mixramp_interpolate(foo, 6.1) < 0); free(foo); foo = strdup(input); -- cgit v1.2.3