2008-01-31 07:04:26 +01:00
/*
* vgmstream . h - definitions for VGMSTREAM , encapsulating a multi - channel , looped audio stream
*/
# ifndef _VGMSTREAM_H
# define _VGMSTREAM_H
2008-07-05 13:49:29 +02:00
/* Vorbis and MPEG decoding are done by external libraries.
* If someone wants to do a standalone build , they can do it by simply
* removing these defines ( and the references to the libraries in the
* Makefile ) */
2008-06-15 06:01:03 +02:00
# define VGM_USE_VORBIS
2008-07-05 13:49:29 +02:00
# define VGM_USE_MPEG
2008-06-15 06:01:03 +02:00
2008-05-06 05:35:37 +02:00
# include "streamfile.h"
# include "coding/g72x_state.h"
2008-06-15 06:01:03 +02:00
# ifdef VGM_USE_VORBIS
# include <vorbis/vorbisfile.h>
# endif
2008-07-05 13:49:29 +02:00
# ifdef VGM_USE_MPEG
# include <mpg123.h>
# endif
2008-07-20 07:41:41 +02:00
# include "coding/acm_decoder.h"
2008-08-03 16:58:03 +02:00
# include "coding/nwa_decoder.h"
2008-05-06 05:35:37 +02:00
2008-01-31 07:04:26 +01:00
/* The encoding type specifies the format the sound data itself takes */
typedef enum {
/* 16-bit PCM */
coding_PCM16BE , /* big endian 16-bit PCM */
coding_PCM16LE , /* little endian 16-bit PCM */
2008-07-14 22:42:49 +02:00
coding_PCM16LE_int , /* little endian 16-bit PCM with sample-level
interleave handled by the decoder */
2008-07-14 21:21:45 +02:00
2008-01-31 07:04:26 +01:00
/* 8-bit PCM */
coding_PCM8 , /* 8-bit PCM */
2008-07-14 22:42:49 +02:00
coding_PCM8_int , /* 8-Bit PCM with sample-level interleave handled
by the decoder */
2008-07-30 22:58:50 +02:00
coding_PCM8_SB_int , /* 8-bit PCM, sign bit (others are 2's complement),
sample - level interleave */
2008-07-14 21:21:45 +02:00
2008-01-31 07:04:26 +01:00
/* 4-bit ADPCM */
coding_NDS_IMA , /* IMA ADPCM w/ NDS layout */
coding_CRI_ADX , /* CRI ADX */
coding_NGC_DSP , /* NGC ADPCM, called DSP */
2008-02-13 15:31:21 +01:00
coding_NGC_DTK , /* NGC hardware disc ADPCM, called DTK, TRK or ADP */
2008-02-14 23:10:08 +01:00
coding_G721 , /* CCITT G.721 ADPCM */
2008-03-03 22:38:11 +01:00
coding_NGC_AFC , /* NGC ADPCM, called AFC */
2008-05-04 22:36:40 +02:00
coding_PSX , /* PSX & PS2 ADPCM */
2008-06-25 22:39:15 +02:00
coding_invert_PSX , /* PSX ADPCM with first byte of frame inverted */
2008-07-25 21:02:29 +02:00
coding_PSX_badflags , /* with garbage in the flags byte */
2008-05-10 21:59:29 +02:00
coding_XA , /* PSX CD-XA */
2008-05-24 00:52:02 +02:00
coding_XBOX , /* XBOX IMA */
2008-06-02 19:58:08 +02:00
coding_EAXA , /* EA/XA ADPCM */
2008-07-14 21:21:45 +02:00
coding_EA_ADPCM , /* EA ADPCM */
2008-06-15 06:01:03 +02:00
# ifdef VGM_USE_VORBIS
coding_ogg_vorbis , /* vorbis */
# endif
2008-07-01 05:23:44 +02:00
coding_SDX2 , /* SDX2 2:1 Squareroot-Delta-Exact compression */
2008-07-14 22:42:49 +02:00
coding_SDX2_int , /* SDX2 2:1 Squareroot-Delta-Exact compression,
with smaple - level interleave handled by the
decoder */
2008-07-03 04:20:52 +02:00
coding_DVI_IMA , /* DVI (bare IMA, high nibble first), aka ADP4 */
2008-08-08 16:47:04 +02:00
coding_INT_DVI_IMA , /* Interleaved DVI */
2008-07-14 21:21:45 +02:00
coding_EACS_IMA ,
2008-07-03 04:20:52 +02:00
coding_IMA , /* bare IMA, low nibble first */
2008-09-23 13:07:41 +02:00
coding_INT_IMA , /* */
2008-07-03 23:21:01 +02:00
coding_WS , /* Westwood Studios' custom VBR ADPCM */
2008-07-05 13:49:29 +02:00
# ifdef VGM_USE_MPEG
2008-07-06 17:33:38 +02:00
coding_fake_MPEG2_L2 , /* MPEG-2 Layer 2 (AHX), with lying headers */
/* I don't even know offhand if all these combinations exist... */
coding_MPEG1_L1 ,
coding_MPEG1_L2 ,
coding_MPEG1_L3 , /* good ol' MPEG-1 Layer 3 (MP3) */
coding_MPEG2_L1 ,
coding_MPEG2_L2 ,
coding_MPEG2_L3 ,
coding_MPEG25_L1 ,
coding_MPEG25_L2 ,
coding_MPEG25_L3 ,
2008-07-05 13:49:29 +02:00
# endif
2008-07-20 07:41:41 +02:00
coding_ACM , /* InterPlay ACM */
2008-08-03 16:58:03 +02:00
/* compressed NWA at various levels */
coding_NWA0 ,
coding_NWA1 ,
coding_NWA2 ,
coding_NWA3 ,
coding_NWA4 ,
coding_NWA5 ,
2008-08-11 09:19:44 +02:00
2008-08-13 08:11:05 +02:00
coding_MSADPCM , /* Microsoft ADPCM */
coding_AICA , /* Yamaha AICA ADPCM */
2008-01-31 07:04:26 +01:00
} coding_t ;
/* The layout type specifies how the sound data is laid out in the file */
typedef enum {
/* generic */
layout_none , /* straight data */
/* interleave */
layout_interleave , /* equal interleave throughout the stream */
layout_interleave_shortblock , /* interleave with a short last block */
2008-07-14 14:31:19 +02:00
layout_interleave_byte , /* full byte interleave */
2008-01-31 07:04:26 +01:00
/* headered blocks */
2008-03-04 01:46:55 +01:00
layout_ast_blocked , /* .ast STRM with BLCK blocks*/
2008-03-04 08:15:25 +01:00
layout_halpst_blocked , /* blocks with HALPST-format header */
2008-05-10 21:59:29 +02:00
layout_xa_blocked ,
2008-06-02 19:58:08 +02:00
layout_ea_blocked ,
2008-07-14 21:21:45 +02:00
layout_eacs_blocked ,
2008-06-03 20:41:26 +02:00
layout_caf_blocked ,
2008-06-29 03:30:13 +02:00
layout_wsi_blocked ,
2008-07-02 15:39:51 +02:00
layout_str_snds_blocked ,
2008-07-03 04:20:52 +02:00
layout_ws_aud_blocked ,
2008-08-10 22:08:03 +02:00
layout_matx_blocked ,
2008-08-11 09:19:44 +02:00
layout_de2_blocked ,
2008-08-19 13:34:16 +02:00
layout_xvas_blocked ,
2008-03-04 01:46:55 +01:00
#if 0
2008-01-31 07:04:26 +01:00
layout_strm_blocked , /* */
2008-02-15 17:26:29 +01:00
# endif
2008-02-13 15:31:21 +01:00
/* otherwise odd */
layout_dtk_interleave , /* dtk interleaves channels by nibble */
2008-06-15 06:01:03 +02:00
# ifdef VGM_USE_VORBIS
layout_ogg_vorbis , /* ogg vorbis file */
# endif
2008-07-05 13:49:29 +02:00
# ifdef VGM_USE_MPEG
layout_fake_mpeg , /* MPEG audio stream with bad frame headers (AHX) */
2008-07-06 17:33:38 +02:00
layout_mpeg , /* proper MPEG audio stream */
2008-07-05 13:49:29 +02:00
# endif
2008-07-20 07:41:41 +02:00
layout_acm , /* dummy, let libacm handle layout */
2008-07-21 01:28:16 +02:00
layout_mus_acm , /* mus has multi-files to deal with */
2008-08-02 12:24:28 +02:00
layout_aix , /* CRI AIX's wheels within wheels */
2008-01-31 07:04:26 +01:00
} layout_t ;
/* The meta type specifies how we know what we know about the file. We may know because of a header we read, some of it may have been guessed from filenames, etc. */
typedef enum {
/* DSP-specific */
meta_DSP_STD , /* standard GC ADPCM (DSP) header */
meta_DSP_CSTR , /* Star Fox Assault "Cstr" */
meta_DSP_RS03 , /* Metroid Prime 2 "RS03" */
meta_DSP_STM , /* Paper Mario 2 STM */
meta_DSP_HALP , /* SSB:M "HALPST" */
2008-05-15 00:26:44 +02:00
meta_DSP_AGSC , /* Metroid Prime 2 title */
meta_DSP_MPDSP , /* Monopoly Party single header stereo */
2008-05-16 00:06:33 +02:00
meta_DSP_JETTERS , /* Bomberman Jetters .dsp */
meta_DSP_MSS ,
meta_DSP_GCM ,
2008-06-15 11:23:34 +02:00
meta_DSP_STR , /* Conan .str files */
meta_DSP_SADB , /* .sad */
2008-06-29 03:30:13 +02:00
meta_DSP_WSI , /* .wsi */
2008-07-06 13:24:14 +02:00
meta_DSP_AMTS , /* .amts */
2008-08-22 02:24:15 +02:00
meta_DSP_WII_IDSP , /* .gcm with IDSP header */
2008-05-28 13:36:17 +02:00
2008-01-31 07:04:26 +01:00
/* Nintendo */
meta_STRM , /* STRM */
meta_RSTM , /* RSTM (similar to STRM) */
2008-03-03 22:38:11 +01:00
meta_AFC , /* AFC */
2008-03-04 01:46:55 +01:00
meta_AST , /* AST */
2008-05-06 03:01:06 +02:00
meta_RWSD , /* single-stream RWSD */
2008-05-17 01:14:47 +02:00
meta_RSTM_SPM , /* RSTM with 44->22khz hack */
2008-01-31 07:04:26 +01:00
/* CRI ADX */
meta_ADX_03 , /* ADX "type 03" */
meta_ADX_04 , /* ADX "type 04" */
2008-05-03 21:44:49 +02:00
meta_ADX_05 , /* ADX "type 05" */
2008-08-02 12:24:28 +02:00
meta_AIX , /* CRI AIX */
2008-05-03 21:44:49 +02:00
2008-01-31 07:04:26 +01:00
/* etc */
2008-02-14 23:10:08 +01:00
meta_NGC_ADPDTK , /* NGC DTK/ADP, no header (.adp) */
2008-01-31 07:04:26 +01:00
meta_kRAW , /* almost headerless PCM */
2008-02-14 23:10:08 +01:00
meta_RSF , /* Retro Studios RSF, no header (.rsf) */
2008-03-04 08:15:25 +01:00
meta_HALPST , /* HAL Labs HALPST */
2008-04-02 19:50:50 +02:00
meta_GCSW , /* GCSW (PCM) */
2008-06-03 20:41:26 +02:00
meta_CFN , /* Namco CAF Audio File */
2008-05-04 22:36:40 +02:00
2008-05-06 00:45:21 +02:00
meta_PS2_SShd , /* .ADS with SShd header */
meta_PS2_NPSF , /* Namco Production Sound File */
2008-05-11 20:11:55 +02:00
meta_PS2_RXW , /* Sony Arc The Lad Sound File */
2008-05-11 23:27:10 +02:00
meta_PS2_RAW , /* RAW Interleaved Format */
2008-05-13 13:47:51 +02:00
meta_PS2_EXST , /* Shadow of Colossus EXST */
2008-05-13 21:53:31 +02:00
meta_PS2_SVAG , /* Konami SVAG */
2008-05-14 22:44:19 +02:00
meta_PS2_MIB , /* MIB File */
meta_PS2_MIB_MIH , /* MIB File + MIH Header*/
2008-05-15 20:57:03 +02:00
meta_PS2_MIC , /* KOEI MIC File */
2008-05-17 23:52:40 +02:00
meta_PS2_VAGi , /* VAGi Interleaved File */
meta_PS2_VAGp , /* VAGp Mono File */
2008-05-20 20:09:05 +02:00
meta_PS2_VAGm , /* VAGp Mono File */
2008-05-17 23:52:40 +02:00
meta_PS2_pGAV , /* VAGp with Little Endian Header */
2008-05-19 13:39:30 +02:00
meta_PSX_GMS , /* GMS File (used in PS1 & PS2) */
2008-05-20 20:09:05 +02:00
meta_PS2_STR , /* Pacman STR+STH files */
2008-05-21 23:26:52 +02:00
meta_PS2_ILD , /* ILD File */
2008-05-22 21:08:49 +02:00
meta_PS2_PNB , /* PsychoNauts Bgm File */
2008-05-11 20:11:55 +02:00
meta_PSX_XA , /* CD-XA with RIFF header */
2008-05-28 13:36:17 +02:00
meta_PS2_VAGs , /* VAG Stereo from Kingdom Hearts */
2008-06-07 23:11:33 +02:00
meta_PS2_VPK , /* VPK Audio File */
2008-06-25 18:42:13 +02:00
meta_PS2_BMDX , /* Beatmania thing */
2008-07-06 14:23:37 +02:00
meta_PS2_IVB , /* Langrisser 3 IVB */
meta_PS2_SVS , /* Square SVS */
2008-07-12 17:20:39 +02:00
meta_XSS , /* Dino Crisis 3 */
meta_SL3 , /* Test Drive Unlimited */
meta_HGC1 , /* Knights of the Temple 2 */
meta_AUS , /* Variuos Capcom Games */
meta_RWS , /* Variuos Konami Games */
2008-07-14 13:02:39 +02:00
meta_RSD , /* Crash Bandicoot Games */
2008-07-14 18:20:47 +02:00
meta_FSB3 , /* FMOD Sample Bank, version 3 */
2008-07-14 15:08:01 +02:00
meta_RWX , /* Air Force Delta Storm (XBOX) */
meta_XWB , /* King of Fighters (XBOX) */
2008-07-15 05:39:20 +02:00
meta_XA30 , /* Driver - Parallel Lines (PS2) */
2008-07-17 03:22:23 +02:00
meta_MUSC , /* Spyro Games, possibly more */
meta_MUSX , /* Spyro Games, possibly more */
meta_LEG , /* Legaia 2 */
meta_FILP , /* Resident Evil - Dead Aim */
meta_IKM , /* Zwei! */
2008-07-17 16:20:42 +02:00
meta_SFS , /* Baroque */
2008-07-18 22:53:04 +02:00
meta_BG00 , /* Ibara, Mushihimesama */
2008-07-19 10:48:49 +02:00
meta_PS2_RSTM , /* Midnight Club 3 */
2008-07-20 18:34:01 +02:00
meta_PS2_KCES , /* Dance Dance Revolution */
meta_PS2_DXH , /* Tokobot Plus - Myteries of the Karakuri */
2008-07-20 22:41:11 +02:00
meta_PS2_PSH , /* Dawn of Mana - Seiken Densetsu 4 */
2008-07-31 00:13:25 +02:00
meta_PCM , /* Ephemeral Fantasia, Lunar - Eternal Blue */
2008-07-25 19:49:09 +02:00
meta_PS2_RKV , /* Legacy of Kain - Blood Omen 2 */
meta_PS2_PSW , /* Rayman Raving Rabbids */
meta_PS2_VAS , /* Pro Baseball Spirits 5 */
2008-07-29 15:07:10 +02:00
meta_PS2_TEC , /* TECMO badflagged stream */
meta_PS2_ENTH , /* Enthusia */
2008-08-02 19:29:03 +02:00
meta_SDT , /* Baldur's Gate - Dark Alliance */
meta_NGC_TYDSP , /* Ty - The Tasmanian Tiger */
2008-08-04 18:32:35 +02:00
meta_NGC_SWD , /* Conflict - Desert Storm 1 & 2 */
meta_NGC_VJDSP , /* Viewtiful Joe */
2008-08-10 00:38:44 +02:00
meta_DC_STR , /* Evil Dead */
2008-08-31 13:34:55 +02:00
meta_NGC_BH2PCM , /* Bio Hazard 2 */
2008-08-19 14:25:43 +02:00
meta_SAT_SAP , /* Bubble Symphony */
2008-08-31 13:34:55 +02:00
meta_DC_IDVI , /* Eldorado Gate */
meta_KRAW , /* Geometry Wars - Galaxies */
2008-09-08 20:55:01 +02:00
meta_PS2_OMU , /* PS2 Int file with Header */
meta_PS2_XA2 , /* XA2 XG3 file */
2008-09-23 07:13:53 +02:00
meta_IDSP , /* Chronicles of Narnia */
2008-09-23 08:05:37 +02:00
meta_NGC_YMF , /* WWE WrestleMania X8 */
2008-09-23 13:07:41 +02:00
meta_SADL , /* .sad */
2008-09-24 07:56:25 +02:00
meta_PS2_CCC , /* Tokyo Xtreme Racer DRIFT 2 */
meta_PSX_FAG , /* Jackie Chan - Stuntmaster */
2008-09-24 18:36:19 +02:00
meta_PS2_MIHB , /* Merged MIH+MIB */
2008-10-04 20:52:50 +02:00
meta_NGC_PDT , /* Mario Party 6 */
2008-09-30 15:39:17 +02:00
2008-05-24 00:52:02 +02:00
meta_XBOX_WAVM , /* XBOX WAVM File */
2008-05-24 17:11:32 +02:00
meta_XBOX_RIFF , /* XBOX RIFF/WAVE File */
2008-08-04 22:42:44 +02:00
meta_XBOX_WVS , /* XBOX WVS */
2008-08-08 16:47:04 +02:00
meta_XBOX_STMA , /* XBOX STMA */
2008-08-10 22:08:03 +02:00
meta_XBOX_MATX , /* XBOX MATX */
2008-08-18 19:51:22 +02:00
meta_XBOX_XMU , /* XBOX XMU */
2008-08-19 13:34:16 +02:00
meta_XBOX_XVAS , /* XBOX VAS */
2008-09-30 15:39:17 +02:00
2008-06-02 19:58:08 +02:00
meta_EAXA_R2 , /* EA XA Release 2 */
meta_EAXA_R3 , /* EA XA Release 3 */
meta_EAXA_PSX , /* EA with PSX ADPCM */
2008-07-14 21:21:45 +02:00
meta_EACS_PC , /* EACS PC */
meta_EACS_PSX , /* EACS PSX */
meta_EACS_SAT , /* EACS SATURN */
meta_EA_ADPCM , /* EA XA ADPCM */
2008-09-21 16:58:50 +02:00
meta_EA_IMA , /* EA IMA */
2008-07-14 21:21:45 +02:00
meta_EA_PCM , /* EA PCM */
2008-06-02 19:58:08 +02:00
2008-05-17 19:26:20 +02:00
meta_RAW , /* RAW PCM file */
2008-06-10 03:20:54 +02:00
meta_GENH , /* generic header */
2008-06-15 06:01:03 +02:00
# ifdef VGM_USE_VORBIS
meta_ogg_vorbis , /* ogg vorbis */
2008-07-21 07:50:28 +02:00
meta_OGG_SLI , /* Ogg Vorbis file w/ companion .sli for looping */
2008-07-22 03:03:20 +02:00
meta_OGG_SLI2 , /* Ogg Vorbis file w/ different styled .sli for looping */
2008-07-22 04:18:32 +02:00
meta_OGG_SFL , /* Ogg Vorbis file w/ .sfl (RIFF SFPL) for looping */
2008-07-24 23:49:27 +02:00
meta_um3_ogg , /* Ogg Vorbis with first 0x800 bytes XOR 0xFF */
2008-06-15 06:01:03 +02:00
# endif
2008-07-01 05:23:44 +02:00
meta_AIFC , /* Audio Interchange File Format AIFF-C */
2008-07-01 18:11:59 +02:00
meta_AIFF , /* Audio Interchange File Format */
2008-07-02 15:39:51 +02:00
meta_STR_SNDS , /* .str with SNDS blocks and SHDR header */
2008-07-03 04:20:52 +02:00
meta_WS_AUD , /* Westwood Studios .aud */
meta_WS_AUD_old , /* Westwood Studios .aud, old style */
2008-07-05 13:49:29 +02:00
# ifdef VGM_USE_MPEG
meta_AHX , /* CRI AHX header (same structure as ADX) */
# endif
2008-07-06 20:05:04 +02:00
meta_RIFF_WAVE , /* RIFF, for WAVs */
meta_RIFF_WAVE_POS , /* .wav + .pos for looping */
2008-07-21 07:03:16 +02:00
meta_RIFF_WAVE_labl_Marker , /* RIFF w/ loop Markers in LIST-adtl-labl */
2008-07-11 02:41:21 +02:00
meta_NWA , /* Visual Art's NWA */
2008-07-11 08:34:09 +02:00
meta_NWA_NWAINFOINI , /* NWA w/ NWAINFO.INI for looping */
meta_NWA_GAMEEXEINI , /* NWA w/ Gameexe.ini for looping */
2008-07-18 21:35:29 +02:00
meta_DVI , /* DVI Interleaved */
2008-07-18 22:20:16 +02:00
meta_KCEY , /* KCEYCOMP */
2008-07-20 07:41:41 +02:00
meta_ACM , /* InterPlay ACM header */
meta_MUS_ACM , /* MUS playlist of InterPlay ACM files */
2008-08-11 09:19:44 +02:00
meta_DE2 , /* Falcom (Gurumin) .de2 */
2008-01-31 07:04:26 +01:00
} meta_t ;
typedef struct {
STREAMFILE * streamfile ; /* file used by this channel */
off_t channel_start_offset ; /* where data for this channel begins */
off_t offset ; /* current location in the file */
2008-07-04 02:06:51 +02:00
off_t frame_header_offset ; /* offset of the current frame header (for WS) */
int samples_left_in_frame ; /* for WS */
2008-01-31 07:04:26 +01:00
/* format specific */
/* adpcm */
int16_t adpcm_coef [ 16 ] ; /* for formats with decode coefficients built in */
union {
int16_t adpcm_history1_16 ; /* previous sample */
int32_t adpcm_history1_32 ;
} ;
union {
int16_t adpcm_history2_16 ; /* previous previous sample */
int32_t adpcm_history2_32 ;
} ;
2008-02-05 10:21:20 +01:00
2008-08-11 09:19:44 +02:00
int adpcm_step_index ; /* for IMA */
int adpcm_scale ; /* for MS ADPCM */
2008-02-14 23:10:08 +01:00
struct g72x_state g72x_state ; /* state for G.721 decoder, sort of big but we
might as well keep it around */
2008-04-02 18:11:53 +02:00
# ifdef DEBUG
int samples_done ;
int16_t loop_history1 , loop_history2 ;
# endif
2008-01-31 07:04:26 +01:00
} VGMSTREAMCHANNEL ;
typedef struct {
/* basics */
int32_t num_samples ; /* the actual number of samples in this stream */
int32_t sample_rate ; /* sample rate in Hz */
int channels ; /* number of channels */
coding_t coding_type ; /* type of encoding */
layout_t layout_type ; /* type of layout for data */
meta_t meta_type ; /* how we know the metadata */
/* looping */
int loop_flag ; /* is this stream looped? */
int32_t loop_start_sample ; /* first sample of the loop (included in the loop) */
int32_t loop_end_sample ; /* last sample of the loop (not included in the loop) */
/* channels */
VGMSTREAMCHANNEL * ch ; /* pointer to array of channels */
2008-05-20 22:19:46 +02:00
/* channel copies */
2008-03-25 08:30:04 +01:00
VGMSTREAMCHANNEL * start_ch ; /* copies of channel status as they were at the beginning of the stream */
2008-01-31 07:04:26 +01:00
VGMSTREAMCHANNEL * loop_ch ; /* copies of channel status as they were at the loop point */
/* layout-specific */
int32_t current_sample ; /* number of samples we've passed */
int32_t samples_into_block ; /* number of samples into the current block */
/* interleave */
size_t interleave_block_size ; /* interleave for this file */
size_t interleave_smallblock_size ; /* smaller interleave for last block */
/* headered blocks */
off_t current_block_offset ; /* start of this block (offset of block header) */
size_t current_block_size ; /* size of the block we're in now */
off_t next_block_offset ; /* offset of header of the next block */
int hit_loop ; /* have we seen the loop yet? */
/* loop layout (saved values) */
int32_t loop_sample ; /* saved from current_sample, should be loop_start_sample... */
int32_t loop_samples_into_block ; /* saved from samples_into_block */
off_t loop_block_offset ; /* saved from current_block_offset */
size_t loop_block_size ; /* saved from current_block_size */
off_t loop_next_block_offset ; /* saved from next_block_offset */
2008-05-10 21:59:29 +02:00
uint8_t xa_channel ; /* Selected XA Channel */
2008-05-11 20:11:55 +02:00
int32_t xa_sector_length ; /* XA block */
2008-07-14 22:42:49 +02:00
int8_t get_high_nibble ;
2008-05-19 05:58:15 +02:00
2008-06-02 19:58:08 +02:00
uint8_t ea_big_endian ; /* Big Endian ? */
uint8_t ea_compression_type ;
uint8_t ea_compression_version ;
uint8_t ea_platform ;
2008-07-04 02:06:51 +02:00
int32_t ws_output_size ; /* output bytes for this block */
2008-07-03 23:21:01 +02:00
2008-05-19 05:58:15 +02:00
void * start_vgmstream ; /* a copy of the VGMSTREAM as it was at the beginning of the stream */
2008-06-15 06:01:03 +02:00
/* Data the codec needs for the whole stream. This is for codecs too
* different from vgmstream ' s structure to be reasonably shoehorned into
* using the ch structures .
* Note also that support must be added for resetting , looping and
* closing for every codec that uses this , as it will not be handled . */
void * codec_data ;
2008-01-31 07:04:26 +01:00
} VGMSTREAM ;
2008-06-15 06:01:03 +02:00
# ifdef VGM_USE_VORBIS
typedef struct {
STREAMFILE * streamfile ;
ogg_int64_t offset ;
ogg_int64_t size ;
} ogg_vorbis_streamfile ;
typedef struct {
OggVorbis_File ogg_vorbis_file ;
int bitstream ;
ogg_vorbis_streamfile ov_streamfile ;
} ogg_vorbis_codec_data ;
# endif
2008-07-05 13:49:29 +02:00
# ifdef VGM_USE_MPEG
# define AHX_EXPECTED_FRAME_SIZE 0x414
2008-07-06 17:33:38 +02:00
/* MPEG_BUFFER_SIZE should be >= AHX_EXPECTED_FRAME_SIZE */
# define MPEG_BUFFER_SIZE 0x1000
2008-07-05 13:49:29 +02:00
typedef struct {
2008-07-06 17:33:38 +02:00
uint8_t buffer [ MPEG_BUFFER_SIZE ] ;
2008-07-05 13:49:29 +02:00
int buffer_used ;
int buffer_full ;
2008-07-06 17:33:38 +02:00
size_t bytes_in_buffer ;
2008-07-05 13:49:29 +02:00
mpg123_handle * m ;
2008-07-06 17:33:38 +02:00
} mpeg_codec_data ;
2008-07-05 13:49:29 +02:00
# endif
2008-06-15 06:01:03 +02:00
2008-07-20 07:41:41 +02:00
/* with one file this is also used for just
ACM */
typedef struct {
int file_count ;
int current_file ;
2008-07-20 09:28:17 +02:00
/* the index we return to upon loop completion */
int loop_start_file ;
/* one after the index of the last file, typically
* will be equal to file_count */
int loop_end_file ;
/* Upon exit from a loop, which file to play. */
/* -1 if there is no such file */
/*int end_file;*/
2008-07-20 07:41:41 +02:00
ACMStream * * files ;
} mus_acm_codec_data ;
2008-08-02 12:24:28 +02:00
# define AIX_BUFFER_SIZE 0x1000
/* AIXery */
typedef struct {
sample buffer [ AIX_BUFFER_SIZE ] ;
int segment_count ;
int stream_count ;
int current_segment ;
/* one per segment */
int32_t * sample_counts ;
/* organized like:
* segment1_stream1 , segment1_stream2 , segment2_stream1 , segment2_stream2 */
VGMSTREAM * * adxs ;
} aix_codec_data ;
2008-08-03 16:58:03 +02:00
/* for compressed NWA */
typedef struct {
NWAData * nwa ;
} nwa_codec_data ;
2008-01-31 07:04:26 +01:00
/* do format detection, return pointer to a usable VGMSTREAM, or NULL on failure */
VGMSTREAM * init_vgmstream ( const char * const filename ) ;
2008-05-20 17:18:38 +02:00
VGMSTREAM * init_vgmstream_from_STREAMFILE ( STREAMFILE * streamFile ) ;
2008-03-25 08:30:04 +01:00
2008-05-19 05:58:15 +02:00
/* reset a VGMSTREAM to start of stream */
void reset_vgmstream ( VGMSTREAM * vgmstream ) ;
2008-01-31 07:04:26 +01:00
/* allocate a VGMSTREAM and channel stuff */
VGMSTREAM * allocate_vgmstream ( int channel_count , int looped ) ;
/* deallocate, close, etc. */
void close_vgmstream ( VGMSTREAM * vgmstream ) ;
2008-02-05 07:21:57 +01:00
/* calculate the number of samples to be played based on looping parameters */
2008-05-16 22:28:36 +02:00
int32_t get_vgmstream_play_samples ( double looptimes , double fadeseconds , double fadedelayseconds , VGMSTREAM * vgmstream ) ;
2008-01-31 07:04:26 +01:00
/* render! */
void render_vgmstream ( sample * buffer , int32_t sample_count , VGMSTREAM * vgmstream ) ;
2008-02-05 07:21:57 +01:00
/* smallest self-contained group of samples is a frame */
2008-02-05 03:17:35 +01:00
int get_vgmstream_samples_per_frame ( VGMSTREAM * vgmstream ) ;
2008-02-05 07:21:57 +01:00
/* number of bytes per frame */
2008-02-05 03:17:35 +01:00
int get_vgmstream_frame_size ( VGMSTREAM * vgmstream ) ;
2008-02-05 10:21:20 +01:00
/* in NDS IMA the frame size is the block size, so the last one is short */
int get_vgmstream_samples_per_shortframe ( VGMSTREAM * vgmstream ) ;
int get_vgmstream_shortframe_size ( VGMSTREAM * vgmstream ) ;
2008-02-05 03:17:35 +01:00
2008-02-05 07:21:57 +01:00
/* Assume that we have written samples_written into the buffer already, and we have samples_to_do consecutive
* samples ahead of us . Decode those samples into the buffer . */
2008-02-05 03:17:35 +01:00
void decode_vgmstream ( VGMSTREAM * vgmstream , int samples_written , int samples_to_do , sample * buffer ) ;
2008-07-14 15:30:26 +02:00
/* Assume additionally that we have samples_to_do consecutive samples in "data",
* and this this is for channel number " channel " */
void decode_vgmstream_mem ( VGMSTREAM * vgmstream , int samples_written , int samples_to_do , sample * buffer , uint8_t * data , int channel ) ;
2008-02-05 07:21:57 +01:00
/* calculate number of consecutive samples to do (taking into account stopping for loop start and end) */
int vgmstream_samples_to_do ( int samples_this_block , int samples_per_frame , VGMSTREAM * vgmstream ) ;
/* Detect start and save values, also detect end and restore values. Only works on exact sample values.
* Returns 1 if loop was done . */
int vgmstream_do_loop ( VGMSTREAM * vgmstream ) ;
2008-03-25 08:30:04 +01:00
/* Write a description of the stream into array pointed by desc,
* which must be length bytes long . Will always be null - terminated if length > 0
*/
2008-03-11 02:27:59 +01:00
void describe_vgmstream ( VGMSTREAM * vgmstream , char * desc , int length ) ;
2008-02-05 07:44:44 +01:00
2008-03-25 08:30:04 +01:00
/* See if there is a second file which may be the second channel, given
* already opened mono opened_stream which was opened from filename .
* If a suitable file is found , open it and change opened_stream to a
* stereo stream . */
2008-05-20 17:18:38 +02:00
void try_dual_file_stereo ( VGMSTREAM * opened_stream , STREAMFILE * streamFile ) ;
2008-03-17 03:11:18 +01:00
2008-01-31 07:04:26 +01:00
# endif