| 1 | //////////////////////////////////////////////////////////////////////////// |
| 2 | // **** WAVPACK **** // |
| 3 | // Hybrid Lossless Wavefile Compressor // |
| 4 | // Copyright (c) 1998 - 2024 David Bryant. // |
| 5 | // All Rights Reserved. // |
| 6 | // Distributed under the BSD Software License (see license.txt) // |
| 7 | //////////////////////////////////////////////////////////////////////////// |
| 8 | |
| 9 | // wavpack.h |
| 10 | |
| 11 | #ifndef WAVPACK_H |
| 12 | #define WAVPACK_H |
| 13 | |
| 14 | // This header file contains all the definitions required to use the |
| 15 | // functions in "wputils.c" to read and write WavPack files and streams. |
| 16 | |
| 17 | #include <sys/types.h> |
| 18 | |
| 19 | #if defined(_MSC_VER) && _MSC_VER < 1600 |
| 20 | typedef unsigned __int64 uint64_t; |
| 21 | typedef unsigned __int32 uint32_t; |
| 22 | typedef unsigned __int16 uint16_t; |
| 23 | typedef unsigned __int8 uint8_t; |
| 24 | typedef __int64 int64_t; |
| 25 | typedef __int32 int32_t; |
| 26 | typedef __int16 int16_t; |
| 27 | typedef __int8 int8_t; |
| 28 | #else |
| 29 | #include <stdint.h> |
| 30 | #endif |
| 31 | |
| 32 | // RIFF / wav header formats (these occur at the beginning of both wav files |
| 33 | // and pre-4.0 WavPack files that are not in the "raw" mode). Generally, an |
| 34 | // application using the library to read or write WavPack files will not be |
| 35 | // concerned with any of these. |
| 36 | |
| 37 | typedef struct { |
| 38 | char [4]; |
| 39 | uint32_t ; |
| 40 | char [4]; |
| 41 | } ; |
| 42 | |
| 43 | typedef struct { |
| 44 | char [4]; |
| 45 | uint32_t ; |
| 46 | } ; |
| 47 | |
| 48 | #define "4L" |
| 49 | |
| 50 | typedef struct { |
| 51 | uint16_t , ; |
| 52 | uint32_t , ; |
| 53 | uint16_t , ; |
| 54 | uint16_t , ; |
| 55 | int32_t ; |
| 56 | uint16_t ; |
| 57 | char [14]; |
| 58 | } ; |
| 59 | |
| 60 | #define "SSLLSSSSLS" |
| 61 | |
| 62 | // This is the ONLY structure that occurs in WavPack files (as of version |
| 63 | // 4.0), and is the preamble to every block in both the .wv and .wvc |
| 64 | // files (in little-endian format). Normally, this structure has no use |
| 65 | // to an application using the library to read or write WavPack files, |
| 66 | // but if an application needs to manually parse WavPack files then this |
| 67 | // would be used (with appropriate endian correction). |
| 68 | |
| 69 | typedef struct { |
| 70 | char [4]; |
| 71 | uint32_t ; |
| 72 | int16_t ; |
| 73 | unsigned char ; |
| 74 | unsigned char ; |
| 75 | uint32_t , , , , ; |
| 76 | } ; |
| 77 | |
| 78 | #define "4LS2LLLLL" |
| 79 | |
| 80 | // Macros to access the 40-bit block_index field |
| 81 | |
| 82 | #define GET_BLOCK_INDEX(hdr) ( (int64_t) (hdr).block_index + ((int64_t) (hdr).block_index_u8 << 32) ) |
| 83 | |
| 84 | #define SET_BLOCK_INDEX(hdr,value) do { \ |
| 85 | int64_t tmp = (value); \ |
| 86 | (hdr).block_index = (uint32_t) tmp; \ |
| 87 | (hdr).block_index_u8 = \ |
| 88 | (unsigned char) (tmp >> 32); \ |
| 89 | } while (0) |
| 90 | |
| 91 | // Macros to access the 40-bit total_samples field, which is complicated by the fact that |
| 92 | // all 1's in the lower 32 bits indicates "unknown" (regardless of upper 8 bits) |
| 93 | |
| 94 | #define GET_TOTAL_SAMPLES(hdr) ( ((hdr).total_samples == (uint32_t) -1) ? -1 : \ |
| 95 | (int64_t) (hdr).total_samples + ((int64_t) (hdr).total_samples_u8 << 32) - (hdr).total_samples_u8 ) |
| 96 | |
| 97 | #define SET_TOTAL_SAMPLES(hdr,value) do { \ |
| 98 | int64_t tmp = (value); \ |
| 99 | if (tmp < 0) \ |
| 100 | (hdr).total_samples = (uint32_t) -1; \ |
| 101 | else { \ |
| 102 | tmp += (tmp / 0xffffffffLL); \ |
| 103 | (hdr).total_samples = (uint32_t) tmp; \ |
| 104 | (hdr).total_samples_u8 = \ |
| 105 | (unsigned char) (tmp >> 32); \ |
| 106 | } \ |
| 107 | } while (0) |
| 108 | |
| 109 | // or-values for WavpackHeader.flags |
| 110 | #define BYTES_STORED 3 // 1-4 bytes/sample |
| 111 | #define MONO_FLAG 4 // not stereo |
| 112 | #define HYBRID_FLAG 8 // hybrid mode |
| 113 | #define JOINT_STEREO 0x10 // joint stereo |
| 114 | #define CROSS_DECORR 0x20 // no-delay cross decorrelation |
| 115 | #define HYBRID_SHAPE 0x40 // noise shape (hybrid mode only) |
| 116 | #define FLOAT_DATA 0x80 // ieee 32-bit floating point data |
| 117 | |
| 118 | #define INT32_DATA 0x100 // special extended int handling |
| 119 | #define HYBRID_BITRATE 0x200 // bitrate noise (hybrid mode only) |
| 120 | #define HYBRID_BALANCE 0x400 // balance noise (hybrid stereo mode only) |
| 121 | |
| 122 | #define INITIAL_BLOCK 0x800 // initial block of multichannel segment |
| 123 | #define FINAL_BLOCK 0x1000 // final block of multichannel segment |
| 124 | |
| 125 | #define SHIFT_LSB 13 |
| 126 | #define SHIFT_MASK (0x1fL << SHIFT_LSB) |
| 127 | |
| 128 | #define MAG_LSB 18 |
| 129 | #define MAG_MASK (0x1fL << MAG_LSB) |
| 130 | |
| 131 | #define SRATE_LSB 23 |
| 132 | #define SRATE_MASK (0xfL << SRATE_LSB) |
| 133 | |
| 134 | #define FALSE_STEREO 0x40000000 // block is stereo, but data is mono |
| 135 | #define NEW_SHAPING 0x20000000 // use IIR filter for negative shaping |
| 136 | |
| 137 | #define MONO_DATA (MONO_FLAG | FALSE_STEREO) |
| 138 | |
| 139 | // Introduced in WavPack 5.0: |
| 140 | #define HAS_CHECKSUM 0x10000000 // block contains a trailing checksum |
| 141 | #define DSD_FLAG 0x80000000 // block is encoded DSD (1-bit PCM) |
| 142 | |
| 143 | #define IGNORED_FLAGS 0x08000000 // reserved, but ignore if encountered |
| 144 | #define UNKNOWN_FLAGS 0x00000000 // we no longer have any of these spares |
| 145 | |
| 146 | #define MIN_STREAM_VERS 0x402 // lowest stream version we'll decode |
| 147 | #define MAX_STREAM_VERS 0x410 // highest stream version we'll decode or encode |
| 148 | |
| 149 | #define WAVPACK_MAX_CHANS 4096 // max channels handled by WavPack format & library |
| 150 | |
| 151 | // This sets the maximum number of channels that the current WavPack CLI applications |
| 152 | // accept. It's somewhat arbitrary because the actual WavPack format and library can |
| 153 | // handle up to 4096 channels. However, anything beyond 256 channels is obviously |
| 154 | // a niche case and is not well tested, so this lower limit is defined for now. |
| 155 | |
| 156 | #define WAVPACK_MAX_CLI_CHANS 256 |
| 157 | |
| 158 | // These are the mask bit definitions for the metadata chunk id byte (see format.txt) |
| 159 | |
| 160 | #define ID_UNIQUE 0x3f |
| 161 | #define ID_OPTIONAL_DATA 0x20 |
| 162 | #define ID_ODD_SIZE 0x40 |
| 163 | #define ID_LARGE 0x80 |
| 164 | |
| 165 | #define ID_DUMMY 0x0 |
| 166 | #define ID_ENCODER_INFO 0x1 |
| 167 | #define ID_DECORR_TERMS 0x2 |
| 168 | #define ID_DECORR_WEIGHTS 0x3 |
| 169 | #define ID_DECORR_SAMPLES 0x4 |
| 170 | #define ID_ENTROPY_VARS 0x5 |
| 171 | #define ID_HYBRID_PROFILE 0x6 |
| 172 | #define ID_SHAPING_WEIGHTS 0x7 |
| 173 | #define ID_FLOAT_INFO 0x8 |
| 174 | #define ID_INT32_INFO 0x9 |
| 175 | #define ID_WV_BITSTREAM 0xa |
| 176 | #define ID_WVC_BITSTREAM 0xb |
| 177 | #define ID_WVX_BITSTREAM 0xc |
| 178 | #define ID_CHANNEL_INFO 0xd |
| 179 | #define ID_DSD_BLOCK 0xe |
| 180 | |
| 181 | #define (ID_OPTIONAL_DATA | 0x1) |
| 182 | #define ID_RIFF_TRAILER (ID_OPTIONAL_DATA | 0x2) |
| 183 | #define (ID_OPTIONAL_DATA | 0x3) |
| 184 | #define ID_ALT_TRAILER (ID_OPTIONAL_DATA | 0x4) |
| 185 | #define ID_CONFIG_BLOCK (ID_OPTIONAL_DATA | 0x5) |
| 186 | #define ID_MD5_CHECKSUM (ID_OPTIONAL_DATA | 0x6) |
| 187 | #define ID_SAMPLE_RATE (ID_OPTIONAL_DATA | 0x7) |
| 188 | #define ID_ALT_EXTENSION (ID_OPTIONAL_DATA | 0x8) |
| 189 | #define ID_ALT_MD5_CHECKSUM (ID_OPTIONAL_DATA | 0x9) |
| 190 | #define ID_NEW_CONFIG_BLOCK (ID_OPTIONAL_DATA | 0xa) |
| 191 | #define ID_CHANNEL_IDENTITIES (ID_OPTIONAL_DATA | 0xb) |
| 192 | #define ID_WVX_NEW_BITSTREAM (ID_OPTIONAL_DATA | ID_WVX_BITSTREAM) |
| 193 | #define ID_BLOCK_CHECKSUM (ID_OPTIONAL_DATA | 0xf) |
| 194 | |
| 195 | ///////////////////////// WavPack Configuration /////////////////////////////// |
| 196 | |
| 197 | // This external structure is used during encode to provide configuration to |
| 198 | // the encoding engine and during decoding to provide fle information back to |
| 199 | // the higher level functions. Not all fields are used in both modes. |
| 200 | |
| 201 | typedef struct { |
| 202 | float bitrate, shaping_weight; |
| 203 | int bits_per_sample, bytes_per_sample; |
| 204 | int qmode, flags, xmode, num_channels, float_norm_exp; |
| 205 | int32_t block_samples, worker_threads, sample_rate, channel_mask; |
| 206 | unsigned char md5_checksum [16], md5_read; |
| 207 | int num_tag_strings; // this field is not used |
| 208 | char **tag_strings; // this field is not used |
| 209 | } WavpackConfig; |
| 210 | |
| 211 | #define CONFIG_HYBRID_FLAG 8 // hybrid mode |
| 212 | #define CONFIG_JOINT_STEREO 0x10 // joint stereo |
| 213 | #define CONFIG_CROSS_DECORR 0x20 // no-delay cross decorrelation |
| 214 | #define CONFIG_HYBRID_SHAPE 0x40 // noise shape (hybrid mode only) |
| 215 | #define CONFIG_FAST_FLAG 0x200 // fast mode |
| 216 | #define CONFIG_HIGH_FLAG 0x800 // high quality mode |
| 217 | #define CONFIG_VERY_HIGH_FLAG 0x1000 // very high |
| 218 | #define CONFIG_BITRATE_KBPS 0x2000 // bitrate is kbps, not bits / sample |
| 219 | #define CONFIG_SHAPE_OVERRIDE 0x8000 // shaping mode specified |
| 220 | #define CONFIG_JOINT_OVERRIDE 0x10000 // joint-stereo mode specified |
| 221 | #define CONFIG_DYNAMIC_SHAPING 0x20000 // dynamic noise shaping |
| 222 | #define CONFIG_CREATE_EXE 0x40000 // create executable |
| 223 | #define CONFIG_CREATE_WVC 0x80000 // create correction file |
| 224 | #define CONFIG_OPTIMIZE_WVC 0x100000 // maximize hybrid compression |
| 225 | #define CONFIG_COMPATIBLE_WRITE 0x400000 // write files for decoders < 4.3 |
| 226 | #define CONFIG_CALC_NOISE 0x800000 // calc noise in hybrid mode |
| 227 | #define 0x2000000 // extra processing mode |
| 228 | #define CONFIG_SKIP_WVX 0x4000000 // no wvx stream w/ floats & big ints |
| 229 | #define CONFIG_MD5_CHECKSUM 0x8000000 // store MD5 signature |
| 230 | #define CONFIG_MERGE_BLOCKS 0x10000000 // merge blocks of equal redundancy (for lossyWAV) |
| 231 | #define CONFIG_PAIR_UNDEF_CHANS 0x20000000 // encode undefined channels in stereo pairs |
| 232 | #define CONFIG_OPTIMIZE_32BIT 0x40000000 // new optimizations for 32-bit integer files |
| 233 | #define CONFIG_OPTIMIZE_MONO 0x80000000 // optimize for mono streams posing as stereo |
| 234 | |
| 235 | // The lower 8 bits of qmode indicate the use of new features in version 5 that (presently) |
| 236 | // only apply to Core Audio Files (CAF) and DSD files, but could apply to other things too. |
| 237 | // These flags are stored in the file and can be retrieved by a decoder that is aware of |
| 238 | // them, but the individual bits are meaningless to the library. If ANY of these bits are |
| 239 | // set then the MD5 sum is written with a new ID so that old decoders will not see it |
| 240 | // (because these features will cause the MD5 sum to be different and fail). |
| 241 | |
| 242 | #define QMODE_BIG_ENDIAN 0x1 // big-endian data format (opposite of WAV format) |
| 243 | #define QMODE_SIGNED_BYTES 0x2 // 8-bit audio data is signed (opposite of WAV format) |
| 244 | #define QMODE_UNSIGNED_WORDS 0x4 // audio data (other than 8-bit) is unsigned (opposite of WAV format) |
| 245 | #define QMODE_REORDERED_CHANS 0x8 // source channels were not Microsoft order, so they were reordered |
| 246 | #define QMODE_DSD_LSB_FIRST 0x10 // DSD bytes, LSB first (most Sony .dsf files) |
| 247 | #define QMODE_DSD_MSB_FIRST 0x20 // DSD bytes, MSB first (Philips .dff files) |
| 248 | #define QMODE_DSD_IN_BLOCKS 0x40 // DSD data is blocked by channels (Sony .dsf only) |
| 249 | #define QMODE_DSD_AUDIO (QMODE_DSD_LSB_FIRST | QMODE_DSD_MSB_FIRST) |
| 250 | |
| 251 | // The rest of the qmode word is reserved for the private use of the command-line programs |
| 252 | // and are ignored by the library (and not stored either). They really should not be defined |
| 253 | // here, but I thought it would be a good idea to have all the definitions together. |
| 254 | |
| 255 | #define QMODE_ADOBE_MODE 0x100 // user specified Adobe mode |
| 256 | #define QMODE_NO_STORE_WRAPPER 0x200 // user specified to not store audio file wrapper (RIFF, CAFF, etc.) |
| 257 | #define QMODE_CHANS_UNASSIGNED 0x400 // user specified "..." in --channel-order option |
| 258 | #define QMODE_IGNORE_LENGTH 0x800 // user specified to ignore length in file header |
| 259 | #define QMODE_RAW_PCM 0x1000 // user specified raw PCM format (no header present) |
| 260 | #define QMODE_EVEN_BYTE_DEPTH 0x2000 // user specified to force even byte bit-depth |
| 261 | |
| 262 | ////////////// Callbacks used for reading & writing WavPack streams ////////// |
| 263 | |
| 264 | typedef struct { |
| 265 | int32_t (*read_bytes)(void *id, void *data, int32_t bcount); |
| 266 | uint32_t (*get_pos)(void *id); |
| 267 | int (*set_pos_abs)(void *id, uint32_t pos); |
| 268 | int (*set_pos_rel)(void *id, int32_t delta, int mode); |
| 269 | int (*push_back_byte)(void *id, int c); |
| 270 | uint32_t (*get_length)(void *id); |
| 271 | int (*can_seek)(void *id); |
| 272 | |
| 273 | // this callback is for writing edited tags only |
| 274 | int32_t (*write_bytes)(void *id, void *data, int32_t bcount); |
| 275 | } WavpackStreamReader; |
| 276 | |
| 277 | // Extended version of structure for handling large files and added |
| 278 | // functionality for truncating and closing files |
| 279 | |
| 280 | typedef struct { |
| 281 | int32_t (*read_bytes)(void *id, void *data, int32_t bcount); |
| 282 | int32_t (*write_bytes)(void *id, void *data, int32_t bcount); |
| 283 | int64_t (*get_pos)(void *id); // new signature for large files |
| 284 | int (*set_pos_abs)(void *id, int64_t pos); // new signature for large files |
| 285 | int (*set_pos_rel)(void *id, int64_t delta, int mode); // new signature for large files |
| 286 | int (*push_back_byte)(void *id, int c); |
| 287 | int64_t (*get_length)(void *id); // new signature for large files |
| 288 | int (*can_seek)(void *id); |
| 289 | int (*truncate_here)(void *id); // new function to truncate file at current position |
| 290 | int (*close)(void *id); // new function to close file |
| 291 | } WavpackStreamReader64; |
| 292 | |
| 293 | typedef int (*WavpackBlockOutput)(void *id, void *data, int32_t bcount); |
| 294 | |
| 295 | //////////////////////////// function prototypes ///////////////////////////// |
| 296 | |
| 297 | typedef struct WavpackContext WavpackContext; |
| 298 | |
| 299 | #ifdef __cplusplus |
| 300 | extern "C" { |
| 301 | #endif |
| 302 | |
| 303 | #define MAX_WAVPACK_SAMPLES ((1LL << 40) - 257) |
| 304 | |
| 305 | WavpackContext *WavpackOpenRawDecoder ( |
| 306 | void *main_data, int32_t main_size, |
| 307 | void *corr_data, int32_t corr_size, |
| 308 | int16_t version, char *error, int flags, int norm_offset); |
| 309 | |
| 310 | WavpackContext *WavpackOpenFileInputEx64 (WavpackStreamReader64 *reader, void *wv_id, void *wvc_id, char *error, int flags, int norm_offset); |
| 311 | WavpackContext *WavpackOpenFileInputEx (WavpackStreamReader *reader, void *wv_id, void *wvc_id, char *error, int flags, int norm_offset); |
| 312 | WavpackContext *WavpackOpenFileInput (const char *infilename, char *error, int flags, int norm_offset); |
| 313 | |
| 314 | #define OPEN_WVC 0x1 // open/read "correction" file |
| 315 | #define OPEN_TAGS 0x2 // read ID3v1 / APEv2 tags (seekable file) |
| 316 | #define OPEN_WRAPPER 0x4 // make audio wrapper available (i.e. RIFF) |
| 317 | #define OPEN_2CH_MAX 0x8 // open multichannel as stereo (no downmix) |
| 318 | #define OPEN_NORMALIZE 0x10 // normalize floating point data to +/- 1.0 |
| 319 | #define OPEN_STREAMING 0x20 // "streaming" mode blindly unpacks blocks |
| 320 | // w/o regard to header file position info |
| 321 | #define OPEN_EDIT_TAGS 0x40 // allow editing of tags |
| 322 | #define OPEN_FILE_UTF8 0x80 // assume filenames are UTF-8 encoded, not ANSI (Windows only) |
| 323 | |
| 324 | // new for version 5 |
| 325 | |
| 326 | #define OPEN_DSD_NATIVE 0x100 // open DSD files as bitstreams |
| 327 | // (returned as 8-bit "samples" stored in 32-bit words) |
| 328 | #define OPEN_DSD_AS_PCM 0x200 // open DSD files as 24-bit PCM (decimated 8x) |
| 329 | #define OPEN_ALT_TYPES 0x400 // application is aware of alternate file types & qmode |
| 330 | // (just affects retrieving wrappers & MD5 checksums) |
| 331 | #define OPEN_NO_CHECKSUM 0x800 // don't verify block checksums before decoding |
| 332 | |
| 333 | // new for multithreaded |
| 334 | |
| 335 | #define OPEN_THREADS_SHFT 12 // specify number of additional worker threads here for |
| 336 | #define OPEN_THREADS_MASK 0xF000 // decode; 0 to disable, otherwise 1-15 added threads |
| 337 | |
| 338 | int WavpackGetMode (WavpackContext *wpc); |
| 339 | |
| 340 | #define MODE_WVC 0x1 |
| 341 | #define MODE_LOSSLESS 0x2 |
| 342 | #define MODE_HYBRID 0x4 |
| 343 | #define MODE_FLOAT 0x8 |
| 344 | #define MODE_VALID_TAG 0x10 |
| 345 | #define MODE_HIGH 0x20 |
| 346 | #define MODE_FAST 0x40 |
| 347 | #define 0x80 // extra mode used, see MODE_XMODE for possible level |
| 348 | #define MODE_APETAG 0x100 |
| 349 | #define MODE_SFX 0x200 |
| 350 | #define MODE_VERY_HIGH 0x400 |
| 351 | #define MODE_MD5 0x800 |
| 352 | #define MODE_XMODE 0x7000 // mask for extra level (1-6, 0=unknown) |
| 353 | #define MODE_DNS 0x8000 |
| 354 | |
| 355 | int WavpackVerifySingleBlock (unsigned char *buffer, int verify_checksum); |
| 356 | int WavpackGetQualifyMode (WavpackContext *wpc); |
| 357 | char *WavpackGetErrorMessage (WavpackContext *wpc); |
| 358 | int WavpackGetVersion (WavpackContext *wpc); |
| 359 | char *WavpackGetFileExtension (WavpackContext *wpc); |
| 360 | unsigned char WavpackGetFileFormat (WavpackContext *wpc); |
| 361 | uint32_t WavpackUnpackSamples (WavpackContext *wpc, int32_t *buffer, uint32_t samples); |
| 362 | uint32_t WavpackGetNumSamples (WavpackContext *wpc); |
| 363 | int64_t WavpackGetNumSamples64 (WavpackContext *wpc); |
| 364 | uint32_t WavpackGetNumSamplesInFrame (WavpackContext *wpc); |
| 365 | uint32_t WavpackGetSampleIndex (WavpackContext *wpc); |
| 366 | int64_t WavpackGetSampleIndex64 (WavpackContext *wpc); |
| 367 | int WavpackGetNumErrors (WavpackContext *wpc); |
| 368 | int WavpackLossyBlocks (WavpackContext *wpc); |
| 369 | int WavpackSeekSample (WavpackContext *wpc, uint32_t sample); |
| 370 | int WavpackSeekSample64 (WavpackContext *wpc, int64_t sample); |
| 371 | WavpackContext *WavpackCloseFile (WavpackContext *wpc); |
| 372 | uint32_t WavpackGetSampleRate (WavpackContext *wpc); |
| 373 | uint32_t WavpackGetNativeSampleRate (WavpackContext *wpc); |
| 374 | int WavpackGetBitsPerSample (WavpackContext *wpc); |
| 375 | int WavpackGetBytesPerSample (WavpackContext *wpc); |
| 376 | int WavpackGetNumChannels (WavpackContext *wpc); |
| 377 | int WavpackGetChannelMask (WavpackContext *wpc); |
| 378 | int WavpackGetReducedChannels (WavpackContext *wpc); |
| 379 | int WavpackGetFloatNormExp (WavpackContext *wpc); |
| 380 | int WavpackGetMD5Sum (WavpackContext *wpc, unsigned char data [16]); |
| 381 | void WavpackGetChannelIdentities (WavpackContext *wpc, unsigned char *identities); |
| 382 | uint32_t WavpackGetChannelLayout (WavpackContext *wpc, unsigned char *reorder); |
| 383 | uint32_t WavpackGetWrapperBytes (WavpackContext *wpc); |
| 384 | unsigned char *WavpackGetWrapperData (WavpackContext *wpc); |
| 385 | void WavpackFreeWrapper (WavpackContext *wpc); |
| 386 | void WavpackSeekTrailingWrapper (WavpackContext *wpc); |
| 387 | double WavpackGetProgress (WavpackContext *wpc); |
| 388 | uint32_t WavpackGetFileSize (WavpackContext *wpc); |
| 389 | int64_t WavpackGetFileSize64 (WavpackContext *wpc); |
| 390 | double WavpackGetRatio (WavpackContext *wpc); |
| 391 | double WavpackGetAverageBitrate (WavpackContext *wpc, int count_wvc); |
| 392 | double WavpackGetInstantBitrate (WavpackContext *wpc); |
| 393 | int WavpackGetNumTagItems (WavpackContext *wpc); |
| 394 | int WavpackGetTagItem (WavpackContext *wpc, const char *item, char *value, int size); |
| 395 | int WavpackGetTagItemIndexed (WavpackContext *wpc, int index, char *item, int size); |
| 396 | int WavpackGetNumBinaryTagItems (WavpackContext *wpc); |
| 397 | int WavpackGetBinaryTagItem (WavpackContext *wpc, const char *item, char *value, int size); |
| 398 | int WavpackGetBinaryTagItemIndexed (WavpackContext *wpc, int index, char *item, int size); |
| 399 | int WavpackAppendTagItem (WavpackContext *wpc, const char *item, const char *value, int vsize); |
| 400 | int WavpackAppendBinaryTagItem (WavpackContext *wpc, const char *item, const char *value, int vsize); |
| 401 | int WavpackDeleteTagItem (WavpackContext *wpc, const char *item); |
| 402 | int WavpackWriteTag (WavpackContext *wpc); |
| 403 | |
| 404 | WavpackContext *WavpackOpenFileOutput (WavpackBlockOutput blockout, void *wv_id, void *wvc_id); |
| 405 | void WavpackSetFileInformation (WavpackContext *wpc, char *file_extension, unsigned char file_format); |
| 406 | |
| 407 | #define WP_FORMAT_WAV 0 // Microsoft RIFF, including BWF and RF64 variants |
| 408 | #define WP_FORMAT_W64 1 // Sony Wave64 |
| 409 | #define WP_FORMAT_CAF 2 // Apple CoreAudio |
| 410 | #define WP_FORMAT_DFF 3 // Philips DSDIFF |
| 411 | #define WP_FORMAT_DSF 4 // Sony DSD Format |
| 412 | #define WP_FORMAT_AIF 5 // Apple AIFF |
| 413 | |
| 414 | int WavpackSetConfiguration (WavpackContext *wpc, WavpackConfig *config, uint32_t total_samples); |
| 415 | int WavpackSetConfiguration64 (WavpackContext *wpc, WavpackConfig *config, int64_t total_samples, const unsigned char *chan_ids); |
| 416 | int WavpackSetChannelLayout (WavpackContext *wpc, uint32_t layout_tag, const unsigned char *reorder); |
| 417 | int WavpackAddWrapper (WavpackContext *wpc, void *data, uint32_t bcount); |
| 418 | int WavpackStoreMD5Sum (WavpackContext *wpc, unsigned char data [16]); |
| 419 | int WavpackPackInit (WavpackContext *wpc); |
| 420 | int WavpackPackSamples (WavpackContext *wpc, int32_t *sample_buffer, uint32_t sample_count); |
| 421 | int WavpackFlushSamples (WavpackContext *wpc); |
| 422 | void WavpackUpdateNumSamples (WavpackContext *wpc, void *first_block); |
| 423 | void *WavpackGetWrapperLocation (void *first_block, uint32_t *size); |
| 424 | double WavpackGetEncodedNoise (WavpackContext *wpc, double *peak); |
| 425 | |
| 426 | void WavpackFloatNormalize (int32_t *values, int32_t num_values, int delta_exp); |
| 427 | |
| 428 | void WavpackLittleEndianToNative (void *data, char *format); |
| 429 | void WavpackNativeToLittleEndian (void *data, char *format); |
| 430 | void WavpackBigEndianToNative (void *data, char *format); |
| 431 | void WavpackNativeToBigEndian (void *data, char *format); |
| 432 | |
| 433 | uint32_t WavpackGetLibraryVersion (void); |
| 434 | const char *WavpackGetLibraryVersionString (void); |
| 435 | |
| 436 | #ifdef __cplusplus |
| 437 | } |
| 438 | #endif |
| 439 | |
| 440 | #endif |
| 441 | |