Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/sanear.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Marsev <alex.marsev@gmail.com>2014-11-20 16:24:45 +0300
committerAlex Marsev <alex.marsev@gmail.com>2014-11-20 16:24:45 +0300
commit5befb0b872b6eda4cd90e8ef31df2f20ba14ab8c (patch)
tree552048f4e420482af2ad42d3045409fecf1d7d17 /src/DspChunk.cpp
parentc008da991eed11c6add038472a6c41b54788bf48 (diff)
Fix float to int32_t sample conversion
Diffstat (limited to 'src/DspChunk.cpp')
-rw-r--r--src/DspChunk.cpp7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/DspChunk.cpp b/src/DspChunk.cpp
index 962338e..90c10ab 100644
--- a/src/DspChunk.cpp
+++ b/src/DspChunk.cpp
@@ -4,6 +4,9 @@
namespace SaneAudioRenderer
{
static_assert((int32_t{-1} >> 31) == -1 && (int64_t{-1} >> 63) == -1, "Code relies on right signed shift UB");
+ static_assert((int64_t)(float)((int64_t)INT32_MAX + 1) == ((int64_t)INT32_MAX + 1), "Rounding error");
+ static_assert((int32_t)(float)(INT32_MAX - 127) == (INT32_MAX - 127), "Rounding error");
+ static_assert((int32_t)(double)INT32_MAX == INT32_MAX, "Rounding error");
namespace
{
@@ -161,13 +164,13 @@ namespace SaneAudioRenderer
template <>
inline void ConvertSample<DspFormat::Float, DspFormat::Pcm24>(const float& input, int24_t& output)
{
- PackPcm24((int32_t)(input * INT32_MAX), (char*)output.d);
+ PackPcm24((int32_t)(input * (INT32_MAX - 127)), (char*)output.d);
}
template <>
inline void ConvertSample<DspFormat::Float, DspFormat::Pcm32>(const float& input, int32_t& output)
{
- output = (int32_t)(input * INT32_MAX);
+ output = (int32_t)(input * (INT32_MAX - 127));
}
template <>