implement tri dithering... API needs a little work to be extensible

adpcm
Dimitri Diakopoulos 11 years ago
parent 091c799f76
commit 669e47aedd

@ -92,7 +92,7 @@ int main()
} }
// Test wav file encoder // 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; std::cout << "Encoder Status: " << encoderStatus << std::endl;
return 0; return 0;

@ -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 int24_to_float32(s) ((float) (s) / NQR_INT24_MAX)
#define int32_to_float32(s) ((float) (s) / NQR_INT32_MAX) #define int32_to_float32(s) ((float) (s) / NQR_INT32_MAX)
#define float32_to_int8(s) (int8_t) (s * 127.f) #define float32_to_int8(s) (float) (s * 127.f)
#define float32_to_uint8(s) (uint8_t)((s * 127.f) + 128) #define float32_to_uint8(s) (float) ((s * 127.f) + 128)
#define float32_to_int16(s) (int16_t) (s * NQR_INT16_MAX) #define float32_to_int16(s) (float) (s * NQR_INT16_MAX)
#define float32_to_int24(s) (int32_t) (s * NQR_INT24_MAX) #define float32_to_int24(s) (float) (s * NQR_INT24_MAX)
#define float32_to_int32(s) (int32_t) (s * NQR_INT32_MAX) #define float32_to_int32(s) (float) (s * NQR_INT32_MAX)
//@todo add 12, 20 for flac //@todo add 12, 20 for flac
enum PCMFormat enum PCMFormat

@ -152,23 +152,25 @@ void nqr::ConvertFromFloat32(uint8_t * dst, const float * src, const size_t N, P
assert(f != PCM_END); assert(f != PCM_END);
TriDither dither;
if (f == PCM_U8) if (f == PCM_U8)
{ {
uint8_t * destPtr = reinterpret_cast<uint8_t *>(dst); uint8_t * destPtr = reinterpret_cast<uint8_t *>(dst);
for (size_t i = 0; i < N; ++i) 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) else if (f == PCM_S8)
{ {
int8_t * destPtr = reinterpret_cast<int8_t *>(dst); int8_t * destPtr = reinterpret_cast<int8_t *>(dst);
for (size_t i = 0; i < N; ++i) 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) else if (f == PCM_16)
{ {
int16_t * destPtr = reinterpret_cast<int16_t *>(dst); int16_t * destPtr = reinterpret_cast<int16_t *>(dst);
for (size_t i = 0; i < N; ++i) 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) 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; size_t c = 0;
for (size_t i = 0; i < N; ++i) 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 auto unpacked = Unpack(sample); // Handles endian swap
destPtr[c] = unpacked[0]; destPtr[c] = unpacked[0];
destPtr[c+1] = unpacked[1]; 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<int32_t *>(dst); int32_t * destPtr = reinterpret_cast<int32_t *>(dst);
for (size_t i = 0; i < N; ++i) 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]);
} }
} }

@ -127,7 +127,6 @@ int WavEncoder::WriteFile(const EncoderParams p, const AudioData * d, const std:
fout.write(reinterpret_cast<const char*>(d->samples.data()), samplesSizeInBytes); fout.write(reinterpret_cast<const char*>(d->samples.data()), samplesSizeInBytes);
} }
// Padding byte // Padding byte
if (isOdd(samplesSizeInBytes)) if (isOdd(samplesSizeInBytes))
{ {

Loading…
Cancel
Save