diff --git a/examples/src/Main.cpp b/examples/src/Main.cpp index b085480..c34bc23 100644 --- a/examples/src/Main.cpp +++ b/examples/src/Main.cpp @@ -92,7 +92,7 @@ int main() } // Test wav file encoder - int encoderStatus = encoder.WriteFile({1, PCM_24, DITHER_NONE}, fileData, "encoded.wav"); + int encoderStatus = encoder.WriteFile({1, PCM_16, DITHER_NONE}, fileData, "encoded.wav"); std::cout << "Encoder Status: " << encoderStatus << std::endl; return 0; diff --git a/include/libnyquist/Common.h b/include/libnyquist/Common.h index 972b37a..6d895a5 100644 --- a/include/libnyquist/Common.h +++ b/include/libnyquist/Common.h @@ -215,11 +215,11 @@ static const float NQR_BYTE_2_FLT = 1.0f / 127.0f; #define int24_to_float32(s) ((float) (s) / NQR_INT24_MAX) #define int32_to_float32(s) ((float) (s) / NQR_INT32_MAX) -#define float32_to_int8(s) (int8_t) (s * 127.f) -#define float32_to_uint8(s) (uint8_t)((s * 127.f) + 128) -#define float32_to_int16(s) (int16_t) (s * NQR_INT16_MAX) -#define float32_to_int24(s) (int32_t) (s * NQR_INT24_MAX) -#define float32_to_int32(s) (int32_t) (s * NQR_INT32_MAX) +#define float32_to_int8(s) (float) (s * 127.f) +#define float32_to_uint8(s) (float) ((s * 127.f) + 128) +#define float32_to_int16(s) (float) (s * NQR_INT16_MAX) +#define float32_to_int24(s) (float) (s * NQR_INT24_MAX) +#define float32_to_int32(s) (float) (s * NQR_INT32_MAX) //@todo add 12, 20 for flac enum PCMFormat diff --git a/src/Common.cpp b/src/Common.cpp index 20f3503..46db3bf 100644 --- a/src/Common.cpp +++ b/src/Common.cpp @@ -152,23 +152,25 @@ void nqr::ConvertFromFloat32(uint8_t * dst, const float * src, const size_t N, P assert(f != PCM_END); + TriDither dither; + if (f == PCM_U8) { uint8_t * destPtr = reinterpret_cast(dst); for (size_t i = 0; i < N; ++i) - destPtr[i] = float32_to_uint8(src[i]); + destPtr[i] = (t == DITHER_TRIANGLE) ? (uint8_t) lroundf(dither(float32_to_uint8(src[i]))) : (uint8_t) float32_to_uint8(src[i]); } else if (f == PCM_S8) { int8_t * destPtr = reinterpret_cast(dst); for (size_t i = 0; i < N; ++i) - destPtr[i] = float32_to_int8(src[i]); + destPtr[i] = (t == DITHER_TRIANGLE) ? (int8_t) lroundf(dither(float32_to_int8(src[i]))) : (int8_t) float32_to_int8(src[i]); } else if (f == PCM_16) { int16_t * destPtr = reinterpret_cast(dst); for (size_t i = 0; i < N; ++i) - destPtr[i] = float32_to_int16(src[i]); + destPtr[i] = (t == DITHER_TRIANGLE) ? (int16_t) lroundf(dither(float32_to_int16(src[i]))) : (int16_t) float32_to_int16(src[i]); } else if (f == PCM_24) { @@ -176,7 +178,7 @@ void nqr::ConvertFromFloat32(uint8_t * dst, const float * src, const size_t N, P size_t c = 0; for (size_t i = 0; i < N; ++i) { - auto sample = float32_to_int24(src[i]); + int32_t sample = (t == DITHER_TRIANGLE) ? (int32_t) lroundf(dither(float32_to_int24(src[i]))) : (int32_t) float32_to_int24(src[i]); auto unpacked = Unpack(sample); // Handles endian swap destPtr[c] = unpacked[0]; destPtr[c+1] = unpacked[1]; @@ -188,7 +190,7 @@ void nqr::ConvertFromFloat32(uint8_t * dst, const float * src, const size_t N, P { int32_t * destPtr = reinterpret_cast(dst); for (size_t i = 0; i < N; ++i) - destPtr[i] = float32_to_int32(src[i]); + destPtr[i] = (t == DITHER_TRIANGLE) ? (int32_t) lroundf(dither(float32_to_int32(src[i]))) : (int32_t) float32_to_int32(src[i]); } } diff --git a/src/WavEncoder.cpp b/src/WavEncoder.cpp index 3eec46f..658abe4 100644 --- a/src/WavEncoder.cpp +++ b/src/WavEncoder.cpp @@ -127,7 +127,6 @@ int WavEncoder::WriteFile(const EncoderParams p, const AudioData * d, const std: fout.write(reinterpret_cast(d->samples.data()), samplesSizeInBytes); } - // Padding byte if (isOdd(samplesSizeInBytes)) {