comparison flac.h @ 2298:9d68799f945b

Added basic FLAC seek implementation and added support for FLAC tracks in CUE sheets
author Michael Pavone <pavone@retrodev.com>
date Thu, 09 Mar 2023 22:49:42 -0800
parents 789802d99629
children
comparison
equal deleted inserted replaced
2297:e6b2b2341c68 2298:9d68799f945b
4 #include <stdint.h> 4 #include <stdint.h>
5 #include <stdio.h> 5 #include <stdio.h>
6 6
7 typedef struct flac_file flac_file; 7 typedef struct flac_file flac_file;
8 8
9 typedef uint8_t (*flac_read)(flac_file *f); 9 typedef uint8_t (*flac_read_fun)(flac_file *f);
10 typedef void (*flac_seek)(flac_file *f, uint32_t offset, uint8_t relative); 10 typedef void (*flac_seek_fun)(flac_file *f, uint32_t offset, uint8_t relative);
11 typedef uint32_t (*flac_tell_fun)(flac_file *f);
11 12
12 typedef struct { 13 typedef struct {
13 uint32_t allocated_samples; 14 uint32_t allocated_samples;
14 int32_t *decoded; 15 int32_t *decoded;
15 } flac_subframe; 16 } flac_subframe;
16 17
18 typedef struct {
19 uint64_t sample_number;
20 uint64_t offset;
21 uint16_t sample_count;
22 } flac_seekpoint;
23
17 struct flac_file { 24 struct flac_file {
18 uint64_t total_samples; 25 uint64_t total_samples;
19 uint64_t frame_start_sample; 26 uint64_t frame_start_sample;
20 void *read_data; 27 void *read_data;
21 flac_read read_byte; 28 flac_read_fun read_byte;
22 flac_seek seek; 29 flac_seek_fun seek;
23 flac_subframe *subframes; 30 flac_tell_fun tell;
24 uint32_t offset; 31 flac_subframe *subframes;
25 uint32_t buffer_size; 32 flac_seekpoint *seekpoints;
33 uint32_t num_seekpoints;
34 uint32_t offset;
35 uint32_t buffer_size;
36 uint32_t first_frame_offset;
26 37
27 uint32_t frame_sample_pos; 38 uint32_t frame_sample_pos;
28 uint32_t remaining_frame_samples;
29 39
30 uint32_t sample_rate; 40 uint32_t sample_rate;
31 uint32_t frame_sample_rate; 41 uint32_t frame_sample_rate;
32 uint32_t frame_block_size; 42 uint32_t frame_block_size;
33 uint8_t bits_per_sample; 43 uint8_t bits_per_sample;
34 uint8_t frame_bits_per_sample; 44 uint8_t frame_bits_per_sample;
35 uint8_t channels; 45 uint8_t channels;
36 uint8_t frame_channels; 46 uint8_t frame_channels;
37 uint8_t frame_joint_stereo; 47 uint8_t frame_joint_stereo;
38 uint8_t subframe_alloc; 48 uint8_t subframe_alloc;
39 49
40 uint8_t cur_byte; 50 uint8_t cur_byte;
41 uint8_t bits; 51 uint8_t bits;
42 }; 52 };
43 53
44 flac_file *flac_file_from_buffer(void *buffer, uint32_t size); 54 flac_file *flac_file_from_buffer(void *buffer, uint32_t size);
45 flac_file *flac_file_from_file(FILE *file); 55 flac_file *flac_file_from_file(FILE *file);
46 uint8_t flac_get_sample(flac_file *f, int16_t *out, uint8_t desired_channels); 56 uint8_t flac_get_sample(flac_file *f, int16_t *out, uint8_t desired_channels);
57 void flac_seek(flac_file *f, uint64_t sample_number);
47 58
48 #endif //FLAC_H_ 59 #endif //FLAC_H_