diff options
| author | ayumi <ayumi@noreply.codeberg.org> | 2025-01-31 19:08:39 +0100 |
|---|---|---|
| committer | ayumi <ayumi@noreply.codeberg.org> | 2025-03-13 03:29:03 +0100 |
| commit | 885eb1812c15263ad759741ad138cf7188fdf739 (patch) | |
| tree | 24aff12a5d67f77675281fd70c0857164e913331 /lib/wavpack/float.c | |
| parent | a3639860761dcdb5ef9c31bb34497f32cadd9ff3 (diff) | |
| download | tangara-fw-885eb1812c15263ad759741ad138cf7188fdf739.tar.gz | |
Add WavPack support
Diffstat (limited to 'lib/wavpack/float.c')
| -rw-r--r-- | lib/wavpack/float.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/wavpack/float.c b/lib/wavpack/float.c new file mode 100644 index 00000000..4b9b44ee --- /dev/null +++ b/lib/wavpack/float.c @@ -0,0 +1,50 @@ +////////////////////////////////////////////////////////////////////////////
+// **** WAVPACK **** //
+// Hybrid Lossless Wavefile Compressor //
+// Copyright (c) 1998 - 2006 Conifer Software. //
+// All Rights Reserved. //
+// Distributed under the BSD Software License (see license.txt) //
+////////////////////////////////////////////////////////////////////////////
+
+// float.c
+
+#include "wavpack.h"
+
+int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd)
+{
+ int bytecnt = wpmd->byte_length;
+ char *byteptr = wpmd->data;
+
+ if (bytecnt != 4)
+ return FALSE;
+
+ wps->float_flags = *byteptr++;
+ wps->float_shift = *byteptr++;
+ wps->float_max_exp = *byteptr++;
+ wps->float_norm_exp = *byteptr;
+ return TRUE;
+}
+
+void float_values (WavpackStream *wps, int32_t *values, int32_t num_values)
+{
+ int shift = wps->float_max_exp - wps->float_norm_exp + wps->float_shift;
+
+ if (shift > 32)
+ shift = 32;
+ else if (shift < -32)
+ shift = -32;
+
+ while (num_values--) {
+ if (shift > 0)
+ *values <<= shift;
+ else if (shift < 0)
+ *values >>= -shift;
+
+ if (*values > 8388607L)
+ *values = 8388607L;
+ else if (*values < -8388608L)
+ *values = -8388608L;
+
+ values++;
+ }
+}
|
