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) | |||
25 | return TRUE; | 25 | return TRUE; |
26 | } | 26 | } |
27 | 27 | ||
28 | void 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; | 32 | void float_values (WavpackStream *wps, int32_t *values, int32_t num_values) |
60 | } | ||
61 | } | ||
62 | |||
63 | void 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 | } |