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
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;

@ -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

@ -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<uint8_t *>(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<int8_t *>(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<int16_t *>(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<int32_t *>(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]);
}
}

@ -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);
}
// Padding byte
if (isOdd(samplesSizeInBytes))
{

Loading…
Cancel
Save