Files
gemigreerd-racket-sound-lib/ffmpeg-audio/ffmpeg_audio.h
T
2026-04-26 11:22:31 +02:00

114 lines
3.6 KiB
C

#ifndef FFMPEG_AUDIO_H
#define FFMPEG_AUDIO_H
#include <stdint.h>
#ifdef _WIN32
#ifdef LIB_COMPILE
#define FFMPEG_EXTERN __declspec(dllexport)
#else
#define FFMPEG_EXTERN __declspec(dllimport)
#endif
#else
#define FFMPEG_EXTERN
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*
* Audio-only Acinerella API.
*
* The implementation may be C++, but this header is plain C-compatible.
* All public structs below are opaque handles, except ac_audio_info.
*/
typedef struct __fmpg_instance__ fmpg_instance;
typedef struct __fmpg_decoder__ fmpg_decoder;
typedef struct __fmpg_package__ fmpg_package;
typedef struct __fmpg_file_info__ fmpg_file_info;
typedef struct __fmpg_audio_info__ {
int sample_rate;
int channels;
int bits_per_sample; /* Always 32. */
int bytes_per_sample; /* Always 4. */
} fmpg_audio_info;
/* Lifecycle */
FFMPEG_EXTERN fmpg_instance * ac_init(void);
FFMPEG_EXTERN void ac_free(fmpg_instance * instance);
FFMPEG_EXTERN int ac_open_file(fmpg_instance * instance, const char *filename);
FFMPEG_EXTERN void ac_close(fmpg_instance * instance);
FFMPEG_EXTERN int ac_is_open(fmpg_instance * instance);
/* Audio stream discovery */
FFMPEG_EXTERN int ac_get_audio_stream_count(fmpg_instance * instance);
FFMPEG_EXTERN int ac_get_default_audio_stream(fmpg_instance * instance);
FFMPEG_EXTERN int ac_get_audio_info(fmpg_instance * instance, int stream_index, fmpg_audio_info *info);
/* Metadata. The returned strings are owned by the instance. */
FFMPEG_EXTERN const fmpg_file_info * ac_get_file_info(fmpg_instance * instance);
FFMPEG_EXTERN const char * ac_file_info_title(const fmpg_file_info *info);
FFMPEG_EXTERN const char * ac_file_info_author(const fmpg_file_info *info);
FFMPEG_EXTERN const char * ac_file_info_album(const fmpg_file_info *info);
FFMPEG_EXTERN const char * ac_file_info_genre(const fmpg_file_info *info);
FFMPEG_EXTERN const char * ac_file_info_comment(const fmpg_file_info *info);
FFMPEG_EXTERN const char * ac_file_info_copyright(const fmpg_file_info *info);
FFMPEG_EXTERN int ac_file_info_year(const fmpg_file_info *info);
FFMPEG_EXTERN int ac_file_info_track(const fmpg_file_info *info);
FFMPEG_EXTERN int64_t ac_file_info_duration(const fmpg_file_info *info);
FFMPEG_EXTERN int ac_file_info_bitrate(const fmpg_file_info *info);
/* Packet reading */
FFMPEG_EXTERN fmpg_package * ac_read_package(fmpg_instance * instance);
FFMPEG_EXTERN void ac_free_package(fmpg_package * package);
FFMPEG_EXTERN int ac_package_stream_index(fmpg_package * package);
/* Decoder */
FFMPEG_EXTERN fmpg_decoder * ac_create_decoder(fmpg_instance * instance, int stream_index);
FFMPEG_EXTERN void ac_free_decoder(fmpg_decoder * decoder);
/*
* Decode one compressed packet.
*
* Returns 1 if PCM data was produced, 0 otherwise.
*
* Output format:
* signed 32-bit integer PCM
* interleaved
* native endian
*
* Example stereo layout:
* L0 R0 L1 R1 L2 R2 ...
*/
FFMPEG_EXTERN int ac_decode_package(fmpg_package * package, fmpg_decoder * decoder);
/*
* Flush delayed decoder/resampler samples after EOF.
*
* Call this repeatedly after ac_read_package() returns NULL,
* until it returns 0.
*/
FFMPEG_EXTERN int ac_flush_decoder(fmpg_decoder * decoder);
/* Seek to absolute position in milliseconds. */
FFMPEG_EXTERN int ac_seek_ms(fmpg_decoder * decoder, int64_t target_pos_ms);
/* Decoder output */
FFMPEG_EXTERN const uint8_t * ac_decoder_buffer(fmpg_decoder * decoder);
FFMPEG_EXTERN int ac_decoder_buffer_size(fmpg_decoder * decoder);
FFMPEG_EXTERN double ac_decoder_timecode(fmpg_decoder * decoder);
FFMPEG_EXTERN int ac_decoder_stream_index(fmpg_decoder * decoder);
#ifdef __cplusplus
}
#endif
#endif