summaryrefslogtreecommitdiff
path: root/apps/codecs/libwavpack/float.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libwavpack/float.c')
-rw-r--r--apps/codecs/libwavpack/float.c70
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;
}