From 863722545f1d892ce4d30b91f6bf25bb08b48a19 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@musicpd.org>
Date: Sat, 22 Sep 2018 19:08:03 +0200
Subject: [PATCH] player/CrossFade, ...: use lround()

---
 src/Stats.cxx                             | 3 ++-
 src/command/PlayerCommands.cxx            | 6 ++++--
 src/decoder/plugins/FaadDecoderPlugin.cxx | 7 ++++---
 src/output/plugins/HaikuOutputPlugin.cxx  | 4 +++-
 src/pcm/PcmMix.cxx                        | 5 +++--
 src/player/CrossFade.cxx                  | 4 +++-
 6 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/src/Stats.cxx b/src/Stats.cxx
index 0ba5d6b85..d62025c82 100644
--- a/src/Stats.cxx
+++ b/src/Stats.cxx
@@ -31,6 +31,7 @@
 #include "util/ChronoUtil.hxx"
 
 #include <chrono>
+#include <cmath>
 
 #ifndef _WIN32
 /**
@@ -120,7 +121,7 @@ stats_print(Response &r, const Partition &partition)
 #else
 		 (unsigned)std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - start_time).count(),
 #endif
-		 (unsigned long)(partition.pc.GetTotalPlayTime().count() + 0.5));
+		 std::lround(partition.pc.GetTotalPlayTime().count()));
 
 #ifdef ENABLE_DATABASE
 	const Database *db = partition.instance.database;
diff --git a/src/command/PlayerCommands.cxx b/src/command/PlayerCommands.cxx
index 570bc75b8..27147f373 100644
--- a/src/command/PlayerCommands.cxx
+++ b/src/command/PlayerCommands.cxx
@@ -39,6 +39,8 @@
 #include "db/update/Service.hxx"
 #endif
 
+#include <cmath>
+
 #define COMMAND_STATUS_STATE            "state"
 #define COMMAND_STATUS_REPEAT           "repeat"
 #define COMMAND_STATUS_SINGLE           "single"
@@ -151,8 +153,8 @@ handle_status(Client &client, gcc_unused Request args, Response &r)
 		 state);
 
 	if (pc.GetCrossFade() > 0)
-		r.Format(COMMAND_STATUS_CROSSFADE ": %i\n",
-			 int(pc.GetCrossFade() + 0.5));
+		r.Format(COMMAND_STATUS_CROSSFADE ": %lu\n",
+			 std::lround(pc.GetCrossFade()));
 
 	if (pc.GetMixRampDelay() > 0)
 		r.Format(COMMAND_STATUS_MIXRAMPDELAY ": %f\n",
diff --git a/src/decoder/plugins/FaadDecoderPlugin.cxx b/src/decoder/plugins/FaadDecoderPlugin.cxx
index 7fc56b6a0..403feeabc 100644
--- a/src/decoder/plugins/FaadDecoderPlugin.cxx
+++ b/src/decoder/plugins/FaadDecoderPlugin.cxx
@@ -31,6 +31,7 @@
 
 #include <neaacdec.h>
 
+#include <cmath>
 #include <exception>
 
 #include <assert.h>
@@ -386,9 +387,9 @@ faad_stream_decode(DecoderClient &client, InputStream &is,
 		/* update bit rate and position */
 
 		if (frame_info.samples > 0) {
-			bit_rate = frame_info.bytesconsumed * 8.0 *
-			    frame_info.channels * audio_format.sample_rate /
-			    frame_info.samples / 1000 + 0.5;
+			bit_rate = lround(frame_info.bytesconsumed * 8.0 *
+					  frame_info.channels * audio_format.sample_rate /
+					  frame_info.samples / 1000);
 		}
 
 		/* send PCM samples to MPD */
diff --git a/src/output/plugins/HaikuOutputPlugin.cxx b/src/output/plugins/HaikuOutputPlugin.cxx
index 578d701f6..a18aa34f4 100644
--- a/src/output/plugins/HaikuOutputPlugin.cxx
+++ b/src/output/plugins/HaikuOutputPlugin.cxx
@@ -38,6 +38,8 @@
 #include <StringList.h>
 #include <SoundPlayer.h>
 
+#include <cmath>
+
 #include <string.h>
 
 #define UTF8_PLAY "\xE2\x96\xB6"
@@ -439,7 +441,7 @@ haiku_output_get_volume(HaikuOutput &haiku)
 	if (soundPlayer == NULL || soundPlayer->InitCheck() != B_OK)
 		return 0;
 
-	return (int)(soundPlayer->Volume() * 100 + 0.5);
+	return lround(soundPlayer->Volume() * 100);
 }
 
 bool
diff --git a/src/pcm/PcmMix.cxx b/src/pcm/PcmMix.cxx
index 2af4f3dac..8f0291667 100644
--- a/src/pcm/PcmMix.cxx
+++ b/src/pcm/PcmMix.cxx
@@ -26,8 +26,9 @@
 
 #include "PcmDither.cxx" // including the .cxx file to get inlined templates
 
+#include <cmath>
+
 #include <assert.h>
-#include <math.h>
 
 template<SampleFormat F, class Traits=SampleTraits<F>>
 static typename Traits::value_type
@@ -225,7 +226,7 @@ pcm_mix(PcmDither &dither, void *buffer1, const void *buffer2, size_t size,
 	s = sin(M_PI_2 * portion1);
 	s *= s;
 
-	int vol1 = s * PCM_VOLUME_1S + 0.5;
+	int vol1 = std::lround(s * PCM_VOLUME_1S);
 	vol1 = Clamp<int>(vol1, 0, PCM_VOLUME_1S);
 
 	return pcm_add_vol(dither, buffer1, buffer2, size,
diff --git a/src/player/CrossFade.cxx b/src/player/CrossFade.cxx
index 903adf410..82c11223c 100644
--- a/src/player/CrossFade.cxx
+++ b/src/player/CrossFade.cxx
@@ -26,6 +26,8 @@
 #include "util/Domain.hxx"
 #include "Log.hxx"
 
+#include <cmath>
+
 #include <assert.h>
 
 static constexpr Domain cross_fade_domain("cross_fade");
@@ -108,7 +110,7 @@ CrossFadeSettings::Calculate(SignedSongTime total_time,
 	chunks_f = (float)af.GetTimeToSize() / (float)sizeof(MusicChunk::data);
 
 	if (mixramp_delay <= 0 || !mixramp_start || !mixramp_prev_end) {
-		chunks = (chunks_f * duration + 0.5);
+		chunks = std::lround(chunks_f * duration);
 	} else {
 		/* Calculate mixramp overlap. */
 		const float mixramp_overlap_current =