react-native-tiny-wavpack-decoder 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +148 -0
  3. package/android/build.gradle +112 -0
  4. package/android/generated/java/com/tinywavpackdecoder/NativeTinyWavPackDecoderSpec.java +47 -0
  5. package/android/generated/jni/CMakeLists.txt +36 -0
  6. package/android/generated/jni/RNTinyWavPackDecoderSpec-generated.cpp +44 -0
  7. package/android/generated/jni/RNTinyWavPackDecoderSpec.h +31 -0
  8. package/android/generated/jni/react/renderer/components/RNTinyWavPackDecoderSpec/RNTinyWavPackDecoderSpecJSI-generated.cpp +46 -0
  9. package/android/generated/jni/react/renderer/components/RNTinyWavPackDecoderSpec/RNTinyWavPackDecoderSpecJSI.h +89 -0
  10. package/android/gradle.properties +5 -0
  11. package/android/src/main/AndroidManifest.xml +3 -0
  12. package/android/src/main/AndroidManifestNew.xml +2 -0
  13. package/android/src/main/cpp/CMakeLists.txt +54 -0
  14. package/android/src/main/cpp/TinyWavPackDecoderModule.cpp +118 -0
  15. package/android/src/main/java/com/tinywavpackdecoder/TinyWavPackDecoderModule.kt +114 -0
  16. package/android/src/main/java/com/tinywavpackdecoder/TinyWavPackDecoderPackage.kt +18 -0
  17. package/ios/TinyWavPackDecoder.h +8 -0
  18. package/ios/TinyWavPackDecoder.mm +83 -0
  19. package/ios/generated/RNTinyWavPackDecoderSpec/RNTinyWavPackDecoderSpec-generated.mm +53 -0
  20. package/ios/generated/RNTinyWavPackDecoderSpec/RNTinyWavPackDecoderSpec.h +69 -0
  21. package/ios/generated/RNTinyWavPackDecoderSpecJSI-generated.cpp +46 -0
  22. package/ios/generated/RNTinyWavPackDecoderSpecJSI.h +89 -0
  23. package/lib/module/NativeTinyWavPackDecoder.ts +19 -0
  24. package/lib/module/index.js +38 -0
  25. package/lib/module/index.js.map +1 -0
  26. package/lib/module/package.json +1 -0
  27. package/lib/module/tiny-wavpack/common/TinyWavPackDecoderInterface.c +414 -0
  28. package/lib/module/tiny-wavpack/common/TinyWavPackDecoderInterface.h +52 -0
  29. package/lib/module/tiny-wavpack/common/test.c +45 -0
  30. package/lib/module/tiny-wavpack/common/wv2wav +0 -0
  31. package/lib/module/tiny-wavpack/lib/bits.c +140 -0
  32. package/lib/module/tiny-wavpack/lib/float.c +50 -0
  33. package/lib/module/tiny-wavpack/lib/license.txt +25 -0
  34. package/lib/module/tiny-wavpack/lib/metadata.c +105 -0
  35. package/lib/module/tiny-wavpack/lib/readme.txt +68 -0
  36. package/lib/module/tiny-wavpack/lib/unpack.c +785 -0
  37. package/lib/module/tiny-wavpack/lib/wavpack.h +384 -0
  38. package/lib/module/tiny-wavpack/lib/words.c +560 -0
  39. package/lib/module/tiny-wavpack/lib/wputils.c +351 -0
  40. package/lib/typescript/package.json +1 -0
  41. package/lib/typescript/src/NativeTinyWavPackDecoder.d.ts +9 -0
  42. package/lib/typescript/src/NativeTinyWavPackDecoder.d.ts.map +1 -0
  43. package/lib/typescript/src/index.d.ts +18 -0
  44. package/lib/typescript/src/index.d.ts.map +1 -0
  45. package/package.json +195 -0
  46. package/react-native-wavpack-decoder.podspec +35 -0
  47. package/react-native.config.js +12 -0
  48. package/src/NativeTinyWavPackDecoder.ts +19 -0
  49. package/src/index.tsx +57 -0
  50. package/src/tiny-wavpack/common/TinyWavPackDecoderInterface.c +414 -0
  51. package/src/tiny-wavpack/common/TinyWavPackDecoderInterface.h +52 -0
  52. package/src/tiny-wavpack/common/test.c +45 -0
  53. package/src/tiny-wavpack/common/wv2wav +0 -0
  54. package/src/tiny-wavpack/lib/bits.c +140 -0
  55. package/src/tiny-wavpack/lib/float.c +50 -0
  56. package/src/tiny-wavpack/lib/license.txt +25 -0
  57. package/src/tiny-wavpack/lib/metadata.c +105 -0
  58. package/src/tiny-wavpack/lib/readme.txt +68 -0
  59. package/src/tiny-wavpack/lib/unpack.c +785 -0
  60. package/src/tiny-wavpack/lib/wavpack.h +384 -0
  61. package/src/tiny-wavpack/lib/words.c +560 -0
  62. package/src/tiny-wavpack/lib/wputils.c +351 -0
