view flac.h @ 2296:789802d99629

Add basic FLAC decoder and add FLAC playback support to the media player
author Michael Pavone <pavone@retrodev.com>
date Sun, 19 Feb 2023 21:12:46 -0800
parents
children 9d68799f945b
line wrap: on
line source

#ifndef FLAC_H_
#define FLAC_H_

#include <stdint.h>
#include <stdio.h>

typedef struct flac_file flac_file;

typedef uint8_t (*flac_read)(flac_file *f);
typedef void (*flac_seek)(flac_file *f, uint32_t offset, uint8_t relative);

typedef struct {
	uint32_t allocated_samples;
	int32_t *decoded;
} flac_subframe;

struct flac_file {
	uint64_t      total_samples;
	uint64_t      frame_start_sample;
	void          *read_data;
	flac_read     read_byte;
	flac_seek     seek;
	flac_subframe *subframes;
	uint32_t      offset;
	uint32_t      buffer_size;

	uint32_t      frame_sample_pos;
	uint32_t      remaining_frame_samples;

	uint32_t      sample_rate;
	uint32_t      frame_sample_rate;
	uint32_t      frame_block_size;
	uint8_t       bits_per_sample;
	uint8_t       frame_bits_per_sample;
	uint8_t       channels;
	uint8_t       frame_channels;
	uint8_t       frame_joint_stereo;
	uint8_t       subframe_alloc;

	uint8_t       cur_byte;
	uint8_t       bits;
};

flac_file *flac_file_from_buffer(void *buffer, uint32_t size);
flac_file *flac_file_from_file(FILE *file);
uint8_t flac_get_sample(flac_file *f, int16_t *out, uint8_t desired_channels);

#endif //FLAC_H_