#ifndef FFMPEG_AUDIO_H #define FFMPEG_AUDIO_H #include #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