diff options
Diffstat (limited to 'apps/codecs/libwavpack/float.c')
-rw-r--r-- | apps/codecs/libwavpack/float.c | 70 |
1 files changed, 17 insertions, 53 deletions
diff --git a/apps/codecs/libwavpack/float.c b/apps/codecs/libwavpack/float.c index 9d3a82c001..6e5c4e4f61 100644 --- a/apps/codecs/libwavpack/float.c +++ b/apps/codecs/libwavpack/float.c @@ -25,59 +25,23 @@ int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd) return TRUE; } -void float_values (WavpackStream *wps, int32_t *values, int32_t num_values) -{ - while (num_values--) { - int shift_count = 0, exp = wps->float_max_exp; - f32 outval = { 0, 0, 0 }; - - if (*values) { - *values <<= wps->float_shift; - - if (*values < 0) { - *values = -*values; - outval.sign = 1; - } - - if (*values == 0x1000000) - outval.exponent = 255; - else { - if (exp) - while (!(*values & 0x800000) && --exp) { - shift_count++; - *values <<= 1; - } - - if (shift_count && (wps->float_flags & FLOAT_SHIFT_ONES)) - *values |= ((1 << shift_count) - 1); - - outval.mantissa = *values; - outval.exponent = exp; - } - } +/* This function converts WavPack floating point data into standard Rockbox + * 28-bit integers. It is assumed that clipping will be taken care of later. + */ - * (f32 *) values++ = outval; - } -} - -void float_normalize (int32_t *values, int32_t num_values, int delta_exp) +void float_values (WavpackStream *wps, int32_t *values, int32_t num_values) { - f32 *fvalues = (f32 *) values, fzero = { 0, 0, 0 }; - int exp; - - if (!delta_exp) - return; - - while (num_values--) { - if ((exp = fvalues->exponent) == 0 || exp + delta_exp <= 0) - *fvalues = fzero; - else if (exp == 255 || (exp += delta_exp) >= 255) { - fvalues->exponent = 255; - fvalues->mantissa = 0; - } - else - fvalues->exponent = exp; - - fvalues++; - } + int shift = wps->float_max_exp - wps->float_norm_exp + wps->float_shift + 5; + + if (shift > 32) + shift = 32; + else if (shift < -32) + shift = -32; + + if (shift > 0) + while (num_values--) + *values++ <<= shift; + else if (shift < 0) + while (num_values--) + *values++ >>= -shift; } |