@@ -0,0 +1,384 @@
1
+ ////////////////////////////////////////////////////////////////////////////
2
+ // **** WAVPACK **** //
3
+ // Hybrid Lossless Wavefile Compressor //
4
+ // Copyright (c) 1998 - 2004 Conifer Software. //
5
+ // All Rights Reserved. //
6
+ // Distributed under the BSD Software License (see license.txt) //
7
+ ////////////////////////////////////////////////////////////////////////////
8
+
9
+ // wavpack.h
10
+
11
+ #include <sys/types.h>
12
+
13
+ // This header file contains all the definitions required by WavPack.
14
+
15
+ #ifdef __BORLANDC__
16
+ typedef unsigned long uint32_t;
17
+ typedef long int32_t;
18
+ #elif defined(_WIN32) && !defined(__MINGW32__)
19
+ #include <stdlib.h>
20
+ typedef unsigned __int64 uint64_t;
21
+ typedef unsigned __int32 uint32_t;
22
+ typedef __int64 int64_t;
23
+ typedef __int32 int32_t;
24
+ #else
25
+ #include <inttypes.h>
26
+ #endif
27
+
28
+ typedef unsigned char uchar;
29
+
30
+ #if !defined(__GNUC__) || defined(WIN32)
31
+ typedef unsigned short ushort;
32
+ typedef unsigned int uint;
33
+ #endif
34
+
35
+ #include <stdio.h>
36
+
37
+ #define FALSE 0
38
+ #define TRUE 1
39
+
40
+ ////////////////////////////// WavPack Header /////////////////////////////////
41
+
42
+ // Note that this is the ONLY structure that is written to (or read from)
43
+ // WavPack 4.0 files, and is the preamble to every block in both the .wv
44
+ // and .wvc files.
45
+
46
+ typedef struct {
47
+ char ckID [4];
48
+ uint32_t ckSize;
49
+ short version;
50
+ uchar track_no, index_no;
51
+ uint32_t total_samples, block_index, block_samples, flags, crc;
52
+ } WavpackHeader;
53
+
54
+ #define WavpackHeaderFormat "4LS2LLLLL"
55
+
56
+ // or-values for "flags"
57
+
58
+ #define BYTES_STORED 3 // 1-4 bytes/sample
59
+ #define MONO_FLAG 4 // not stereo
60
+ #define HYBRID_FLAG 8 // hybrid mode
61
+ #define JOINT_STEREO 0x10 // joint stereo
62
+ #define CROSS_DECORR 0x20 // no-delay cross decorrelation
63
+ #define HYBRID_SHAPE 0x40 // noise shape (hybrid mode only)
64
+ #define FLOAT_DATA 0x80 // ieee 32-bit floating point data
65
+
66
+ #define INT32_DATA 0x100 // special extended int handling
67
+ #define HYBRID_BITRATE 0x200 // bitrate noise (hybrid mode only)
68
+ #define HYBRID_BALANCE 0x400 // balance noise (hybrid stereo mode only)
69
+
70
+ #define INITIAL_BLOCK 0x800 // initial block of multichannel segment
71
+ #define FINAL_BLOCK 0x1000 // final block of multichannel segment
72
+
73
+ #define SHIFT_LSB 13
74
+ #define SHIFT_MASK (0x1fL << SHIFT_LSB)
75
+
76
+ #define MAG_LSB 18
77
+ #define MAG_MASK (0x1fL << MAG_LSB)
78
+
79
+ #define SRATE_LSB 23
80
+ #define SRATE_MASK (0xfL << SRATE_LSB)
81
+
82
+ #define FALSE_STEREO 0x40000000 // block is stereo, but data is mono
83
+
84
+ #define IGNORED_FLAGS 0x18000000 // reserved, but ignore if encountered
85
+ #define NEW_SHAPING 0x20000000 // use IIR filter for negative shaping
86
+ #define UNKNOWN_FLAGS 0x80000000 // also reserved, but refuse decode if
87
+ // encountered
88
+
89
+ #define MONO_DATA (MONO_FLAG | FALSE_STEREO)
90
+
91
+ #define MIN_STREAM_VERS 0x402 // lowest stream version we'll decode
92
+ #define MAX_STREAM_VERS 0x410 // highest stream version we'll decode
93
+
94
+ //////////////////////////// WavPack Metadata /////////////////////////////////
95
+
96
+ // This is an internal representation of metadata.
97
+
98
+ typedef struct {
99
+ int32_t byte_length;
100
+ void *data;
101
+ uchar id;
102
+ } WavpackMetadata;
103
+
104
+ #define ID_OPTIONAL_DATA 0x20
105
+ #define ID_ODD_SIZE 0x40
106
+ #define ID_LARGE 0x80
107
+
108
+ #define ID_DUMMY 0x0
109
+ #define ID_ENCODER_INFO 0x1
110
+ #define ID_DECORR_TERMS 0x2
111
+ #define ID_DECORR_WEIGHTS 0x3
112
+ #define ID_DECORR_SAMPLES 0x4
113
+ #define ID_ENTROPY_VARS 0x5
114
+ #define ID_HYBRID_PROFILE 0x6
115
+ #define ID_SHAPING_WEIGHTS 0x7
116
+ #define ID_FLOAT_INFO 0x8
117
+ #define ID_INT32_INFO 0x9
118
+ #define ID_WV_BITSTREAM 0xa
119
+ #define ID_WVC_BITSTREAM 0xb
120
+ #define ID_WVX_BITSTREAM 0xc
121
+ #define ID_CHANNEL_INFO 0xd
122
+
123
+ #define ID_RIFF_HEADER (ID_OPTIONAL_DATA | 0x1)
124
+ #define ID_RIFF_TRAILER (ID_OPTIONAL_DATA | 0x2)
125
+ #define ID_REPLAY_GAIN (ID_OPTIONAL_DATA | 0x3)
126
+ #define ID_CUESHEET (ID_OPTIONAL_DATA | 0x4)
127
+ #define ID_CONFIG_BLOCK (ID_OPTIONAL_DATA | 0x5)
128
+ #define ID_MD5_CHECKSUM (ID_OPTIONAL_DATA | 0x6)
129
+
130
+ ///////////////////////// WavPack Configuration ///////////////////////////////
131
+
132
+ // This internal structure is used during encode to provide configuration to
133
+ // the encoding engine and during decoding to provide fle information back to
134
+ // the higher level functions. Not all fields are used in both modes.
135
+
136
+ typedef struct {
137
+ int bits_per_sample, bytes_per_sample;
138
+ int num_channels, float_norm_exp;
139
+ uint32_t flags, sample_rate, channel_mask;
140
+ } WavpackConfig;
141
+
142
+ #define CONFIG_BYTES_STORED 3 // 1-4 bytes/sample
143
+ #define CONFIG_MONO_FLAG 4 // not stereo
144
+ #define CONFIG_HYBRID_FLAG 8 // hybrid mode
145
+ #define CONFIG_JOINT_STEREO 0x10 // joint stereo
146
+ #define CONFIG_CROSS_DECORR 0x20 // no-delay cross decorrelation
147
+ #define CONFIG_HYBRID_SHAPE 0x40 // noise shape (hybrid mode only)
148
+ #define CONFIG_FLOAT_DATA 0x80 // ieee 32-bit floating point data
149
+
150
+ #define CONFIG_FAST_FLAG 0x200 // fast mode
151
+ #define CONFIG_HIGH_FLAG 0x800 // high quality mode
152
+ #define CONFIG_VERY_HIGH_FLAG 0x1000 // very high
153
+ #define CONFIG_BITRATE_KBPS 0x2000 // bitrate is kbps, not bits / sample
154
+ #define CONFIG_AUTO_SHAPING 0x4000 // automatic noise shaping
155
+ #define CONFIG_SHAPE_OVERRIDE 0x8000 // shaping mode specified
156
+ #define CONFIG_JOINT_OVERRIDE 0x10000 // joint-stereo mode specified
157
+ #define CONFIG_CREATE_EXE 0x40000 // create executable
158
+ #define CONFIG_CREATE_WVC 0x80000 // create correction file
159
+ #define CONFIG_OPTIMIZE_WVC 0x100000 // maximize bybrid compression
160
+ #define CONFIG_CALC_NOISE 0x800000 // calc noise in hybrid mode
161
+ #define CONFIG_LOSSY_MODE 0x1000000 // obsolete (for information)
162
+ #define CONFIG_EXTRA_MODE 0x2000000 // extra processing mode
163
+ #define CONFIG_SKIP_WVX 0x4000000 // no wvx stream w/ floats & big ints
164
+ #define CONFIG_MD5_CHECKSUM 0x8000000 // compute & store MD5 signature
165
+ #define CONFIG_OPTIMIZE_MONO 0x80000000 // optimize for mono streams posing as stereo
166
+
167
+ //////////////////////////////// WavPack Stream ///////////////////////////////
168
+
169
+ // This internal structure contains everything required to handle a WavPack
170
+ // "stream", which is defined as a stereo or mono stream of audio samples. For
171
+ // multichannel audio several of these would be required. Each stream contains
172
+ // pointers to hold a complete allocated block of WavPack data, although it's
173
+ // possible to decode WavPack blocks without buffering an entire block.
174
+
175
+ typedef int32_t (*read_stream)(void *, int32_t);
176
+
177
+ typedef struct bs {
178
+ uchar *buf, *end, *ptr;
179
+ void (*wrap)(struct bs *bs);
180
+ uint32_t file_bytes, sr;
181
+ int error, bc;
182
+ read_stream file;
183
+ } Bitstream;
184
+
185
+ #define MAX_NTERMS 16
186
+ #define MAX_TERM 8
187
+
188
+ struct decorr_pass {
189
+ short term, delta, weight_A, weight_B;
190
+ int32_t samples_A [MAX_TERM], samples_B [MAX_TERM];
191
+ };
192
+
193
+ struct entropy_data {
194
+ uint32_t median [3], slow_level, error_limit;
195
+ };
196
+
197
+ struct words_data {
198
+ uint32_t bitrate_delta [2], bitrate_acc [2];
199
+ uint32_t pend_data, holding_one, zeros_acc;
200
+ int holding_zero, pend_count;
201
+ struct entropy_data c [2];
202
+ };
203
+
204
+ typedef struct {
205
+ WavpackHeader wphdr;
206
+ Bitstream wvbits;
207
+
208
+ struct words_data w;
209
+
210
+ int num_terms, mute_error;
211
+ uint32_t sample_index, crc;
212
+
213
+ uchar int32_sent_bits, int32_zeros, int32_ones, int32_dups;
214
+ uchar float_flags, float_shift, float_max_exp, float_norm_exp;
215
+
216
+ struct decorr_pass decorr_passes [MAX_NTERMS];
217
+
218
+ } WavpackStream;
219
+
220
+ // flags for float_flags:
221
+
222
+ #define FLOAT_SHIFT_ONES 1 // bits left-shifted into float = '1'
223
+ #define FLOAT_SHIFT_SAME 2 // bits left-shifted into float are the same
224
+ #define FLOAT_SHIFT_SENT 4 // bits shifted into float are sent literally
225
+ #define FLOAT_ZEROS_SENT 8 // "zeros" are not all real zeros
226
+ #define FLOAT_NEG_ZEROS 0x10 // contains negative zeros
227
+ #define FLOAT_EXCEPTIONS 0x20 // contains exceptions (inf, nan, etc.)
228
+
229
+ /////////////////////////////// WavPack Context ///////////////////////////////
230
+
231
+ // This internal structure holds everything required to encode or decode WavPack
232
+ // files. It is recommended that direct access to this structure be minimized
233
+ // and the provided utilities used instead.
234
+
235
+ typedef struct {
236
+ WavpackConfig config;
237
+ WavpackStream stream;
238
+
239
+ uchar read_buffer [1024];
240
+ char error_message [80];
241
+
242
+ read_stream infile;
243
+ uint32_t total_samples, crc_errors, first_flags;
244
+ int open_flags, norm_offset, reduced_channels, lossy_blocks;
245
+
246
+ } WavpackContext;
247
+
248
+ //////////////////////// function prototypes and macros //////////////////////
249
+
250
+ #define CLEAR(destin) memset (&destin, 0, sizeof (destin));
251
+
252
+ // bits.c
253
+
254
+ void bs_open_read (Bitstream *bs, uchar *buffer_start, uchar *buffer_end, read_stream file, uint32_t file_bytes);
255
+
256
+ #define bs_is_open(bs) ((bs)->ptr != NULL)
257
+
258
+ #define getbit(bs) ( \
259
+ (((bs)->bc) ? \
260
+ ((bs)->bc--, (bs)->sr & 1) : \
261
+ (((++((bs)->ptr) != (bs)->end) ? (void) 0 : (bs)->wrap (bs)), (bs)->bc = 7, ((bs)->sr = *((bs)->ptr)) & 1) \
262
+ ) ? \
263
+ ((bs)->sr >>= 1, 1) : \
264
+ ((bs)->sr >>= 1, 0) \
265
+ )
266
+
267
+ #define getbits(value, nbits, bs) { \
268
+ while ((nbits) > (bs)->bc) { \
269
+ if (++((bs)->ptr) == (bs)->end) (bs)->wrap (bs); \
270
+ (bs)->sr |= (int32_t)*((bs)->ptr) << (bs)->bc; \
271
+ (bs)->bc += 8; \
272
+ } \
273
+ *(value) = (bs)->sr; \
274
+ if ((bs)->bc > 32) { \
275
+ (bs)->bc -= (nbits); \
276
+ (bs)->sr = *((bs)->ptr) >> (8 - (bs)->bc); \
277
+ } \
278
+ else { \
279
+ (bs)->bc -= (nbits); \
280
+ (bs)->sr >>= (nbits); \
281
+ } \
282
+ }
283
+
284
+ void little_endian_to_native (void *data, char *format);
285
+ void native_to_little_endian (void *data, char *format);
286
+
287
+ // These macros implement the weight application and update operations
288
+ // that are at the heart of the decorrelation loops. Note that when there
289
+ // are several alternative versions of the same macro (marked with PERFCOND)
290
+ // then the versions are functionally equivalent with respect to WavPack
291
+ // decoding and the user should choose the one that provides the best
292
+ // performance. This may be easier to check when NOT using the assembly
293
+ // language optimizations.
294
+
295
+ #if 1 // PERFCOND
296
+ #define apply_weight_i(weight, sample) ((weight * sample + 512) >> 10)
297
+ #else
298
+ #define apply_weight_i(weight, sample) ((((weight * sample) >> 8) + 2) >> 2)
299
+ #endif
300
+
301
+ #define apply_weight_f(weight, sample) (((((sample & 0xffffL) * weight) >> 9) + \
302
+ (((sample & ~0xffffL) >> 9) * weight) + 1) >> 1)
303
+
304
+ #if 1 // PERFCOND
305
+ #define apply_weight(weight, sample) (sample != (short) sample ? \
306
+ apply_weight_f (weight, sample) : apply_weight_i (weight, sample))
307
+ #else
308
+ #define apply_weight(weight, sample) ((int32_t)((weight * (int64_t) sample + 512) >> 10))
309
+ #endif
310
+
311
+ #if 0 // PERFCOND
312
+ #define update_weight(weight, delta, source, result) \
313
+ if (source && result) { int32_t s = (int32_t) (source ^ result) >> 31; weight = (delta ^ s) + (weight - s); }
314
+ #elif 1
315
+ #define update_weight(weight, delta, source, result) \
316
+ if (source && result) weight += (((source ^ result) >> 30) | 1) * delta
317
+ #else
318
+ #define update_weight(weight, delta, source, result) \
319
+ if (source && result) (source ^ result) < 0 ? (weight -= delta) : (weight += delta)
320
+ #endif
321
+
322
+ #define update_weight_clip(weight, delta, source, result) \
323
+ if (source && result && ((source ^ result) < 0 ? (weight -= delta) < -1024 : (weight += delta) > 1024)) \
324
+ weight = weight < 0 ? -1024 : 1024
325
+
326
+ // unpack.c
327
+
328
+ int unpack_init (WavpackContext *wpc);
329
+ int init_wv_bitstream (WavpackContext *wpc, WavpackMetadata *wpmd);
330
+ int read_decorr_terms (WavpackStream *wps, WavpackMetadata *wpmd);
331
+ int read_decorr_weights (WavpackStream *wps, WavpackMetadata *wpmd);
332
+ int read_decorr_samples (WavpackStream *wps, WavpackMetadata *wpmd);
333
+ int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd);
334
+ int read_int32_info (WavpackStream *wps, WavpackMetadata *wpmd);
335
+ int read_channel_info (WavpackContext *wpc, WavpackMetadata *wpmd);
336
+ int read_config_info (WavpackContext *wpc, WavpackMetadata *wpmd);
337
+ int32_t unpack_samples (WavpackContext *wpc, int32_t *buffer, uint32_t sample_count);
338
+ int check_crc_error (WavpackContext *wpc);
339
+
340
+ // metadata.c stuff
341
+
342
+ int read_metadata_buff (WavpackContext *wpc, WavpackMetadata *wpmd);
343
+ int process_metadata (WavpackContext *wpc, WavpackMetadata *wpmd);
344
+
345
+ // words.c stuff
346
+
347
+ int read_entropy_vars (WavpackStream *wps, WavpackMetadata *wpmd);
348
+ int read_hybrid_profile (WavpackStream *wps, WavpackMetadata *wpmd);
349
+ int32_t get_words (int32_t *buffer, int nsamples, uint32_t flags,
350
+ struct words_data *w, Bitstream *bs);
351
+ int32_t exp2s (int log);
352
+ int restore_weight (signed char weight);
353
+
354
+ #define WORD_EOF (1L << 31)
355
+
356
+ // float.c
357
+
358
+ int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd);
359
+ void float_values (WavpackStream *wps, int32_t *values, int32_t num_values);
360
+
361
+ // wputils.c
362
+
363
+ WavpackContext *WavpackOpenFileInput (read_stream infile, char *error);
364
+
365
+ int WavpackGetMode (WavpackContext *wpc);
366
+
367
+ #define MODE_WVC 0x1
368
+ #define MODE_LOSSLESS 0x2
369
+ #define MODE_HYBRID 0x4
370
+ #define MODE_FLOAT 0x8
371
+ #define MODE_VALID_TAG 0x10
372
+ #define MODE_HIGH 0x20
373
+ #define MODE_FAST 0x40
374
+
375
+ uint32_t WavpackUnpackSamples (WavpackContext *wpc, int32_t *buffer, uint32_t samples);
376
+ uint32_t WavpackGetNumSamples (WavpackContext *wpc);
377
+ uint32_t WavpackGetSampleIndex (WavpackContext *wpc);
378
+ int WavpackGetNumErrors (WavpackContext *wpc);
379
+ int WavpackLossyBlocks (WavpackContext *wpc);
380
+ uint32_t WavpackGetSampleRate (WavpackContext *wpc);
381
+ int WavpackGetBitsPerSample (WavpackContext *wpc);
382
+ int WavpackGetBytesPerSample (WavpackContext *wpc);
383
+ int WavpackGetNumChannels (WavpackContext *wpc);
384
+ int WavpackGetReducedChannels (WavpackContext *wpc);