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)
25 return TRUE; 25 return TRUE;
26} 26}
27 27
28void float_values (WavpackStream *wps, int32_t *values, int32_t num_values) 28/* This function converts WavPack floating point data into standard Rockbox
29{ 29 * 28-bit integers. It is assumed that clipping will be taken care of later.
30 while (num_values--) { 30 */
31 int shift_count = 0, exp = wps->float_max_exp;
32 f32 outval = { 0, 0, 0 };
33
34 if (*values) {
35 *values <<= wps->float_shift;
36
37 if (*values < 0) {
38 *values = -*values;
39 outval.sign = 1;
40 }
41
42 if (*values == 0x1000000)
43 outval.exponent = 255;
44 else {
45 if (exp)
46 while (!(*values & 0x800000) && --exp) {
47 shift_count++;
48 *values <<= 1;
49 }
50
51 if (shift_count && (wps->float_flags & FLOAT_SHIFT_ONES))
52 *values |= ((1 << shift_count) - 1);
53
54 outval.mantissa = *values;
55 outval.exponent = exp;
56 }
57 }
58 31
59 * (f32 *) values++ = outval; 32void float_values (WavpackStream *wps, int32_t *values, int32_t num_values)
60 }
61}
62
63void float_normalize (int32_t *values, int32_t num_values, int delta_exp)
64{ 33{
65 f32 *fvalues = (f32 *) values, fzero = { 0, 0, 0 }; 34 int shift = wps->float_max_exp - wps->float_norm_exp + wps->float_shift + 5;
66 int exp; 35
67 36 if (shift > 32)
68 if (!delta_exp) 37 shift = 32;
69 return; 38 else if (shift < -32)
70 39 shift = -32;
71 while (num_values--) { 40
72 if ((exp = fvalues->exponent) == 0 || exp + delta_exp <= 0) 41 if (shift > 0)
73 *fvalues = fzero; 42 while (num_values--)
74 else if (exp == 255 || (exp += delta_exp) >= 255) { 43 *values++ <<= shift;
75 fvalues->exponent = 255; 44 else if (shift < 0)
76 fvalues->mantissa = 0; 45 while (num_values--)
77 } 46 *values++ >>= -shift;
78 else
79 fvalues->exponent = exp;
80
81 fvalues++;
82 }
83} 47}