diff options
author | Alex Marsev <alex.marsev@gmail.com> | 2014-11-20 16:24:45 +0300 |
---|---|---|
committer | Alex Marsev <alex.marsev@gmail.com> | 2014-11-20 16:24:45 +0300 |
commit | 5befb0b872b6eda4cd90e8ef31df2f20ba14ab8c (patch) | |
tree | 552048f4e420482af2ad42d3045409fecf1d7d17 /src/DspChunk.cpp | |
parent | c008da991eed11c6add038472a6c41b54788bf48 (diff) |
Fix float to int32_t sample conversion
Diffstat (limited to 'src/DspChunk.cpp')
-rw-r--r-- | src/DspChunk.cpp | 7 |
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 <>
|