1 /* license:BSD-3-Clause 2 * copyright-holders:Aaron Giles 3 *************************************************************************** 4 5 flac.h 6 7 FLAC compression wrappers 8 9 ***************************************************************************/ 10 11 #pragma once 12 13 #ifndef __FLAC_H__ 14 #define __FLAC_H__ 15 16 #include <stdint.h> 17 #include "libchdr_zlib.h" 18 #include "FLAC/ordinals.h" 19 #include "FLAC/stream_decoder.h" 20 21 /*************************************************************************** 22 * TYPE DEFINITIONS 23 *************************************************************************** 24 */ 25 26 typedef struct _flac_decoder flac_decoder; 27 struct _flac_decoder { 28 /* output state */ 29 FLAC__StreamDecoder* decoder; /* actual encoder */ 30 uint32_t sample_rate; /* decoded sample rate */ 31 uint8_t channels; /* decoded number of channels */ 32 uint8_t bits_per_sample; /* decoded bits per sample */ 33 uint32_t compressed_offset; /* current offset in compressed data */ 34 const FLAC__byte * compressed_start; /* start of compressed data */ 35 uint32_t compressed_length; /* length of compressed data */ 36 const FLAC__byte * compressed2_start; /* start of compressed data */ 37 uint32_t compressed2_length; /* length of compressed data */ 38 int16_t * uncompressed_start[8]; /* pointer to start of uncompressed data (up to 8 streams) */ 39 uint32_t uncompressed_offset; /* current position in uncompressed data */ 40 uint32_t uncompressed_length; /* length of uncompressed data */ 41 int uncompressed_swap; /* swap uncompressed sample data */ 42 uint8_t custom_header[0x2a]; /* custom header */ 43 }; 44 45 /* ======================> flac_decoder */ 46 47 void flac_decoder_init(flac_decoder* decoder); 48 void flac_decoder_free(flac_decoder* decoder); 49 int flac_decoder_reset(flac_decoder* decoder, uint32_t sample_rate, uint8_t num_channels, uint32_t block_size, const void *buffer, uint32_t length); 50 int flac_decoder_decode_interleaved(flac_decoder* decoder, int16_t *samples, uint32_t num_samples, int swap_endian); 51 uint32_t flac_decoder_finish(flac_decoder* decoder); 52 53 /* codec-private data for the CDFL codec */ 54 typedef struct _cdfl_codec_data cdfl_codec_data; 55 struct _cdfl_codec_data { 56 /* internal state */ 57 int swap_endian; 58 flac_decoder decoder; 59 #ifdef WANT_SUBCODE 60 zlib_codec_data subcode_decompressor; 61 #endif 62 uint8_t* buffer; 63 }; 64 65 /* cdfl compression codec */ 66 chd_error cdfl_codec_init(void* codec, uint32_t hunkbytes); 67 void cdfl_codec_free(void* codec); 68 chd_error cdfl_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); 69 70 #endif /* __FLAC_H__ */ 71