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