mirror of
https://github.com/vgmstream/vgmstream.git
synced 2025-01-19 00:04:04 +01:00
Merge pull request #59 from bnnm/master
Formats: VAWX , VDS/VDM, CXS; description lists
This commit is contained in:
commit
c675340e01
4
BUILD.md
4
BUILD.md
@ -93,8 +93,8 @@ For new simple formats, assuming existing layout/coding:
|
||||
- *src/meta/(format-name).c*: create new format parser that reads all needed info from the stream header and inits VGMSTREAM
|
||||
- *src/meta/meta.h*: register parser's init
|
||||
- *src/vgmstream.h*: register new meta
|
||||
- *src/vgmstream.c*: add parser init to search list, add meta description
|
||||
- *src/formats.c*: add new extension to the format list
|
||||
- *src/vgmstream.c*: add parser init to search list
|
||||
- *src/formats.c*: add new extension to the format list, add meta description
|
||||
*fb2k/in_vgmstream.cpp*: add new extension to the file associations list
|
||||
- *src/Makefile*
|
||||
*src/meta/Makefile.unix.am*
|
||||
|
@ -42,7 +42,7 @@
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../ext_includes"
|
||||
PreprocessorDefinitions="WIN32;VGM_USE_FFMPEG;VGM_USE_FFMPEG_ACCURATE_LOOPING;VGM_USE_G719;VGM_USE_G7221;_DEBUG;_WINDOWS;_USRDLL;IN_VGMSTREAM_EXPORTS;"
|
||||
PreprocessorDefinitions="WIN32;VGM_USE_FFMPEG;VGM_USE_G719;VGM_USE_G7221;_DEBUG;_WINDOWS;_USRDLL;IN_VGMSTREAM_EXPORTS;"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
@ -120,7 +120,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories="../ext_includes"
|
||||
PreprocessorDefinitions="WIN32;VGM_USE_FFMPEG;VGM_USE_FFMPEG_ACCURATE_LOOPING;VGM_USE_G719;VGM_USE_G7221;NDEBUG;_WINDOWS;_USRDLL;IN_VGMSTREAM_EXPORTS"
|
||||
PreprocessorDefinitions="WIN32;VGM_USE_FFMPEG;VGM_USE_G719;VGM_USE_G7221;NDEBUG;_WINDOWS;_USRDLL;IN_VGMSTREAM_EXPORTS"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
|
@ -307,7 +307,9 @@ META_OBJS=meta/adx_header.o \
|
||||
meta/ps2_svag_snk.o \
|
||||
meta/ffmpeg.o \
|
||||
meta/mp4.o \
|
||||
meta/xma.o
|
||||
meta/xma.o \
|
||||
meta/ps2.o \
|
||||
meta/x360.o
|
||||
|
||||
EXT_LIBS = ../ext_libs/clHCA.o
|
||||
|
||||
|
@ -3,43 +3,41 @@
|
||||
|
||||
#include "../vgmstream.h"
|
||||
|
||||
/* adx_decoder */
|
||||
void decode_adx(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_adx_enc(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void adx_next_key(VGMSTREAMCHANNEL * stream);
|
||||
|
||||
/* g721_decoder */
|
||||
void decode_g721(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void g72x_init_state(struct g72x_state *state_ptr);
|
||||
|
||||
/* ima_decoder */
|
||||
void decode_nds_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_dat4_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_xbox_ima(VGMSTREAM * vgmstream,VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel);
|
||||
void decode_int_xbox_ima(VGMSTREAM * vgmstream,VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel);
|
||||
void decode_dvi_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_eacs_ima(VGMSTREAM * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int channel);
|
||||
|
||||
void decode_snds_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int channel);
|
||||
|
||||
void decode_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_ms_ima(VGMSTREAM * vgmstream,VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel);
|
||||
|
||||
void decode_rad_ima(VGMSTREAM * vgmstream,VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel);
|
||||
|
||||
void decode_rad_ima_mono(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_apple_ima4(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_ms_ima(VGMSTREAM * vgmstream,VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel);
|
||||
void decode_ngc_afc(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
/* ngc_dsp_decoder */
|
||||
void decode_ngc_dsp(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_ngc_dsp_mem(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, uint8_t * mem);
|
||||
|
||||
int32_t dsp_nibbles_to_samples(int32_t nibbles);
|
||||
|
||||
/* ngc_dtk_decoder */
|
||||
void decode_ngc_dtk(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int channel);
|
||||
|
||||
/* ngc_afc_decoder */
|
||||
void decode_ngc_afc(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
/* pcm_decoder */
|
||||
void decode_pcm16LE(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_pcm16LE_int(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_pcm16LE_XOR_int(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
@ -50,38 +48,70 @@ void decode_pcm8_sb_int(VGMSTREAMCHANNEL * stream, sample * outbuf, int channels
|
||||
void decode_pcm8_unsigned_int(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_pcm8_unsigned(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
/* psx_decoder */
|
||||
void decode_psx(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_invert_psx(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_psx_badflags(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_psx_bmdx(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_psx_configurable(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int frame_size);
|
||||
void decode_hevag(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_hevag_adpcm(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_vag_adpcm_configurable(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int frame_size);
|
||||
|
||||
/* xa_decoder */
|
||||
void decode_xa(VGMSTREAM * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int channel);
|
||||
void init_get_high_nibble(VGMSTREAM * vgmstream);
|
||||
|
||||
void decode_eaxa(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel);
|
||||
/*eaxa_decoder */
|
||||
void decode_ea_xa(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel);
|
||||
void decode_ea_adpcm(VGMSTREAM * vgmstream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int channel);
|
||||
void decode_maxis_adpcm(VGMSTREAM * vgmstream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int channel);
|
||||
|
||||
/* sdx2_decoder */
|
||||
void decode_sdx2(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_sdx2_int(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
/* sdx2_decoder */
|
||||
void decode_cbd2(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_cbd2_int(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
/* ws_decoder */
|
||||
void decode_ws(VGMSTREAM * vgmstream, int channel, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
/* acm_decoder */
|
||||
void decode_acm(ACMStream * acm, sample * outbuf, int32_t samples_to_do, int channelspacing);
|
||||
|
||||
/* nwa_decoder */
|
||||
void decode_nwa(NWAData *nwa, sample *outbuf, int32_t samples_to_do);
|
||||
|
||||
/* msadpcm_decoder */
|
||||
long msadpcm_bytes_to_samples(long bytes, int block_size, int channels);
|
||||
void decode_msadpcm_stereo(VGMSTREAM * vgmstream, sample * outbuf, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_msadpcm_mono(VGMSTREAM * vgmstream, sample * outbuf, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
/* aica_decoder */
|
||||
void decode_aica(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
/* nds_procyon_decoder */
|
||||
void decode_nds_procyon(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
/* l5_555_decoder */
|
||||
void decode_l5_555(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
/* SASSC_decoder */
|
||||
void decode_SASSC(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
/* lsf_decode */
|
||||
void decode_lsf(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
/* mtaf_decoder */
|
||||
void decode_mtaf(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int channel, int channels);
|
||||
|
||||
/* hca_decoder */
|
||||
void decode_hca(hca_codec_data * data, sample * outbuf, int32_t samples_to_do, int channels);
|
||||
|
||||
/* ogg_vorbis_decoder */
|
||||
#ifdef VGM_USE_VORBIS
|
||||
void decode_ogg_vorbis(ogg_vorbis_codec_data * data, sample * outbuf, int32_t samples_to_do, int channels);
|
||||
#endif
|
||||
|
||||
#if defined(VGM_USE_MP4V2) && defined(VGM_USE_FDKAAC)
|
||||
void decode_mp4_aac(mp4_aac_codec_data * data, sample * outbuf, int32_t samples_to_do, int channels);
|
||||
#endif
|
||||
|
||||
void decode_sdx2(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_sdx2_int(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_cbd2(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_cbd2_int(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_ws(VGMSTREAM * vgmstream, int channel, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
/* mpeg_decoder */
|
||||
#ifdef VGM_USE_MPEG
|
||||
mpeg_codec_data *init_mpeg_codec_data(STREAMFILE *streamfile, off_t start_offset, long given_sample_rate, int given_channels, coding_t *coding_type, int * actual_sample_rate, int * actual_channels);
|
||||
void decode_fake_mpeg2_l2(VGMSTREAMCHANNEL * stream, mpeg_codec_data * data, sample * outbuf, int32_t samples_to_do);
|
||||
@ -90,51 +120,31 @@ long mpeg_bytes_to_samples(long bytes, const struct mpg123_frameinfo *mi);
|
||||
void mpeg_set_error_logging(mpeg_codec_data * data, int enable);
|
||||
#endif
|
||||
|
||||
/* g7221_decoder */
|
||||
#ifdef VGM_USE_G7221
|
||||
void decode_g7221(VGMSTREAM *vgmstream,
|
||||
sample * outbuf, int channelspacing, int32_t samples_to_do, int channel);
|
||||
void decode_g7221(VGMSTREAM *vgmstream, sample * outbuf, int channelspacing, int32_t samples_to_do, int channel);
|
||||
#endif
|
||||
|
||||
/* g719_decoder */
|
||||
#ifdef VGM_USE_G719
|
||||
void decode_g719(VGMSTREAM *vgmstream,
|
||||
sample * outbuf, int channelspacing, int32_t samples_to_do, int channel);
|
||||
void decode_g719(VGMSTREAM *vgmstream, sample * outbuf, int channelspacing, int32_t samples_to_do, int channel);
|
||||
#endif
|
||||
|
||||
/* mp4_aac_decoder */
|
||||
#if defined(VGM_USE_MP4V2) && defined(VGM_USE_FDKAAC)
|
||||
void decode_mp4_aac(mp4_aac_codec_data * data, sample * outbuf, int32_t samples_to_do, int channels);
|
||||
#endif
|
||||
|
||||
/* at3_decoder */
|
||||
#ifdef VGM_USE_MAIATRAC3PLUS
|
||||
void decode_at3plus(VGMSTREAM *vgmstream,
|
||||
sample * outbuf, int channelspacing, int32_t samples_to_do, int channel);
|
||||
void decode_at3plus(VGMSTREAM *vgmstream, sample * outbuf, int channelspacing, int32_t samples_to_do, int channel);
|
||||
#endif
|
||||
|
||||
/* ffmpeg_decoder */
|
||||
#ifdef VGM_USE_FFMPEG
|
||||
void decode_ffmpeg(VGMSTREAM *stream, sample * outbuf, int32_t samples_to_do, int channels);
|
||||
|
||||
void reset_ffmpeg(VGMSTREAM *vgmstream);
|
||||
|
||||
void seek_ffmpeg(VGMSTREAM *vgmstream, int32_t num_sample);
|
||||
#endif
|
||||
|
||||
void decode_acm(ACMStream * acm, sample * outbuf,
|
||||
int32_t samples_to_do, int channelspacing);
|
||||
|
||||
void decode_nwa(NWAData *nwa, sample *outbuf, int32_t samples_to_do);
|
||||
|
||||
long msadpcm_bytes_to_samples(long bytes, int block_size, int channels);
|
||||
void decode_msadpcm_stereo(VGMSTREAM * vgmstream, sample * outbuf, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_msadpcm_mono(VGMSTREAM * vgmstream, sample * outbuf, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_aica(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_nds_procyon(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_l5_555(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_SASSC(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_lsf(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
|
||||
void decode_mtaf(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int channel, int channels);
|
||||
|
||||
void decode_hca(hca_codec_data * data, sample * outbuf, int32_t samples_to_do, int channels);
|
||||
|
||||
#endif
|
||||
#endif /*_CODING_H*/
|
||||
|
@ -14,7 +14,7 @@ int32_t EA_TABLE[20]= { 0x00000000, 0x000000F0, 0x000001CC, 0x00000188,
|
||||
0x00000007, 0x00000008, 0x0000000A, 0x0000000B,
|
||||
0x00000000, 0xFFFFFFFF, 0xFFFFFFFD, 0xFFFFFFFC};
|
||||
|
||||
void decode_eaxa(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel) {
|
||||
void decode_ea_xa(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel) {
|
||||
uint8_t frame_info;
|
||||
int32_t sample_count;
|
||||
int32_t coef1,coef2;
|
||||
|
@ -263,42 +263,13 @@ void seek_ffmpeg(VGMSTREAM *vgmstream, int32_t num_sample) {
|
||||
ffmpeg_codec_data *data = (ffmpeg_codec_data *) vgmstream->codec_data;
|
||||
int64_t ts;
|
||||
|
||||
#ifndef VGM_USE_FFMPEG_ACCURATE_LOOPING
|
||||
/* Seek to loop start by timestamp (closest frame) + adjust skipping some samples */
|
||||
/* FFmpeg seeks by ts by design (since not all containers can accurately skip to a frame). */
|
||||
/* TODO: this seems to be off by +-1 frames in some cases */
|
||||
ts = num_sample;
|
||||
if (ts >= data->sampleRate * 2) {
|
||||
data->samplesToDiscard = data->sampleRate * 2;
|
||||
ts -= data->samplesToDiscard;
|
||||
}
|
||||
else {
|
||||
data->samplesToDiscard = (int)ts;
|
||||
ts = 0;
|
||||
}
|
||||
|
||||
/* todo fix this properly */
|
||||
if (data->totalSamples) {
|
||||
ts = (int)ts * (data->formatCtx->duration) / data->totalSamples;
|
||||
} else {
|
||||
data->samplesToDiscard = num_sample;
|
||||
ts = 0;
|
||||
}
|
||||
|
||||
avformat_seek_file(data->formatCtx, data->streamIndex, ts - 1000, ts, ts, AVSEEK_FLAG_ANY);
|
||||
avcodec_flush_buffers(data->codecCtx);
|
||||
#endif /* ifndef VGM_USE_FFMPEG_ACCURATE_LOOPING */
|
||||
|
||||
#ifdef VGM_USE_FFMPEG_ACCURATE_LOOPING
|
||||
/* Start from 0 and discard samples until loop_start for accurate looping (slower but not too noticeable) */
|
||||
/* We could also seek by offset (AVSEEK_FLAG_BYTE) to the frame closest to the loop then discard
|
||||
* some samples, which is fast but would need calculations per format / when frame size is not constant */
|
||||
/* Start from 0 and discard samples until loop_start (slower but not too noticeable) */
|
||||
/* Due to various FFmpeg quirks seeking to a sample is erratic in many formats (would need extra steps) */
|
||||
data->samplesToDiscard = num_sample;
|
||||
ts = 0;
|
||||
|
||||
avformat_seek_file(data->formatCtx, data->streamIndex, ts, ts, ts, AVSEEK_FLAG_ANY);
|
||||
avcodec_flush_buffers(data->codecCtx);
|
||||
#endif /* ifdef VGM_USE_FFMPEG_ACCURATE_LOOPING */
|
||||
|
||||
data->readNextPacket = 1;
|
||||
data->bytesConsumedFromDecodedFrame = INT_MAX;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* streamtypes.h - widely used type definitions
|
||||
* g72x_state.h - internal state used by g721 decoder
|
||||
*/
|
||||
|
||||
|
||||
|
@ -20,11 +20,6 @@ void decode_ngc_dsp(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspaci
|
||||
for (i=first_sample,sample_count=0; i<first_sample+samples_to_do; i++,sample_count+=channelspacing) {
|
||||
int sample_byte = read_8bit(framesin*8+stream->offset+1+i/2,stream->streamfile);
|
||||
|
||||
#ifdef DEBUG
|
||||
if (hist1==stream->loop_history1 && hist2==stream->loop_history2) fprintf(stderr,"yo! %#x (start %#x) %d\n",stream->offset+framesin*8+i/2,stream->channel_start_offset,stream->samples_done);
|
||||
stream->samples_done++;
|
||||
#endif
|
||||
|
||||
outbuf[sample_count] = clamp16((
|
||||
(((i&1?
|
||||
get_low_nibble_signed(sample_byte):
|
||||
@ -61,11 +56,6 @@ void decode_ngc_dsp_mem(VGMSTREAMCHANNEL * stream, sample * outbuf, int channels
|
||||
for (i=first_sample,sample_count=0; i<first_sample+samples_to_do; i++,sample_count+=channelspacing) {
|
||||
int sample_byte = mem[framesin*8+1+i/2];
|
||||
|
||||
#ifdef DEBUG
|
||||
if (hist1==stream->loop_history1 && hist2==stream->loop_history2) fprintf(stderr,"yo! %#x (start %#x) %d\n",stream->offset+framesin*8+i/2,stream->channel_start_offset,stream->samples_done);
|
||||
stream->samples_done++;
|
||||
#endif
|
||||
|
||||
outbuf[sample_count] = clamp16((
|
||||
(((i&1?
|
||||
get_low_nibble_signed(sample_byte):
|
||||
|
@ -214,7 +214,7 @@ void decode_psx(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing,
|
||||
stream->adpcm_history2_32=hist2;
|
||||
}
|
||||
|
||||
void decode_invert_psx(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do) {
|
||||
void decode_psx_bmdx(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do) {
|
||||
|
||||
int predict_nr, shift_factor, sample;
|
||||
int32_t hist1=stream->adpcm_history1_32;
|
||||
@ -301,7 +301,7 @@ void decode_psx_badflags(VGMSTREAMCHANNEL * stream, sample * outbuf, int channel
|
||||
*
|
||||
* Original research and algorithm by id-daemon / daemon1.
|
||||
*/
|
||||
void decode_hevag_adpcm(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do) {
|
||||
void decode_hevag(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do) {
|
||||
|
||||
uint8_t predict_nr, shift, flag, byte;
|
||||
int32_t scale = 0;
|
||||
@ -367,7 +367,7 @@ void decode_hevag_adpcm(VGMSTREAMCHANNEL * stream, sample * outbuf, int channels
|
||||
* PS ADPCM of configurable size, with no flag.
|
||||
* Found in PS3 Afrika (SGDX type 5) in size 4, FF XI in sizes 3/5/9/41, Blur and James Bond in size 33.
|
||||
*/
|
||||
void decode_vag_adpcm_configurable(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int frame_size) {
|
||||
void decode_psx_configurable(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int frame_size) {
|
||||
uint8_t predict_nr, shift, byte;
|
||||
int16_t scale = 0;
|
||||
|
||||
|
535
src/formats.c
535
src/formats.c
@ -72,6 +72,7 @@ static const char* extension_list[] = {
|
||||
"ckd",
|
||||
"cnk",
|
||||
"cps",
|
||||
"cxs",
|
||||
|
||||
"dcs",
|
||||
"ddsp",
|
||||
@ -164,6 +165,7 @@ static const char* extension_list[] = {
|
||||
|
||||
"ndp",
|
||||
"ngca",
|
||||
"nps",
|
||||
"npsf",
|
||||
"nus3bank", //todo not existing?
|
||||
"nwa",
|
||||
@ -246,6 +248,7 @@ static const char* extension_list[] = {
|
||||
"stx",
|
||||
"svag",
|
||||
"svs",
|
||||
"swag",
|
||||
"swav",
|
||||
"swd",
|
||||
|
||||
@ -268,6 +271,9 @@ static const char* extension_list[] = {
|
||||
"vgv",
|
||||
"vig",
|
||||
|
||||
"vds",
|
||||
"vdm",
|
||||
"vms",
|
||||
"vms",
|
||||
"voi",
|
||||
"vpk",
|
||||
@ -306,6 +312,7 @@ static const char* extension_list[] = {
|
||||
"xwb",
|
||||
"xwm", //FFmpeg, not parsed (XWMA)
|
||||
"xwma", //FFmpeg, not parsed (XWMA)
|
||||
"xwv",
|
||||
|
||||
"ydsp",
|
||||
"ymf",
|
||||
@ -333,3 +340,531 @@ const char ** vgmstream_get_formats() {
|
||||
int vgmstream_get_formats_length() {
|
||||
return sizeof(extension_list) / sizeof(char*);
|
||||
}
|
||||
|
||||
|
||||
/* internal description info */
|
||||
|
||||
typedef struct {
|
||||
coding_t type;
|
||||
const char *description;
|
||||
} coding_info;
|
||||
|
||||
typedef struct {
|
||||
layout_t type;
|
||||
const char *description;
|
||||
} layout_info;
|
||||
|
||||
typedef struct {
|
||||
meta_t type;
|
||||
const char *description;
|
||||
} meta_info;
|
||||
|
||||
|
||||
static const coding_info coding_info_list[] = {
|
||||
{coding_PCM16BE, "Big Endian 16-bit PCM"},
|
||||
{coding_PCM16LE, "Little Endian 16-bit PCM"},
|
||||
{coding_PCM16LE_int, "Little Endian 16-bit PCM with 2 byte interleave"},
|
||||
{coding_PCM16LE_XOR_int, "Little Endian 16-bit PCM with 2 byte interleave and XOR obfuscation"},
|
||||
{coding_PCM8, "8-bit PCM"},
|
||||
{coding_PCM8_U, "8-bit unsigned PCM"},
|
||||
{coding_PCM8_U_int, "8-bit unsigned PCM with 1 byte interleave"},
|
||||
{coding_PCM8_int, "8-bit PCM with 1 byte interleave"},
|
||||
{coding_PCM8_SB_int, "8-bit PCM with sign bit, 1 byte interleave"},
|
||||
{coding_CRI_ADX, "CRI ADX 4-bit ADPCM"},
|
||||
{coding_CRI_ADX_enc_8, "CRI ADX 4-bit ADPCM (type 8 encryption)"},
|
||||
{coding_CRI_ADX_enc_9, "CRI ADX 4-bit ADPCM (type 8 encryption)"},
|
||||
{coding_NGC_DSP, "Nintendo DSP 4-bit ADPCM"},
|
||||
{coding_NGC_DTK, "Nintendo DTK 4-bit ADPCM"},
|
||||
{coding_NGC_AFC, "Nintendo AFC 4-bit ADPCM"},
|
||||
{coding_CRI_HCA, "CRI HCA"},
|
||||
{coding_NDS_IMA, "NDS-style 4-bit IMA ADPCM"},
|
||||
{coding_DAT4_IMA, "Eurocom DAT4 4-bit IMA ADPCM"},
|
||||
{coding_G721, "CCITT G.721 4-bit ADPCM"},
|
||||
{coding_PSX, "Playstation 4-bit ADPCM"},
|
||||
{coding_PSX_badflags, "Playstation 4-bit ADPCM (bad flags)"},
|
||||
{coding_PSX_bmdx, "Playstation 4-bit ADPCM (BMDX encryption)"},
|
||||
{coding_PSX_cfg, "Playstation 4-bit ADPCM (configurable)"},
|
||||
{coding_HEVAG, "Playstation Vita HEVAG 4-bit ADPCM"},
|
||||
{coding_XA, "CD-ROM XA 4-bit ADPCM"},
|
||||
{coding_XBOX, "XBOX 4-bit IMA ADPCM"},
|
||||
{coding_INT_XBOX, "XBOX 4-bit IMA ADPCM (interleaved)"},
|
||||
{coding_EA_XA, "Electronic Arts 4-bit ADPCM (XA based)"},
|
||||
{coding_EA_ADPCM, "Electronic Arts R1 4-bit ADPCM (XA based)"},
|
||||
{coding_SDX2, "Squareroot-delta-exact (SDX2) 8-bit DPCM"},
|
||||
{coding_SDX2_int, "Squareroot-delta-exact (SDX2) 8-bit DPCM with 1 byte interleave"},
|
||||
{coding_CBD2, "Cuberoot-delta-exact (CBD2) 8-bit DPCM"},
|
||||
{coding_CBD2_int, "Cuberoot-delta-exact (CBD2) 8-bit DPCM with 1 byte interleave"},
|
||||
{coding_DVI_IMA, "Intel DVI 4-bit IMA ADPCM"},
|
||||
{coding_INT_DVI_IMA, "Interleaved Intel DVI 4-bit IMA ADPCM"},
|
||||
{coding_EACS_IMA, "EACS 4-bit IMA ADPCM"},
|
||||
{coding_MAXIS_ADPCM, "Maxis XA (EA ADPCM Variant)"},
|
||||
{coding_INT_IMA, "Interleaved 4-bit IMA ADPCM"},
|
||||
{coding_IMA, "4-bit IMA ADPCM"},
|
||||
{coding_MS_IMA, "Microsoft 4-bit IMA ADPCM"},
|
||||
{coding_RAD_IMA, "'Radical' 4-bit IMA ADPCM"},
|
||||
{coding_RAD_IMA_mono, "'Radical' 4-bit IMA ADPCM (mono)"},
|
||||
{coding_APPLE_IMA4, "Apple Quicktime 4-bit IMA ADPCM"},
|
||||
{coding_SNDS_IMA, "Heavy Iron .snds 4-bit IMA ADPCM"},
|
||||
{coding_WS, "Westwood Studios ADPCM"},
|
||||
{coding_ACM, "InterPlay ACM"},
|
||||
{coding_NWA0, "NWA DPCM Level 0"},
|
||||
{coding_NWA1, "NWA DPCM Level 1"},
|
||||
{coding_NWA2, "NWA DPCM Level 2"},
|
||||
{coding_NWA3, "NWA DPCM Level 3"},
|
||||
{coding_NWA4, "NWA DPCM Level 4"},
|
||||
{coding_NWA5, "NWA DPCM Level 5"},
|
||||
{coding_MSADPCM, "Microsoft 4-bit ADPCM"},
|
||||
{coding_AICA, "Yamaha AICA 4-bit ADPCM"},
|
||||
{coding_NDS_PROCYON, "Procyon Studio Digital Sound Elements NDS 4-bit APDCM"},
|
||||
{coding_L5_555, "Level-5 0x555 4-bit ADPCM"},
|
||||
{coding_SASSC, "Activision / EXAKT SASSC 8-bit DPCM"},
|
||||
{coding_LSF, "lsf 4-bit ADPCM"},
|
||||
{coding_MTAF, "Konami MTAF 4-bit ADPCM"},
|
||||
#ifdef VGM_USE_VORBIS
|
||||
{coding_ogg_vorbis, "Vorbis"},
|
||||
#endif
|
||||
#ifdef VGM_USE_MPEG
|
||||
{coding_fake_MPEG2_L2, "MPEG-2 Layer II Audio"},
|
||||
{coding_MPEG1_L1, "MPEG-1 Layer I Audio"},
|
||||
{coding_MPEG1_L2, "MPEG-1 Layer II Audio"},
|
||||
{coding_MPEG1_L3, "MPEG-1 Layer III Audio (MP3)"},
|
||||
{coding_MPEG2_L1, "MPEG-2 Layer I Audio"},
|
||||
{coding_MPEG2_L2, "MPEG-2 Layer II Audio"},
|
||||
{coding_MPEG2_L3, "MPEG-2 Layer III Audio (MP3)"},
|
||||
{coding_MPEG25_L1, "MPEG-2.5 Layer I Audio"},
|
||||
{coding_MPEG25_L2, "MPEG-2.5 Layer II Audio"},
|
||||
{coding_MPEG25_L3, "MPEG-2.5 Layer III Audio (MP3)"},
|
||||
#endif
|
||||
#ifdef VGM_USE_G7221
|
||||
{coding_G7221, "ITU G.722.1 (Polycom Siren 7)"},
|
||||
{coding_G7221C, "ITU G.722.1 annex C (Polycom Siren 14)"},
|
||||
#endif
|
||||
#ifdef VGM_USE_G719
|
||||
{coding_G719, "ITU G.719 annex B (Polycom Siren 22)"},
|
||||
#endif
|
||||
#ifdef VGM_USE_MAIATRAC3PLUS
|
||||
{coding_AT3plus "ATRAC3plus"},
|
||||
#endif
|
||||
#ifdef VGM_USE_FFMPEG
|
||||
{coding_FFmpeg, "FFmpeg"},
|
||||
#endif
|
||||
};
|
||||
|
||||
static const layout_info layout_info_list[] = {
|
||||
{layout_none, "flat (no layout)"},
|
||||
{layout_interleave, "interleave"},
|
||||
{layout_interleave_shortblock, "interleave with short last block"},
|
||||
{layout_interleave_byte, "sub-frame interleave"},
|
||||
{layout_mxch_blocked, "MxCh blocked"},
|
||||
{layout_ast_blocked, "AST blocked"},
|
||||
{layout_halpst_blocked, "HALPST blocked"},
|
||||
{layout_xa_blocked, "CD-ROM XA"},
|
||||
{layout_ea_blocked, "Electronic Arts Audio Blocks"},
|
||||
{layout_eacs_blocked, "Electronic Arts (Old Version) Audio Blocks"},
|
||||
{layout_caf_blocked, "CAF blocked"},
|
||||
{layout_wsi_blocked, ".wsi blocked"},
|
||||
{layout_xvas_blocked, ".xvas blocked"},
|
||||
{layout_str_snds_blocked, ".str SNDS blocked"},
|
||||
{layout_ws_aud_blocked, "Westwood Studios .aud blocked"},
|
||||
{layout_matx_blocked, "Matrix .matx blocked"},
|
||||
{layout_de2_blocked, "de2 blocked"},
|
||||
{layout_vs_blocked, "vs blocked"},
|
||||
{layout_emff_ps2_blocked, "EMFF (PS2) blocked"},
|
||||
{layout_emff_ngc_blocked, "EMFF (NGC/WII) blocked"},
|
||||
{layout_gsb_blocked, "GSB blocked"},
|
||||
{layout_thp_blocked, "THP Movie Audio blocked"},
|
||||
{layout_filp_blocked, "FILp blocked"},
|
||||
{layout_psx_mgav_blocked, "MGAV blocked"},
|
||||
{layout_ps2_adm_blocked, "ADM blocked"},
|
||||
{layout_dsp_bdsp_blocked, "DSP blocked"},
|
||||
{layout_ivaud_blocked, "GTA IV blocked"},
|
||||
{layout_ps2_iab_blocked, "IAB blocked"},
|
||||
{layout_ps2_strlr_blocked, "The Bouncer STR blocked"},
|
||||
{layout_tra_blocked, "TRA blocked"},
|
||||
{layout_acm, "ACM blocked"},
|
||||
{layout_mus_acm, "multiple ACM files, ACM blocked"},
|
||||
{layout_aix, "AIX interleave, internally 18-byte interleaved"},
|
||||
{layout_aax, "AAX blocked, 18-byte interleaved"},
|
||||
{layout_scd_int, "SCD multistream interleave"},
|
||||
#ifdef VGM_USE_VORBIS
|
||||
{layout_ogg_vorbis, "Ogg"},
|
||||
#endif
|
||||
#ifdef VGM_USE_MPEG
|
||||
{layout_fake_mpeg, "MPEG Audio stream with incorrect frame headers"},
|
||||
{layout_mpeg, "MPEG Audio stream"},
|
||||
#endif
|
||||
};
|
||||
|
||||
static const meta_info meta_info_list[] = {
|
||||
{meta_RSTM, "Nintendo RSTM header"},
|
||||
{meta_STRM, "Nintendo STRM header"},
|
||||
{meta_ADX_03, "CRI ADX header type 03"},
|
||||
{meta_ADX_04, "CRI ADX header type 04"},
|
||||
{meta_ADX_05, "CRI ADX header type 05"},
|
||||
{meta_AIX, "CRI AIX header"},
|
||||
{meta_AAX, "CRI AAX header"},
|
||||
{meta_UTF_DSP, "CRI ADPCM_WII header"},
|
||||
{meta_DSP_AGSC, "Retro Studios AGSC header"},
|
||||
{meta_DSP_CSMP, "Retro Studios CSMP header"},
|
||||
{meta_NGC_ADPDTK, "assumed Nintendo ADP by .adp extension and valid first frame"},
|
||||
{meta_RSF, "assumed Retro Studios RSF by .rsf extension and valid first bytes"},
|
||||
{meta_AFC, "Nintendo AFC header"},
|
||||
{meta_AST, "Nintendo AST header"},
|
||||
{meta_HALPST, "HAL Laboratory HALPST header"},
|
||||
{meta_DSP_RS03, "Retro Studios RS03 header"},
|
||||
{meta_DSP_STD, "Standard Nintendo DSP header"},
|
||||
{meta_DSP_CSTR, "Namco Cstr header"},
|
||||
{meta_GCSW, "GCSW header"},
|
||||
{meta_PS2_SShd, "SShd header"},
|
||||
{meta_PS2_NPSF, "Namco Production Sound File (NPSF) header"},
|
||||
{meta_RWSD, "Nintendo RWSD header (single stream)"},
|
||||
{meta_RWAR, "Nintendo RWAR header (single RWAV stream)"},
|
||||
{meta_RWAV, "Nintendo RWAV header"},
|
||||
{meta_CWAV, "Nintendo CWAV header"},
|
||||
{meta_FWAV, "Nintendo FWAV header"},
|
||||
{meta_PSX_XA, "RIFF/CDXA header"},
|
||||
{meta_PS2_RXW, "RXWS header)"},
|
||||
{meta_PS2_RAW, "assumed RAW Interleaved PCM by .int extension"},
|
||||
{meta_PS2_OMU, "Alter Echo OMU Header"},
|
||||
{meta_DSP_STM, "Nintendo STM header"},
|
||||
{meta_PS2_EXST, "EXST header"},
|
||||
{meta_PS2_SVAG, "Konami SVAG header"},
|
||||
{meta_PS2_MIB, "assumed MIB Interleaved file by .mib extension"},
|
||||
{meta_PS2_MIB_MIH, "assumed MIB with MIH Info Header file by .mib+.mih extension"},
|
||||
{meta_DSP_MPDSP, "Single DSP header stereo by .mpdsp extension"},
|
||||
{meta_PS2_MIC, "assume KOEI MIC file by .mic extension"},
|
||||
{meta_DSP_JETTERS, "Double DSP header stereo by _lr.dsp extension"},
|
||||
{meta_DSP_MSS, "Double DSP header stereo by .mss extension"},
|
||||
{meta_DSP_GCM, "Double DSP header stereo by .gcm extension"},
|
||||
{meta_DSP_WII_IDSP, "Wii IDSP Double DSP header"},
|
||||
{meta_RSTM_SPM, "Nintendo RSTM header and .brstmspm extension"},
|
||||
{meta_RAW, "assumed RAW PCM file by .raw extension"},
|
||||
{meta_PS2_VAGi, "Sony VAG Interleaved header (VAGi)"},
|
||||
{meta_PS2_VAGp, "Sony VAG Mono header (VAGp)"},
|
||||
{meta_PS2_VAGs, "Sony VAG Stereo header (VAGp)"},
|
||||
{meta_PS2_VAGm, "Sony VAG Mono header (VAGm)"},
|
||||
{meta_PS2_pGAV, "Sony VAG Stereo Little Endian header (pGAV)"},
|
||||
{meta_PSX_GMS, "assumed Grandia GMS file by .gms extension"},
|
||||
{meta_PS2_STR, "assumed STR + STH File by .str & .sth extension"},
|
||||
{meta_PS2_ILD, "ILD header"},
|
||||
{meta_PS2_PNB, "assumed PNB (PsychoNauts Bgm File) by .pnb extension"},
|
||||
{meta_XBOX_WAVM, "assumed Xbox WAVM file by .wavm extension"},
|
||||
{meta_XBOX_RIFF, "Xbox RIFF/WAVE file with 0x0069 Codec ID"},
|
||||
{meta_DSP_STR, "assumed Conan Gamecube STR File by .str extension"},
|
||||
{meta_EAXA_R2, "Electronic Arts XA R2"},
|
||||
{meta_EAXA_R3, "Electronic Arts XA R3"},
|
||||
{meta_EA_ADPCM, "Electronic Arts XA R1"},
|
||||
{meta_EA_IMA, "Electronic Arts container with IMA blocks"},
|
||||
{meta_EAXA_PSX, "Electronic Arts With PSX ADPCM"},
|
||||
{meta_EA_PCM, "Electronic Arts With PCM"},
|
||||
{meta_CFN, "Namco CAF Header"},
|
||||
{meta_PS2_VPK, "VPK Header"},
|
||||
{meta_GENH, "GENH Generic Header"},
|
||||
{meta_DSP_SADB, "sadb header"},
|
||||
{meta_SADL, "sadl header"},
|
||||
{meta_PS2_BMDX, "Beatmania .bmdx header"},
|
||||
{meta_DSP_WSI, ".wsi header"},
|
||||
{meta_AIFC, "Audio Interchange File Format AIFF-C"},
|
||||
{meta_AIFF, "Audio Interchange File Format"},
|
||||
{meta_STR_SNDS, ".str SNDS SHDR chunk"},
|
||||
{meta_WS_AUD, "Westwood Studios .aud header"},
|
||||
{meta_WS_AUD_old, "Westwood Studios .aud (old) header"},
|
||||
{meta_PS2_IVB, "IVB/BVII header"},
|
||||
{meta_PS2_SVS, "Square SVS header"},
|
||||
{meta_RIFF_WAVE, "RIFF WAVE header"},
|
||||
{meta_RIFF_WAVE_POS, "RIFF WAVE header and .pos for looping"},
|
||||
{meta_NWA, "Visual Art's NWA header"},
|
||||
{meta_NWA_NWAINFOINI, "Visual Art's NWA header and NWAINFO.INI for looping"},
|
||||
{meta_NWA_GAMEEXEINI, "Visual Art's NWA header and Gameexe.ini for looping"},
|
||||
{meta_XSS, "Dino Crisis 3 XSS File"},
|
||||
{meta_HGC1, "Knights of the Temple 2 hgC1 Header"},
|
||||
{meta_AUS, "Capcom AUS Header"},
|
||||
{meta_RWS, "RWS Header"},
|
||||
{meta_EACS_PC, "EACS Header (PC)"},
|
||||
{meta_EACS_PSX, "EACS Header (PSX)"},
|
||||
{meta_EACS_SAT, "EACS Header (SATURN)"},
|
||||
{meta_SL3, "SL3 Header"},
|
||||
{meta_FSB1, "FMOD Sample Bank (FSB1) Header"},
|
||||
{meta_FSB2, "FMOD Sample Bank (FSB2) Header"},
|
||||
{meta_FSB3, "FMOD Sample Bank (FSB3) Header"},
|
||||
{meta_FSB4, "FMOD Sample Bank (FSB4) Header"},
|
||||
{meta_FSB5, "FMOD Sample Bank (FSB5) Header"},
|
||||
{meta_RWX, "RWX Header"},
|
||||
{meta_XWB, "XWB WBND Header"},
|
||||
{meta_XA30, "XA30 Header"},
|
||||
{meta_MUSC, "MUSC Header"},
|
||||
{meta_MUSX_V004, "MUSX / Version 004 Header"},
|
||||
{meta_MUSX_V005, "MUSX / Version 005 Header"},
|
||||
{meta_MUSX_V006, "MUSX / Version 006 Header"},
|
||||
{meta_MUSX_V010, "MUSX / Version 010 Header"},
|
||||
{meta_MUSX_V201, "MUSX / Version 201 Header"},
|
||||
{meta_LEG, "Legaia 2 - Duel Saga LEG Header"},
|
||||
{meta_FILP, "Bio Hazard - Gun Survivor FILp Header"},
|
||||
{meta_IKM, "Zwei!! IKM Header"},
|
||||
{meta_SFS, "Baroque SFS Header"},
|
||||
{meta_DVI, "DVI Header"},
|
||||
{meta_KCEY, "KCEYCOMP Header"},
|
||||
{meta_BG00, "Falcom BG00 Header"},
|
||||
{meta_PS2_RSTM, "Rockstar Games RSTM Header"},
|
||||
{meta_ACM, "InterPlay ACM Header"},
|
||||
{meta_MUS_ACM, "MUS playlist and multiple InterPlay ACM Headered files"},
|
||||
{meta_PS2_KCES, "Konami KCES Header"},
|
||||
{meta_PS2_DXH, "Tokobot Plus DXH Header"},
|
||||
{meta_PS2_PSH, "Dawn of Mana - Seiken Densetsu 4 PSH Header"},
|
||||
{meta_RIFF_WAVE_labl, "RIFF WAVE header with loop markers"},
|
||||
{meta_RIFF_WAVE_smpl, "RIFF WAVE header with sample looping info"},
|
||||
{meta_RIFX_WAVE, "RIFX WAVE header"},
|
||||
{meta_RIFX_WAVE_smpl, "RIFX WAVE header with sample looping info"},
|
||||
{meta_XNBm, "XNBm header"},
|
||||
{meta_PCM_SCD, "PCM file with custom header (SCD)"},
|
||||
{meta_PCM_PS2, "PCM file with custom header (PS2)"},
|
||||
{meta_PS2_RKV, "Legacy of Kain - Blood Omen 2 RKV Header"},
|
||||
{meta_PS2_PSW, "Rayman Raving Rabbids Riff Container File"},
|
||||
{meta_PS2_VAS, "Pro Baseball Spirits 5 VAS Header"},
|
||||
{meta_PS2_TEC, "assumed TECMO badflagged stream by .tec extension"},
|
||||
{meta_XBOX_WVS, "Metal Arms WVS Header (XBOX)"},
|
||||
{meta_NGC_WVS, "Metal Arms WVS Header (GameCube)"},
|
||||
{meta_XBOX_STMA, "Midnight Club 2 STMA Header"},
|
||||
{meta_XBOX_MATX, "assumed Matrix file by .matx extension"},
|
||||
{meta_DE2, "gurumin .de2 with embedded funky RIFF"},
|
||||
{meta_VS, "Men in Black VS Header"},
|
||||
{meta_DC_STR, "Sega Stream Asset Builder header"},
|
||||
{meta_DC_STR_V2, "variant of Sega Stream Asset Builder header"},
|
||||
{meta_XBOX_XMU, "XMU header"},
|
||||
{meta_XBOX_XVAS, "assumed TMNT file by .xvas extension"},
|
||||
{meta_PS2_XA2, "Acclaim XA2 Header"},
|
||||
{meta_DC_IDVI, "IDVI Header"},
|
||||
{meta_NGC_YMF, "YMF DSP Header"},
|
||||
{meta_PS2_CCC, "CCC Header"},
|
||||
{meta_PSX_FAG, "FAG Header"},
|
||||
{meta_PS2_MIHB, "Merged MIH+MIB"},
|
||||
{meta_DSP_WII_MUS, "mus header"},
|
||||
{meta_WII_SNG, "SNG DSP Header"},
|
||||
{meta_RSD2VAG, "RSD2/VAG Header"},
|
||||
{meta_RSD2PCMB, "RSD2/PCMB Header"},
|
||||
{meta_RSD2XADP, "RSD2/XADP Header"},
|
||||
{meta_RSD3VAG, "RSD3/VAG Header"},
|
||||
{meta_RSD3GADP, "RSD3/GADP Header"},
|
||||
{meta_RSD3PCM, "RSD3/PCM Header"},
|
||||
{meta_RSD3PCMB, "RSD3/PCMB Header"},
|
||||
{meta_RSD4PCMB, "RSD4/PCMB Header"},
|
||||
{meta_RSD4PCM, "RSD4/PCM Header"},
|
||||
{meta_RSD4RADP, "RSD4/RADP Header"},
|
||||
{meta_RSD4VAG, "RSD4/VAG Header"},
|
||||
{meta_RSD6XADP, "RSD6/XADP Header"},
|
||||
{meta_RSD6VAG, "RSD6/VAG Header"},
|
||||
{meta_RSD6WADP, "RSD6/WADP Header"},
|
||||
{meta_RSD6RADP, "RSD6/RADP Header"},
|
||||
{meta_DC_ASD, "ASD Header"},
|
||||
{meta_NAOMI_SPSD, "SPSD Header"},
|
||||
{meta_FFXI_BGW, "BGW BGMStream header"},
|
||||
{meta_FFXI_SPW, "SPW SeWave header"},
|
||||
{meta_PS2_ASS, "ASS Header"},
|
||||
{meta_IDSP, "IDSP Header"},
|
||||
{meta_WAA_WAC_WAD_WAM, "WAA/WAC/WAD/WAM RIFF Header"},
|
||||
{meta_PS2_SEG, "SEG (PS2) Header"},
|
||||
{meta_XBOX_SEG, "SEG (XBOX) Header"},
|
||||
{meta_NDS_STRM_FFTA2, "Final Fantasy Tactics A2 RIFF Header"},
|
||||
{meta_STR_ASR, "Donkey Kong Jet Race KNON/WII Header"},
|
||||
{meta_ZWDSP, "Zack and Wiki custom DSP Header"},
|
||||
{meta_GCA, "GCA DSP Header"},
|
||||
{meta_SPT_SPD, "SPT+SPD DSP Header"},
|
||||
{meta_ISH_ISD, "ISH+ISD DSP Header"},
|
||||
{meta_YDSP, "Yuke's DSP (YDSP) Header"},
|
||||
{meta_MSVP, "MSVP Header"},
|
||||
{meta_NGC_SSM, "SSM DSP Header"},
|
||||
{meta_PS2_JOE, "Disney/Pixar JOE Header"},
|
||||
{meta_VGS, "Guitar Hero Encore Rocks the 80's Header"},
|
||||
{meta_DC_DCSW_DCS, "Evil Twin DCS file with helper"},
|
||||
{meta_WII_SMP, "SMP DSP Header"},
|
||||
{meta_EMFF_PS2, "Eidos Music File Format Header"},
|
||||
{meta_EMFF_NGC, "Eidos Music File Format Header"},
|
||||
{meta_THP, "THP Movie File Format Header"},
|
||||
{meta_STS_WII, "Shikigami no Shiro (WII) Header"},
|
||||
{meta_PS2_P2BT, "Pop'n'Music 7 Header"},
|
||||
{meta_PS2_GBTS, "Pop'n'Music 9 Header"},
|
||||
{meta_NGC_DSP_IADP, "IADP Header"},
|
||||
{meta_RSTM_shrunken, "Nintendo RSTM header, corrupted by Atlus"},
|
||||
{meta_RIFF_WAVE_MWV, "RIFF WAVE header with .mwv flavoring"},
|
||||
{meta_RIFF_WAVE_SNS, "RIFF WAVE header with .sns flavoring"},
|
||||
{meta_FFCC_STR, "Final Fantasy: Crystal Chronicles STR header"},
|
||||
{meta_SAT_BAKA, "BAKA header from Crypt Killer"},
|
||||
{meta_NDS_SWAV, "SWAV Header"},
|
||||
{meta_PS2_VSF, "Musashi: Samurai Legend VSF Header"},
|
||||
{meta_NDS_RRDS, "Ridger Racer DS Header"},
|
||||
{meta_PS2_TK5, "Tekken 5 Stream Header"},
|
||||
{meta_PS2_SND, "Might and Magic SSND Header"},
|
||||
{meta_PS2_VSF_TTA, "VSF with SMSS Header"},
|
||||
{meta_ADS, "dhSS Header"},
|
||||
{meta_WII_STR, "HOTD Overkill - STR+STH WII Header"},
|
||||
{meta_PS2_MCG, "Gunvari MCG Header"},
|
||||
{meta_ZSD, "ZSD Header"},
|
||||
{meta_RedSpark, "RedSpark Header"},
|
||||
{meta_PC_IVAUD, "assumed GTA IV Audio file by .ivaud extension"},
|
||||
{meta_DSP_WII_WSD, "Standard Nintendo DSP headers in .wsd"},
|
||||
{meta_WII_NDP, "Vertigo NDP Header"},
|
||||
{meta_PS2_SPS, "Ape Escape 2 SPS Header"},
|
||||
{meta_PS2_XA2_RRP, "Acclaim XA2 Header"},
|
||||
{meta_NDS_HWAS, "NDS 'HWAS' Header"},
|
||||
{meta_NGC_LPS, "Rave Master LPS Header"},
|
||||
{meta_NAOMI_ADPCM, "NAOMI/NAOMI2 Arcade games ADPCM header"},
|
||||
{meta_SD9, "beatmania IIDX SD9 header"},
|
||||
{meta_2DX9, "beatmania IIDX 2DX9 header"},
|
||||
{meta_DSP_YGO, "Konami custom DSP Header"},
|
||||
{meta_PS2_VGV, "Rune: Viking Warlord VGV Header"},
|
||||
{meta_NGC_GCUB, "GCub Header"},
|
||||
{meta_NGC_SCK_DSP, "The Scorpion King SCK Header"},
|
||||
{meta_NGC_SWD, "PSF + Standard DSP Headers"},
|
||||
{meta_CAFF, "Apple Core Audio Format Header"},
|
||||
{meta_PC_MXST, "Lego Island MxSt Header"},
|
||||
{meta_PC_SOB_SAB, "Worms 4: Mayhem SOB/SAB Header"},
|
||||
{meta_MAXIS_XA, "Maxis XAI/XAJ Header"},
|
||||
{meta_EXAKT_SC, "assumed Activision / EXAKT SC by extension"},
|
||||
{meta_WII_BNS, "Nintendo BNS header"},
|
||||
{meta_WII_WAS, "WAS (iSWS) DSP header"},
|
||||
{meta_XBOX_HLWAV, "Half Life 2 bgm header"},
|
||||
{meta_STX, "Nintendo .stx header"},
|
||||
{meta_PS2_STM, "Red Dead Revolver .stm (.ps2stm)"},
|
||||
{meta_MYSPD, "U-Sing .myspd header"},
|
||||
{meta_HIS, "Her Interactive Sound header"},
|
||||
{meta_PS2_AST, "KOEI AST header"},
|
||||
{meta_CAPDSP, "Capcom custom DSP header"},
|
||||
{meta_DMSG, "RIFF/DMSGsegh header"},
|
||||
{meta_PONA_3DO, "Policenauts BGM header"},
|
||||
{meta_PONA_PSX, "Policenauts BGM header"},
|
||||
{meta_NGC_DSP_AAAP, "Double standard dsp header in 'AAAp'"},
|
||||
{meta_NGC_DSP_KONAMI, "Konami dsp header"},
|
||||
{meta_PS2_STER, "STER Header"},
|
||||
{meta_BNSF, "Namco Bandai BNSF header"},
|
||||
{meta_PS2_WB, "Shooting Love. ~TRIZEAL~ WB header"},
|
||||
{meta_S14, "assumed Polycom Siren 14 by .s14 extension"},
|
||||
{meta_SSS, "assumed Polycom Siren 14 by .sss extension"},
|
||||
{meta_PS2_GCM, "GCM 'MCG' Header"},
|
||||
{meta_PS2_SMPL, "Homura 'SMPL' Header"},
|
||||
{meta_PS2_MSA, "Psyvariar -Complete Edition- MSA header"},
|
||||
{meta_PC_SMP, "Ghostbusters .smp Header"},
|
||||
{meta_NGC_PDT, "PDT DSP header"},
|
||||
{meta_NGC_BO2, "Blood Omen 2 DSP header"},
|
||||
{meta_P3D, "Prototype P3D Header"},
|
||||
{meta_PS2_TK1, "Tekken TK5STRM1 Header"},
|
||||
{meta_PS2_ADSC, "ADSC Header"},
|
||||
{meta_NGC_DSP_MPDS, "MPDS DSP header"},
|
||||
{meta_DSP_STR_IG, "Infogrames dual dsp header"},
|
||||
{meta_PSX_MGAV, "Electronic Arts RVWS header"},
|
||||
{meta_PS2_B1S, "B1S header"},
|
||||
{meta_PS2_WAD, "WAD header"},
|
||||
{meta_DSP_XIII, "XIII dsp header"},
|
||||
{meta_NGC_DSP_STH_STR, "STH dsp header"},
|
||||
{meta_DSP_CABELAS, "Cabelas games dsp header"},
|
||||
{meta_PS2_LPCM, "LPCM header"},
|
||||
{meta_PS2_VMS, "VMS Header"},
|
||||
{meta_PS2_XAU, "XAU Header"},
|
||||
{meta_GH3_BAR, "Guitar Hero III Mobile .bar"},
|
||||
{meta_FFW, "Freedom Fighters BGM header"},
|
||||
{meta_DSP_DSPW, "DSPW dsp header"},
|
||||
{meta_PS2_JSTM, "JSTM Header"},
|
||||
{meta_PS3_XVAG, "XVAG Header"},
|
||||
{meta_PS3_CPS, "CPS Header"},
|
||||
{meta_SQEX_SCD, "Square-Enix SCD"},
|
||||
{meta_NGC_NST_DSP, "Animaniacs NST header"},
|
||||
{meta_BAF, ".baf WAVE header"},
|
||||
{meta_PS3_MSF, "PS3 MSF header"},
|
||||
{meta_NUB_VAG, "VAG (NUB) header"},
|
||||
{meta_PS3_PAST, "SNDP header"},
|
||||
{meta_PS3_SGDX, "SGXD header"},
|
||||
{meta_NGCA, "NGCA header"},
|
||||
{meta_WII_RAS, "RAS header"},
|
||||
{meta_PS2_SPM, "SPM header"},
|
||||
{meta_X360_TRA, "assumed DefJam Rapstar Audio File by .tra extension"},
|
||||
{meta_PS2_VGS, "Princess Soft VGS header"},
|
||||
{meta_PS2_IAB, "IAB header"},
|
||||
{meta_PS2_STRLR, "STR L/R header"},
|
||||
{meta_LSF_N1NJ4N, ".lsf !n1nj4n header"},
|
||||
{meta_VAWX, "feelplus VAWX header"},
|
||||
{meta_PC_SNDS, "assumed Heavy Iron IMA by .snds extension"},
|
||||
{meta_PS2_WMUS, "assumed The Warriors Sony ADPCM by .wmus extension"},
|
||||
{meta_HYPERSCAN_KVAG, "Mattel Hyperscan KVAG"},
|
||||
{meta_IOS_PSND, "PSND Header"},
|
||||
{meta_BOS_ADP, "ADP! header"},
|
||||
{meta_EB_SFX, "Excitebots .sfx header"},
|
||||
{meta_EB_SF0, "assumed Excitebots .sf0 by extension"},
|
||||
{meta_PS3_KLBS, "klBS Header"},
|
||||
{meta_PS2_MTAF, "Konami MTAF header"},
|
||||
{meta_PS2_VAG1, "Konami VAG Mono header (VAG1)"},
|
||||
{meta_PS2_VAG2, "Konami VAG Stereo header (VAG2)"},
|
||||
{meta_TUN, "TUN 'ALP' header"},
|
||||
{meta_WPD, "WPD 'DPW' header"},
|
||||
{meta_MN_STR, "Mini Ninjas 'STR' header"},
|
||||
{meta_PS2_MSS, "Guerilla MSCC header"},
|
||||
{meta_PS2_HSF, "Lowrider 'HSF' header"},
|
||||
{meta_PS3_IVAG, "PS3 'IVAG' Header"},
|
||||
{meta_PS2_2PFS, "PS2 '2PFS' Header"},
|
||||
{meta_RSD6OOGV, "RSD6/OOGV Header"},
|
||||
{meta_UBI_CKD, "CKD 'RIFF' Header"},
|
||||
{meta_PS2_VBK, "PS2 VBK Header"},
|
||||
{meta_OTM, "Otomedius OTM Header"},
|
||||
{meta_CSTM, "Nintendo 3DS CSTM Header"},
|
||||
{meta_FSTM, "Nintendo Wii U FSTM Header"},
|
||||
{meta_G1L, "Tecmo Koei G1L Header"},
|
||||
{meta_3DS_IDSP, "Nintendo 3DS IDSP Header"},
|
||||
{meta_WIIU_BTSND, "Wii U Menu Boot Sound"},
|
||||
{meta_MCA, "Capcom MCA Header"},
|
||||
{meta_XB3D_ADX, "Xenoblade 3D ADX Header"},
|
||||
{meta_HCA, "CRI MiddleWare HCA Header"},
|
||||
{meta_PS2_SVAG_SNK, "SNK SVAG header"},
|
||||
{meta_PS2_VDS_VDM, "Graffiti Kingdom VDS/VDM Header"},
|
||||
{meta_X360_CXS, "CXS Header"},
|
||||
#ifdef VGM_USE_VORBIS
|
||||
{meta_OGG_VORBIS, "Ogg Vorbis"},
|
||||
{meta_OGG_SLI, "Ogg Vorbis with .sli (start,length) for looping"},
|
||||
{meta_OGG_SLI2, "Ogg Vorbis with .sli (from,to) for looping"},
|
||||
{meta_OGG_SFL, "Ogg Vorbis with SFPL for looping"},
|
||||
{meta_OGG_UM3, "Ogg Vorbis, Ultramarine3 'encryption'"},
|
||||
{meta_OGG_KOVS, "Ogg Vorbis, KOVS header"},
|
||||
{meta_OGG_PSYCH, "Ogg Vorbis, Psychic Software obfuscation"},
|
||||
#endif
|
||||
#ifdef VGM_USE_MPEG
|
||||
{meta_AHX, "CRI AHX header"},
|
||||
#endif
|
||||
#ifdef VGM_USE_MP4V2
|
||||
{meta_MP4, "AAC header"},
|
||||
#endif
|
||||
#ifdef VGM_USE_FFMPEG
|
||||
{meta_FFmpeg, "FFmpeg supported file format"},
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
const char * get_vgmstream_coding_description(coding_t coding_type) {
|
||||
int i, list_length;
|
||||
|
||||
list_length = sizeof(coding_info_list) / sizeof(coding_info);
|
||||
for (i=0; i < list_length; i++) {
|
||||
if (coding_info_list[i].type == coding_type)
|
||||
return coding_info_list[i].description;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
const char * get_vgmstream_layout_description(layout_t layout_type) {
|
||||
int i, list_length;
|
||||
|
||||
list_length = sizeof(layout_info_list) / sizeof(layout_info);
|
||||
for (i=0; i < list_length; i++) {
|
||||
if (layout_info_list[i].type == layout_type)
|
||||
return layout_info_list[i].description;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
const char * get_vgmstream_meta_description(meta_t meta_type) {
|
||||
int i, list_length;
|
||||
|
||||
list_length = sizeof(meta_info_list) / sizeof(meta_info);
|
||||
for (i=0; i < list_length; i++) {
|
||||
if (meta_info_list[i].type == meta_type)
|
||||
return meta_info_list[i].description;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -4,6 +4,7 @@
|
||||
#ifndef _FORMATS_H_
|
||||
#define _FORMATS_H_
|
||||
|
||||
#include "vgmstream.h"
|
||||
|
||||
/* rough number of chars counting all extensions (actually <1500 and extra space) */
|
||||
#define VGM_EXTENSION_LIST_CHAR_SIZE 2000
|
||||
@ -11,5 +12,8 @@
|
||||
const char ** vgmstream_get_formats();
|
||||
int vgmstream_get_formats_length();
|
||||
|
||||
const char * get_vgmstream_coding_description(coding_t coding_type);
|
||||
const char * get_vgmstream_layout_description(layout_t layout_type);
|
||||
const char * get_vgmstream_meta_description(meta_t meta_type);
|
||||
|
||||
#endif /* _FORMATS_H_ */
|
||||
|
77
src/header.c
77
src/header.c
@ -42,18 +42,41 @@ int header_open_stream(VGMSTREAM * vgmstream, STREAMFILE *streamFile, off_t star
|
||||
STREAMFILE * file;
|
||||
char filename[PATH_LIMIT];
|
||||
int ch;
|
||||
int buffer_size = STREAMFILE_DEFAULT_BUFFER_SIZE;
|
||||
|
||||
#ifdef VGM_USE_FFMPEG
|
||||
if (vgmstream->coding_type == coding_FFmpeg) /* not needed */
|
||||
return 1;
|
||||
#endif
|
||||
|
||||
/* minor optimizations */
|
||||
if (vgmstream->layout_type == layout_interleave
|
||||
&&vgmstream->interleave_block_size > 0
|
||||
&& vgmstream->interleave_block_size > buffer_size) {
|
||||
buffer_size = vgmstream->interleave_block_size;
|
||||
}
|
||||
|
||||
if (buffer_size > 0x8000) {
|
||||
buffer_size = 0x8000;
|
||||
/* todo if interleave is big enough open one streamfile per channel so each uses it's own buffer */
|
||||
}
|
||||
|
||||
|
||||
streamFile->get_name(streamFile,filename,sizeof(filename));
|
||||
|
||||
/* open the file for reading by each channel */
|
||||
{
|
||||
file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE);
|
||||
file = streamFile->open(streamFile,filename,buffer_size);
|
||||
if (!file) return 0;
|
||||
|
||||
for (ch=0; ch < vgmstream->channels; ch++) {
|
||||
|
||||
vgmstream->ch[ch].streamfile = file;
|
||||
|
||||
if (vgmstream->layout_type == layout_none
|
||||
|| vgmstream->layout_type == layout_mpeg) { /* no appreciable difference for mpeg */
|
||||
#ifdef VGM_USE_MPEG
|
||||
|| vgmstream->layout_type == layout_mpeg //todo simplify using flag "start offset"
|
||||
#endif
|
||||
) { /* no appreciable difference for mpeg */
|
||||
/* for some codecs like IMA where channels work with the same bytes */
|
||||
vgmstream->ch[ch].channel_start_offset =
|
||||
vgmstream->ch[ch].offset = start_offset;
|
||||
@ -127,11 +150,11 @@ int header_make_riff_xma2(uint8_t * buf, size_t buf_size, size_t sample_count, s
|
||||
memcpy(buf+0x08, "WAVE", 4);
|
||||
|
||||
memcpy(buf+0x0c, "fmt ", 4);
|
||||
put_32bitLE(buf+0x10, 0x34);/*size*/
|
||||
put_32bitLE(buf+0x10, 0x34);/*fmt size*/
|
||||
put_16bitLE(buf+0x14, codec_XMA2);
|
||||
put_16bitLE(buf+0x16, channels);
|
||||
put_32bitLE(buf+0x18, sample_rate);
|
||||
put_32bitLE(buf+0x1c, sample_rate*channels*sizeof(sample)); /* average bytes per second (wrong) */
|
||||
put_32bitLE(buf+0x1c, sample_rate*channels / sizeof(sample)); /* average bytes per second (wrong) */
|
||||
put_16bitLE(buf+0x20, (int16_t)(channels*sizeof(sample))); /* block align */
|
||||
put_16bitLE(buf+0x22, sizeof(sample)*8); /* bits per sample */
|
||||
|
||||
@ -155,6 +178,50 @@ int header_make_riff_xma2(uint8_t * buf, size_t buf_size, size_t sample_count, s
|
||||
return riff_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies a ATRAC3 riff to buf
|
||||
*
|
||||
* returns number of bytes in buf or -1 when buf is not big enough
|
||||
*/
|
||||
int header_make_riff_atrac3(uint8_t * buf, size_t buf_size, size_t sample_count, size_t data_size, int channels, int sample_rate, int block_align, int joint_stereo, int encoder_delay) {
|
||||
uint16_t codec_ATRAC3 = 0x0270;
|
||||
size_t riff_size = 4+4+ 4 + 0x28 + 0x10 + 4+4;
|
||||
|
||||
if (buf_size < riff_size)
|
||||
return -1;
|
||||
|
||||
memcpy(buf+0x00, "RIFF", 4);
|
||||
put_32bitLE(buf+0x04, (int32_t)(riff_size-4-4 + data_size)); /* riff size */
|
||||
memcpy(buf+0x08, "WAVE", 4);
|
||||
|
||||
memcpy(buf+0x0c, "fmt ", 4);
|
||||
put_32bitLE(buf+0x10, 0x20);/*fmt size*/
|
||||
put_16bitLE(buf+0x14, codec_ATRAC3);
|
||||
put_16bitLE(buf+0x16, channels);
|
||||
put_32bitLE(buf+0x18, sample_rate);
|
||||
put_32bitLE(buf+0x1c, sample_rate*channels / sizeof(sample)); /* average bytes per second (wrong) */
|
||||
put_32bitLE(buf+0x20, (int16_t)(block_align)); /* block align */
|
||||
|
||||
put_16bitLE(buf+0x24, 0x0e); /* extra data size */
|
||||
put_16bitLE(buf+0x26, 1); /* unknown, always 1 */
|
||||
put_16bitLE(buf+0x28, channels==1 ? 0x0800 : 0x1000); /* unknown (some size? 0x1000=2ch, 0x0800=1ch) */
|
||||
put_16bitLE(buf+0x2a, 0); /* unknown, always 0 */
|
||||
put_16bitLE(buf+0x2c, joint_stereo ? 0x0001 : 0x0000);
|
||||
put_16bitLE(buf+0x2e, joint_stereo ? 0x0001 : 0x0000); /* repeated? */
|
||||
put_16bitLE(buf+0x30, 1); /* unknown, always 1 (frame_factor?) */
|
||||
put_16bitLE(buf+0x32, 0); /* unknown, always 0 */
|
||||
|
||||
memcpy(buf+0x34, "fact", 4);
|
||||
put_32bitLE(buf+0x38, 0x8); /* fact size */
|
||||
put_32bitLE(buf+0x3c, sample_count);
|
||||
put_32bitLE(buf+0x40, encoder_delay);
|
||||
|
||||
memcpy(buf+0x44, "data", 4);
|
||||
put_32bitLE(buf+0x48, data_size); /* data size */
|
||||
|
||||
return riff_size;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* reads DSP coefs built in the streamfile
|
||||
|
@ -16,6 +16,8 @@ int header_open_stream(VGMSTREAM * vgmstream, STREAMFILE *streamFile, off_t star
|
||||
|
||||
int header_make_riff_xma2(uint8_t * buf, size_t buf_size, size_t sample_count, size_t data_size, int channels, int sample_rate, int block_count, int block_size);;
|
||||
|
||||
int header_make_riff_atrac3(uint8_t * buf, size_t buf_size, size_t sample_count, size_t data_size, int channels, int sample_rate, int block_align, int joint_stereo, int encoder_delay);
|
||||
|
||||
void header_dsp_read_coefs_be(VGMSTREAM * vgmstream, STREAMFILE *streamFile, off_t offset, off_t spacing);
|
||||
|
||||
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "../streamtypes.h"
|
||||
#include "../vgmstream.h"
|
||||
|
||||
/* blocked layouts */
|
||||
void ast_block_update(off_t block_ofset, VGMSTREAM * vgmstream);
|
||||
|
||||
void mxch_block_update(off_t block_ofset, VGMSTREAM * vgmstream);
|
||||
@ -46,6 +47,19 @@ void filp_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
void ivaud_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
void psx_mgav_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
void ps2_adm_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
void dsp_bdsp_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
void tra_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
void ps2_iab_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
void ps2_strlr_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
/* other layouts */
|
||||
void render_vgmstream_interleave(sample * buffer, int32_t sample_count, VGMSTREAM * vgmstream);
|
||||
|
||||
void render_vgmstream_nolayout(sample * buffer, int32_t sample_count, VGMSTREAM * vgmstream);
|
||||
@ -60,16 +74,4 @@ void render_vgmstream_aax(sample * buffer, int32_t sample_count, VGMSTREAM * vgm
|
||||
|
||||
void render_vgmstream_scd_int(sample * buffer, int32_t sample_count, VGMSTREAM * vgmstream);
|
||||
|
||||
void psx_mgav_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
void ps2_adm_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
void dsp_bdsp_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
void tra_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
void ps2_iab_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
void ps2_strlr_block_update(off_t block_offset, VGMSTREAM * vgmstream);
|
||||
|
||||
#endif
|
||||
|
@ -41,7 +41,7 @@
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../ext_includes"
|
||||
PreprocessorDefinitions="WIN32;VGM_USE_FFMPEG;VGM_USE_FFMPEG_ACCURATE_LOOPING;VGM_USE_G7221;VGM_USE_G719;USE_ALLOCA;_DEBUG;_LIB;"
|
||||
PreprocessorDefinitions="WIN32;VGM_USE_FFMPEG;VGM_USE_G7221;VGM_USE_G719;USE_ALLOCA;_DEBUG;_LIB;"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
@ -103,7 +103,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories="../ext_includes"
|
||||
PreprocessorDefinitions="WIN32;VGM_USE_FFMPEG;VGM_USE_FFMPEG_ACCURATE_LOOPING;VGM_USE_G7221;VGM_USE_G719;USE_ALLOCA;NDEBUG;_LIB;"
|
||||
PreprocessorDefinitions="WIN32;VGM_USE_FFMPEG;VGM_USE_G7221;VGM_USE_G719;USE_ALLOCA;NDEBUG;_LIB;"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
@ -646,6 +646,10 @@
|
||||
RelativePath=".\meta\pos.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\meta\ps2.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\meta\ps2_2pfs.c"
|
||||
>
|
||||
@ -1150,6 +1154,10 @@
|
||||
RelativePath=".\meta\wvs.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\meta\x360.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\meta\x360_tra.c"
|
||||
>
|
||||
|
@ -57,7 +57,7 @@
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>../ext_includes;../../qaac/mp4v2/include;../../fdk-aac/libSYS/include;../../fdk-aac/libAACdec/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;VGM_USE_FFMPEG;VGM_USE_FFMPEG_ACCURATE_LOOPING;VGM_USE_G7221;VGM_USE_G719;VGM_USE_MP4V2;VGM_USE_FDKAAC;VGM_USE_MAIATRAC3PLUS;USE_ALLOCA;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;VGM_USE_FFMPEG;VGM_USE_G7221;VGM_USE_G719;VGM_USE_MP4V2;VGM_USE_FDKAAC;VGM_USE_MAIATRAC3PLUS;USE_ALLOCA;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
@ -71,7 +71,7 @@
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>../ext_includes;../../qaac/mp4v2/include;../../fdk-aac/libSYS/include;../../fdk-aac/libAACdec/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_WIN32_WINNT=0x501;WIN32;VGM_USE_FFMPEG;VGM_USE_FFMPEG_ACCURATE_LOOPING;VGM_USE_G7221;VGM_USE_G719;VGM_USE_MP4V2;VGM_USE_FDKAAC;VGM_USE_MAIATRAC3PLUS;USE_ALLOCA;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>_WIN32_WINNT=0x501;WIN32;VGM_USE_FFMPEG;VGM_USE_G7221;VGM_USE_G719;VGM_USE_MP4V2;VGM_USE_FDKAAC;VGM_USE_MAIATRAC3PLUS;USE_ALLOCA;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
@ -139,6 +139,7 @@
|
||||
<ClCompile Include="meta\tun.c" />
|
||||
<ClCompile Include="meta\wii_ras.c" />
|
||||
<ClCompile Include="meta\wpd.c" />
|
||||
<ClCompile Include="meta\x360.c" />
|
||||
<ClCompile Include="meta\x360_tra.c" />
|
||||
<ClCompile Include="formats.c" />
|
||||
<ClCompile Include="header.c" />
|
||||
@ -240,6 +241,7 @@
|
||||
<ClCompile Include="meta\pcm.c" />
|
||||
<ClCompile Include="meta\pona.c" />
|
||||
<ClCompile Include="meta\pos.c" />
|
||||
<ClCompile Include="meta\ps2.c" />
|
||||
<ClCompile Include="meta\ps2_adm.c" />
|
||||
<ClCompile Include="meta\ps2_ads.c" />
|
||||
<ClCompile Include="meta\ps2_adsc.c" />
|
||||
|
@ -373,6 +373,9 @@
|
||||
<ClCompile Include="meta\pos.c">
|
||||
<Filter>meta\Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="meta\ps2.c">
|
||||
<Filter>meta\Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="meta\ps2_adm.c">
|
||||
<Filter>meta\Source Files</Filter>
|
||||
</ClCompile>
|
||||
@ -1027,5 +1030,8 @@
|
||||
<ClCompile Include="meta\xma.c">
|
||||
<Filter>meta\Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="meta\x360.c">
|
||||
<Filter>meta\Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -273,12 +273,6 @@ VGMSTREAM * init_vgmstream_Cstr(STREAMFILE *streamFile) {
|
||||
for (i=0;i<16;i++)
|
||||
vgmstream->ch[1].adpcm_coef[i]=read_16bitBE(0x9c+i*2,streamFile);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
vgmstream->ch[0].loop_history1 = read_16bitBE(0x66,streamFile);
|
||||
vgmstream->ch[0].loop_history2 = read_16bitBE(0x68,streamFile);
|
||||
vgmstream->ch[1].loop_history1 = read_16bitBE(0xc6,streamFile);
|
||||
vgmstream->ch[1].loop_history2 = read_16bitBE(0xc8,streamFile);
|
||||
#endif
|
||||
|
||||
/* open the file for reading by each channel */
|
||||
{
|
||||
|
@ -248,5 +248,7 @@ libmeta_la_SOURCES += hca.c
|
||||
libmeta_la_SOURCES += ps2_svag_snk.c
|
||||
libmeta_la_SOURCES += mp4.c
|
||||
libmeta_la_SOURCES += xma.c
|
||||
libmeta_la_SOURCES += ps2.c
|
||||
libmeta_la_SOURCES += x360.c
|
||||
|
||||
EXTRA_DIST = meta.h
|
||||
|
@ -51,7 +51,7 @@ VGMSTREAM * init_vgmstream_baf(STREAMFILE *streamFile) {
|
||||
vgmstream->sample_rate = sample_rate;
|
||||
vgmstream->num_samples = sample_count;
|
||||
|
||||
vgmstream->coding_type = coding_VAG_ADPCM_cfg;
|
||||
vgmstream->coding_type = coding_PSX_cfg;
|
||||
vgmstream->layout_type = layout_interleave;
|
||||
vgmstream->interleave_block_size = frame_size;
|
||||
vgmstream->meta_type = meta_BAF;
|
||||
|
@ -55,7 +55,7 @@ VGMSTREAM * init_vgmstream_bgw(STREAMFILE *streamFile) {
|
||||
|
||||
switch (codec) {
|
||||
case 0: /* PS ADPCM */
|
||||
vgmstream->coding_type = coding_VAG_ADPCM_cfg;
|
||||
vgmstream->coding_type = coding_PSX_cfg;
|
||||
vgmstream->layout_type = layout_interleave;
|
||||
vgmstream->interleave_block_size = (block_align / 2) + 1; /* half, even if channels = 1 */
|
||||
|
||||
@ -138,7 +138,7 @@ VGMSTREAM * init_vgmstream_spw(STREAMFILE *streamFile) {
|
||||
|
||||
switch (codec) {
|
||||
case 0: /* PS ADPCM */
|
||||
vgmstream->coding_type = coding_VAG_ADPCM_cfg;
|
||||
vgmstream->coding_type = coding_PSX_cfg;
|
||||
vgmstream->layout_type = layout_interleave;
|
||||
vgmstream->interleave_block_size = (block_align / 2) + 1; /* half, even if channels = 1 */
|
||||
|
||||
|
@ -225,7 +225,7 @@ VGMSTREAM * init_vgmstream_ea(STREAMFILE *streamFile) {
|
||||
vgmstream->meta_type=meta_EAXA_R2;
|
||||
}
|
||||
|
||||
vgmstream->coding_type=coding_EAXA;
|
||||
vgmstream->coding_type=coding_EA_XA;
|
||||
vgmstream->layout_type=layout_ea_blocked;
|
||||
if((vgmstream->ea_platform==EA_GC) || (vgmstream->ea_platform==EA_X360))
|
||||
vgmstream->ea_big_endian=1;
|
||||
|
@ -215,7 +215,7 @@ VGMSTREAM * init_vgmstream_genh(STREAMFILE *streamFile) {
|
||||
vgmstream->layout_type = layout_none;
|
||||
break;
|
||||
case coding_NGC_DTK:
|
||||
vgmstream->layout_type = layout_dtk_interleave;
|
||||
vgmstream->layout_type = layout_none;
|
||||
break;
|
||||
case coding_NGC_DSP:
|
||||
if (dsp_interleave_type == 0) {
|
||||
|
@ -603,7 +603,7 @@ VGMSTREAM * init_vgmstream_ps2_strlr(STREAMFILE* streamFile);
|
||||
|
||||
VGMSTREAM * init_vgmstream_lsf_n1nj4n(STREAMFILE* streamFile);
|
||||
|
||||
VGMSTREAM * init_vgmstream_ps3_vawx(STREAMFILE* streamFile);
|
||||
VGMSTREAM * init_vgmstream_vawx(STREAMFILE* streamFile);
|
||||
|
||||
VGMSTREAM * init_vgmstream_pc_snds(STREAMFILE* streamFile);
|
||||
|
||||
@ -663,4 +663,8 @@ VGMSTREAM * init_vgmstream_ps2_svag_snk(STREAMFILE* streamFile);
|
||||
VGMSTREAM * init_vgmstream_xma(STREAMFILE* streamFile);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
VGMSTREAM * init_vgmstream_ps2_vds_vdm(STREAMFILE* streamFile);
|
||||
|
||||
VGMSTREAM * init_vgmstream_x360_cxs(STREAMFILE* streamFile);
|
||||
|
||||
#endif /*_META_H*/
|
||||
|
@ -29,7 +29,7 @@ VGMSTREAM * init_vgmstream_ngc_adpdtk(STREAMFILE *streamFile) {
|
||||
vgmstream->num_samples = file_size/32*28;
|
||||
vgmstream->sample_rate = 48000;
|
||||
vgmstream->coding_type = coding_NGC_DTK;
|
||||
vgmstream->layout_type = layout_dtk_interleave;
|
||||
vgmstream->layout_type = layout_none;
|
||||
vgmstream->meta_type = meta_NGC_ADPDTK;
|
||||
|
||||
/* locality is such that two streamfiles is silly */
|
||||
|
@ -233,13 +233,13 @@ VGMSTREAM * init_vgmstream_ogg_vorbis(STREAMFILE *streamFile) {
|
||||
callbacks.tell_func = tell_func;
|
||||
|
||||
if (um3_ogg) {
|
||||
inf.meta_type = meta_um3_ogg;
|
||||
inf.meta_type = meta_OGG_UM3;
|
||||
} else if (kovs_ogg) {
|
||||
inf.meta_type = meta_KOVS_ogg;
|
||||
inf.meta_type = meta_OGG_KOVS;
|
||||
} else if (psych_ogg) {
|
||||
inf.meta_type = meta_psych_ogg;
|
||||
inf.meta_type = meta_OGG_PSYCH;
|
||||
} else {
|
||||
inf.meta_type = meta_ogg_vorbis;
|
||||
inf.meta_type = meta_OGG_VORBIS;
|
||||
}
|
||||
|
||||
inf.layout_type = layout_ogg_vorbis;
|
||||
|
50
src/meta/ps2.c
Normal file
50
src/meta/ps2.c
Normal file
@ -0,0 +1,50 @@
|
||||
#include "meta.h"
|
||||
#include "../util.h"
|
||||
#include "../header.h"
|
||||
|
||||
/* VDS/VDM - from Grafitti Kingdom / Rakugaki Oukoku 2 */
|
||||
VGMSTREAM * init_vgmstream_ps2_vds_vdm(STREAMFILE *streamFile) {
|
||||
VGMSTREAM * vgmstream = NULL;
|
||||
off_t start_offset;
|
||||
int loop_flag, channel_count;
|
||||
|
||||
/* check extension, case insensitive */
|
||||
if ( !header_check_extensions(streamFile,"vds,vdm"))
|
||||
goto fail;
|
||||
|
||||
if (read_32bitBE(0x00,streamFile) != 0x56445320 && /* "VDS " (music)*/
|
||||
read_32bitBE(0x00,streamFile) != 0x56444D20) /* "VDM " (voices) */
|
||||
goto fail;
|
||||
|
||||
loop_flag = read_8bit(0x20,streamFile);
|
||||
channel_count = read_32bitLE(0x10,streamFile);
|
||||
|
||||
/* build the VGMSTREAM */
|
||||
vgmstream = allocate_vgmstream(channel_count,loop_flag);
|
||||
if (!vgmstream) goto fail;
|
||||
vgmstream->coding_type = coding_PSX;
|
||||
vgmstream->layout_type = channel_count > 1 ? layout_interleave : layout_none;
|
||||
vgmstream->meta_type = meta_PS2_VDS_VDM;
|
||||
|
||||
start_offset = 0x800;
|
||||
vgmstream->num_samples = read_32bitLE(0x04,streamFile) * 28 / 16 / channel_count;
|
||||
/* 0x08: unknown, always 10 */
|
||||
vgmstream->sample_rate = read_32bitLE(0x0c,streamFile);
|
||||
vgmstream->channels = channel_count; /*0x10*/
|
||||
vgmstream->interleave_block_size = read_32bitLE(0x14,streamFile);
|
||||
vgmstream->loop_start_sample = (read_32bitLE(0x18,streamFile) - start_offset) * 28 / 16 / channel_count;
|
||||
vgmstream->loop_end_sample = (read_32bitLE(0x1c,streamFile) - start_offset) * 28 / 16 / channel_count;
|
||||
vgmstream->loop_flag = loop_flag; /*0x20*/
|
||||
/*0x21: volume? */
|
||||
/*0x22: pan? */
|
||||
/*0x23: 02=VDS 04=VDM? */
|
||||
|
||||
/* open the file for reading */
|
||||
if ( !header_open_stream(vgmstream, streamFile, start_offset) )
|
||||
goto fail;
|
||||
return vgmstream;
|
||||
|
||||
fail:
|
||||
close_vgmstream(vgmstream);
|
||||
return NULL;
|
||||
}
|
@ -33,7 +33,7 @@ VGMSTREAM * init_vgmstream_ps2_bmdx(STREAMFILE *streamFile) {
|
||||
|
||||
/* Check for Compression Scheme */
|
||||
if (read_32bitLE(0x20,streamFile) == 1)
|
||||
vgmstream->coding_type = coding_invert_PSX;
|
||||
vgmstream->coding_type = coding_PSX_bmdx;
|
||||
else
|
||||
vgmstream->coding_type = coding_PSX;
|
||||
vgmstream->num_samples = read_32bitLE(0x0c,streamFile)*28/16/channel_count;
|
||||
@ -55,7 +55,7 @@ VGMSTREAM * init_vgmstream_ps2_bmdx(STREAMFILE *streamFile) {
|
||||
|
||||
start_offset = read_32bitLE(0x08,streamFile);
|
||||
|
||||
if (vgmstream->coding_type == coding_invert_PSX)
|
||||
if (vgmstream->coding_type == coding_PSX_bmdx)
|
||||
{
|
||||
uint8_t xor = read_8bit(start_offset,streamFile);
|
||||
uint8_t add = (~(uint8_t)read_8bit(start_offset+2,streamFile))+1;
|
||||
|
@ -1,8 +1,9 @@
|
||||
#include "meta.h"
|
||||
#include "../util.h"
|
||||
|
||||
/* Sony .ADS with SShd & SSbd Headers */
|
||||
|
||||
/* NPFS - found in Namco PS2/PSP games:
|
||||
* Tekken 5, Ace Combat 5, Yumeria, Venus & Braves (.nps), Ridge Racer PSP, etc
|
||||
*/
|
||||
VGMSTREAM * init_vgmstream_ps2_npsf(STREAMFILE *streamFile) {
|
||||
VGMSTREAM * vgmstream = NULL;
|
||||
char filename[PATH_LIMIT];
|
||||
@ -14,7 +15,9 @@ VGMSTREAM * init_vgmstream_ps2_npsf(STREAMFILE *streamFile) {
|
||||
|
||||
/* check extension, case insensitive */
|
||||
streamFile->get_name(streamFile,filename,sizeof(filename));
|
||||
if (strcasecmp("npsf",filename_extension(filename))) goto fail;
|
||||
if (strcasecmp("npsf",filename_extension(filename)) &&
|
||||
strcasecmp("nps",filename_extension(filename)))
|
||||
goto fail;
|
||||
|
||||
/* check NPSF Header */
|
||||
if (read_32bitBE(0x00,streamFile) != 0x4E505346)
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "meta.h"
|
||||
#include "../util.h"
|
||||
#include "../header.h"
|
||||
|
||||
|
||||
static int vag_find_loop_offsets(STREAMFILE *streamFile, off_t start_offset, off_t * loop_start, off_t * loop_end);
|
||||
@ -9,26 +10,23 @@ static int vag_find_loop_offsets(STREAMFILE *streamFile, off_t start_offset, off
|
||||
*/
|
||||
VGMSTREAM * init_vgmstream_ps2_vag(STREAMFILE *streamFile) {
|
||||
VGMSTREAM * vgmstream = NULL;
|
||||
char filename[PATH_LIMIT];
|
||||
|
||||
off_t loopStart = 0;
|
||||
off_t loopEnd = 0;
|
||||
off_t start_offset, loopStart = 0, loopEnd = 0;
|
||||
|
||||
uint8_t vagID;
|
||||
uint32_t version = 0;
|
||||
|
||||
size_t filesize = 0, datasize = 0;
|
||||
size_t interleave;
|
||||
off_t start_offset;
|
||||
|
||||
int loop_flag=0;
|
||||
int loop_samples_found = 0;
|
||||
int channel_count=0;
|
||||
int i;
|
||||
size_t filesize = 0, datasize = 0, interleave;
|
||||
|
||||
int loop_flag = 0, loop_samples_found = 0;
|
||||
int channel_count = 0;
|
||||
int is_swag = 0;
|
||||
|
||||
/* check extension, case insensitive */
|
||||
streamFile->get_name(streamFile,filename,sizeof(filename));
|
||||
if (strcasecmp("vag",filename_extension(filename))) goto fail;
|
||||
if ( !header_check_extensions(streamFile,"vag,swag") )
|
||||
goto fail;
|
||||
|
||||
/* Frantix VAGp .swag: some (not all) fields in LE + 2 VAGp in the same file (full interleave) */
|
||||
is_swag = header_check_extensions(streamFile,"swag");
|
||||
|
||||
/* check VAG Header */
|
||||
if (((read_32bitBE(0x00,streamFile) & 0xFFFFFF00) != 0x56414700) && /* "VAG\0" */
|
||||
@ -41,7 +39,10 @@ VGMSTREAM * init_vgmstream_ps2_vag(STREAMFILE *streamFile) {
|
||||
* ex: 00000000 = v1.8 PC, 00000002 = v1.3 Mac, 00000003 = v1.6+ Mac, 00000020 = v2.0+ PC */
|
||||
version = read_32bitBE(0x04,streamFile);
|
||||
/* 0x08-0c: reserved */
|
||||
datasize = read_32bitBE(0x0c,streamFile);
|
||||
if (is_swag)
|
||||
datasize = read_32bitLE(0x0c,streamFile);
|
||||
else
|
||||
datasize = read_32bitBE(0x0c,streamFile);
|
||||
/* 0x14-20 reserved */
|
||||
/* 0x20-30: name (optional) */
|
||||
/* 0x30: data start (first 0x10 usually 0s to init SPU) */
|
||||
@ -66,8 +67,11 @@ VGMSTREAM * init_vgmstream_ps2_vag(STREAMFILE *streamFile) {
|
||||
break;
|
||||
case 'p': /* "VAGp" (extended) [most common, ex Ratchet & Clank] */
|
||||
|
||||
if ((version <= 0x00000004) && (datasize < filesize / 2)) {
|
||||
loop_flag=(read_32bitBE(0x14,streamFile)!=0);
|
||||
if ((version <= 0x00000004) && (datasize < filesize / 2)) { /* two VAGp in the same file */
|
||||
if (is_swag)
|
||||
loop_flag = vag_find_loop_offsets(streamFile, 0x30, &loopStart, &loopEnd);
|
||||
else
|
||||
loop_flag = read_32bitBE(0x14,streamFile) != 0;
|
||||
channel_count=2;
|
||||
}
|
||||
else if (version == 0x00020001) { /* HEVAG */
|
||||
@ -91,7 +95,10 @@ VGMSTREAM * init_vgmstream_ps2_vag(STREAMFILE *streamFile) {
|
||||
|
||||
/* fill in the vital statistics */
|
||||
vgmstream->coding_type = coding_PSX;
|
||||
vgmstream->sample_rate = read_32bitBE(0x10,streamFile);
|
||||
if (is_swag)
|
||||
vgmstream->sample_rate = read_32bitLE(0x10,streamFile);
|
||||
else
|
||||
vgmstream->sample_rate = read_32bitBE(0x10,streamFile);
|
||||
|
||||
switch(vagID) {
|
||||
case '1': // VAG1
|
||||
@ -121,23 +128,31 @@ VGMSTREAM * init_vgmstream_ps2_vag(STREAMFILE *streamFile) {
|
||||
|
||||
if ((version == 0x00000004) && (datasize < filesize / 2)) {
|
||||
vgmstream->channels=2;
|
||||
vgmstream->num_samples = datasize; /* todo test if datasize/16*28? */
|
||||
|
||||
if(loop_flag) {
|
||||
vgmstream->loop_start_sample=read_32bitBE(0x14,streamFile);
|
||||
vgmstream->loop_end_sample =read_32bitBE(0x18,streamFile);
|
||||
loop_samples_found = 1;
|
||||
}
|
||||
|
||||
start_offset=0x80;
|
||||
vgmstream->layout_type=layout_interleave;
|
||||
vgmstream->meta_type=meta_PS2_VAGs;
|
||||
|
||||
// Double VAG Header @ 0x0000 & 0x1000
|
||||
if(read_32bitBE(0,streamFile)==read_32bitBE(0x1000,streamFile)) {
|
||||
if (is_swag) {
|
||||
start_offset = 0x30;
|
||||
interleave = datasize;
|
||||
vgmstream->num_samples = datasize / 16 * 28;
|
||||
interleave=0x1000;
|
||||
start_offset=0;
|
||||
vgmstream->loop_start_sample = (loopStart-start_offset) / 16 * 28;
|
||||
vgmstream->loop_end_sample = (loopEnd-start_offset) / 16 * 28;
|
||||
loop_samples_found = 1;
|
||||
|
||||
} else {
|
||||
start_offset=0x80;
|
||||
vgmstream->num_samples = datasize; /* todo test if datasize/16*28? */
|
||||
if(loop_flag) {
|
||||
vgmstream->loop_start_sample=read_32bitBE(0x14,streamFile);
|
||||
vgmstream->loop_end_sample =read_32bitBE(0x18,streamFile);
|
||||
loop_samples_found = 1;
|
||||
// Double VAG Header @ 0x0000 & 0x1000
|
||||
if(read_32bitBE(0,streamFile)==read_32bitBE(0x1000,streamFile)) {
|
||||
vgmstream->num_samples = datasize / 16 * 28;
|
||||
interleave=0x1000;
|
||||
start_offset=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (version == 0x40000000) { /* Guerilla VAG (little endian) */
|
||||
@ -150,7 +165,7 @@ VGMSTREAM * init_vgmstream_ps2_vag(STREAMFILE *streamFile) {
|
||||
start_offset = 0x30;
|
||||
}
|
||||
else if (version == 0x00020001) { /* HEVAG */
|
||||
vgmstream->coding_type = coding_HEVAG_ADPCM;
|
||||
vgmstream->coding_type = coding_HEVAG;
|
||||
vgmstream->layout_type = layout_interleave;
|
||||
vgmstream->meta_type = meta_PS2_VAGs;
|
||||
|
||||
@ -195,28 +210,14 @@ VGMSTREAM * init_vgmstream_ps2_vag(STREAMFILE *streamFile) {
|
||||
}
|
||||
|
||||
|
||||
/* open the file for reading by each channel */
|
||||
{
|
||||
for (i=0;i<channel_count;i++) {
|
||||
if (vgmstream->interleave_block_size > 0) {
|
||||
vgmstream->ch[i].streamfile = streamFile->open(streamFile,filename,vgmstream->interleave_block_size);
|
||||
} else {
|
||||
vgmstream->ch[i].streamfile = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
if (!vgmstream->ch[i].streamfile) goto fail;
|
||||
|
||||
vgmstream->ch[i].channel_start_offset=
|
||||
vgmstream->ch[i].offset=
|
||||
(off_t)(start_offset+vgmstream->interleave_block_size*i);
|
||||
}
|
||||
}
|
||||
/* open the file for reading */
|
||||
if ( !header_open_stream(vgmstream, streamFile, start_offset) )
|
||||
goto fail;
|
||||
|
||||
return vgmstream;
|
||||
|
||||
/* clean up anything we may have opened */
|
||||
fail:
|
||||
if (vgmstream) close_vgmstream(vgmstream);
|
||||
close_vgmstream(vgmstream);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -195,7 +195,7 @@ VGMSTREAM * init_vgmstream_ps3_sgdx(STREAMFILE *streamFile) {
|
||||
}
|
||||
#endif
|
||||
case 0x05: /* Short VAG ADPCM */
|
||||
vgmstream->coding_type = coding_VAG_ADPCM_cfg;
|
||||
vgmstream->coding_type = coding_PSX_cfg;
|
||||
vgmstream->layout_type = layout_interleave;
|
||||
vgmstream->interleave_block_size = 0x4;
|
||||
|
||||
|
@ -1,77 +1,129 @@
|
||||
#include "meta.h"
|
||||
#include "../util.h"
|
||||
#include "../header.h"
|
||||
|
||||
/* VAWX
|
||||
- No More Heroes: Heroes Paradise (PS3)
|
||||
*/
|
||||
VGMSTREAM * init_vgmstream_ps3_vawx(STREAMFILE *streamFile)
|
||||
{
|
||||
#define FAKE_RIFF_BUFFER_SIZE 100
|
||||
|
||||
/**
|
||||
* VAWX - found in feelplus games: No More Heroes Heroes Paradise, Moon Diver
|
||||
*/
|
||||
VGMSTREAM * init_vgmstream_vawx(STREAMFILE *streamFile) {
|
||||
VGMSTREAM * vgmstream = NULL;
|
||||
char filename[PATH_LIMIT];
|
||||
|
||||
off_t start_offset;
|
||||
off_t start_offset, datasize;
|
||||
|
||||
int loop_flag = 0;
|
||||
int channel_count;
|
||||
int loop_flag = 0, channel_count, type;
|
||||
|
||||
/* check extension, case insensitive */
|
||||
streamFile->get_name(streamFile,filename,sizeof(filename));
|
||||
if (strcasecmp("vawx",filename_extension(filename))) goto fail;
|
||||
|
||||
/* check header */
|
||||
if (read_32bitBE(0x00,streamFile) != 0x56415758) // "VAWX"
|
||||
/* check extensions */
|
||||
if ( !header_check_extensions(streamFile, "vawx,xwv") )
|
||||
goto fail;
|
||||
|
||||
if (read_8bit(0xF,streamFile) == 2)
|
||||
{
|
||||
loop_flag = 1;
|
||||
}
|
||||
/* check header */
|
||||
if (read_32bitBE(0x00,streamFile) != 0x56415758) /* "VAWX" */
|
||||
goto fail;
|
||||
|
||||
loop_flag = read_8bit(0x37,streamFile);
|
||||
channel_count = read_8bit(0x39,streamFile);;
|
||||
|
||||
/* build the VGMSTREAM */
|
||||
/* build the VGMSTREAM */
|
||||
vgmstream = allocate_vgmstream(channel_count,loop_flag);
|
||||
if (!vgmstream) goto fail;
|
||||
|
||||
/* fill in the vital statistics */
|
||||
start_offset = 0x800;
|
||||
vgmstream->channels = channel_count;
|
||||
/* 0x04: filesize */
|
||||
start_offset = 0x800; /* ? read_32bitLE(0x0c,streamFile); */
|
||||
vgmstream->channels = channel_count;
|
||||
/* 0x16: file id */
|
||||
type = read_8bit(0x36,streamFile); /* could be at 0x38 too */
|
||||
vgmstream->num_samples = read_32bitBE(0x3c,streamFile);
|
||||
vgmstream->sample_rate = read_32bitBE(0x40,streamFile);
|
||||
vgmstream->coding_type = coding_PSX;
|
||||
vgmstream->num_samples = ((get_streamfile_size(streamFile)-start_offset)/16/channel_count*28);
|
||||
|
||||
if (loop_flag)
|
||||
{
|
||||
vgmstream->loop_start_sample = read_32bitBE(0x44,streamFile);
|
||||
vgmstream->loop_end_sample = read_32bitBE(0x48,streamFile);;
|
||||
}
|
||||
|
||||
vgmstream->layout_type = layout_interleave;
|
||||
vgmstream->interleave_block_size = 0x10;
|
||||
vgmstream->meta_type = meta_PS3_VAWX;
|
||||
vgmstream->meta_type = meta_VAWX;
|
||||
|
||||
switch(type) {
|
||||
case 2: /* VAG */
|
||||
vgmstream->coding_type = coding_PSX;
|
||||
vgmstream->layout_type = layout_interleave;
|
||||
vgmstream->interleave_block_size = 0x10;
|
||||
|
||||
vgmstream->loop_start_sample = read_32bitBE(0x44,streamFile);
|
||||
vgmstream->loop_end_sample = read_32bitBE(0x48,streamFile);
|
||||
/* todo 6ch has 0x8000 blocks and must skip last 0x20 each block (or, skip 0x20 every 0x1550*6 */
|
||||
|
||||
break;
|
||||
|
||||
#ifdef VGM_USE_FFMPEG
|
||||
case 1: { /* XMA */
|
||||
ffmpeg_codec_data *ffmpeg_data = NULL;
|
||||
uint8_t buf[FAKE_RIFF_BUFFER_SIZE];
|
||||
size_t bytes, block_size, block_count;
|
||||
/* not accurate but not needed by FFmpeg */
|
||||
datasize = get_streamfile_size(streamFile)-start_offset;
|
||||
block_size = 2048;
|
||||
block_count = datasize / block_size; /* read_32bitLE(custom_data_offset +0x14) -1? */
|
||||
|
||||
/* make a fake riff so FFmpeg can parse the XMA2 */
|
||||
bytes = header_make_riff_xma2(buf, FAKE_RIFF_BUFFER_SIZE, vgmstream->num_samples, datasize, vgmstream->channels, vgmstream->sample_rate, block_count, block_size);
|
||||
if (bytes <= 0)
|
||||
goto fail;
|
||||
|
||||
ffmpeg_data = init_ffmpeg_header_offset(streamFile, buf,bytes, start_offset,datasize);
|
||||
if ( !ffmpeg_data ) goto fail;
|
||||
vgmstream->codec_data = ffmpeg_data;
|
||||
vgmstream->coding_type = coding_FFmpeg;
|
||||
vgmstream->layout_type = layout_none;
|
||||
|
||||
vgmstream->loop_start_sample = read_32bitBE(0x44,streamFile);
|
||||
vgmstream->loop_end_sample = read_32bitBE(0x48,streamFile);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 7: { /* ATRAC3 */
|
||||
ffmpeg_codec_data *ffmpeg_data = NULL;
|
||||
uint8_t buf[FAKE_RIFF_BUFFER_SIZE];
|
||||
size_t bytes, block_size, encoder_delay;
|
||||
int joint_stereo;
|
||||
int32_t max_samples;
|
||||
|
||||
datasize = read_32bitBE(0x54,streamFile);
|
||||
block_size = 0x98 * 2;
|
||||
joint_stereo = 0;
|
||||
max_samples = (datasize / block_size) * 1024;
|
||||
encoder_delay = 0x0; /* not used by FFmpeg */
|
||||
if (vgmstream->num_samples > max_samples) {
|
||||
vgmstream->num_samples = max_samples;
|
||||
/*encoder_delay = ?; */ /* todo some tracks need it to skip garbage but not sure how to calculate it */
|
||||
}
|
||||
|
||||
/* make a fake riff so FFmpeg can parse the ATRAC3 */
|
||||
bytes = header_make_riff_atrac3(buf, FAKE_RIFF_BUFFER_SIZE, vgmstream->num_samples, datasize, vgmstream->channels, vgmstream->sample_rate, block_size, joint_stereo, encoder_delay);
|
||||
if (bytes <= 0)
|
||||
goto fail;
|
||||
|
||||
ffmpeg_data = init_ffmpeg_header_offset(streamFile, buf,bytes, start_offset,datasize);
|
||||
if ( !ffmpeg_data ) goto fail;
|
||||
vgmstream->codec_data = ffmpeg_data;
|
||||
vgmstream->coding_type = coding_FFmpeg;
|
||||
vgmstream->layout_type = layout_none;
|
||||
|
||||
vgmstream->loop_start_sample = (read_32bitBE(0x44,streamFile) / ffmpeg_data->blockAlign) * ffmpeg_data->frameSize;
|
||||
vgmstream->loop_end_sample = (read_32bitBE(0x48,streamFile) / ffmpeg_data->blockAlign) * ffmpeg_data->frameSize;
|
||||
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
goto fail;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* open the file for reading */
|
||||
{
|
||||
int i;
|
||||
STREAMFILE * file;
|
||||
file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE);
|
||||
if (!file) goto fail;
|
||||
|
||||
for (i=0;i<channel_count;i++)
|
||||
{
|
||||
vgmstream->ch[i].streamfile = file;
|
||||
|
||||
vgmstream->ch[i].channel_start_offset=
|
||||
vgmstream->ch[i].offset=start_offset + (vgmstream->interleave_block_size * i);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
if ( !header_open_stream(vgmstream, streamFile, start_offset) )
|
||||
goto fail;
|
||||
|
||||
return vgmstream;
|
||||
|
||||
/* clean up anything we may have opened */
|
||||
fail:
|
||||
if (vgmstream) close_vgmstream(vgmstream);
|
||||
close_vgmstream(vgmstream);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -503,7 +503,7 @@ VGMSTREAM * init_vgmstream_riff(STREAMFILE *streamFile) {
|
||||
(long long)loop_start_ms*fmt.sample_rate/1000;
|
||||
vgmstream->loop_end_sample =
|
||||
(long long)loop_end_ms*fmt.sample_rate/1000;
|
||||
vgmstream->meta_type = meta_RIFF_WAVE_labl_Marker;
|
||||
vgmstream->meta_type = meta_RIFF_WAVE_labl;
|
||||
}
|
||||
else if (loop_start_offset >= 0)
|
||||
{
|
||||
|
68
src/meta/x360.c
Normal file
68
src/meta/x360.c
Normal file
@ -0,0 +1,68 @@
|
||||
#include "meta.h"
|
||||
#include "../header.h"
|
||||
|
||||
/* CXS - found in Eternal Sonata (Xbox 360) */
|
||||
VGMSTREAM * init_vgmstream_x360_cxs(STREAMFILE *streamFile) {
|
||||
VGMSTREAM * vgmstream = NULL;
|
||||
off_t start_offset;
|
||||
int loop_flag, channel_count;
|
||||
|
||||
/* check extension, case insensitive */
|
||||
if ( !header_check_extensions(streamFile,"cxs"))
|
||||
goto fail;
|
||||
|
||||
if (read_32bitBE(0x00,streamFile) != 0x43585320) /* "CXS " */
|
||||
goto fail;
|
||||
|
||||
loop_flag = read_32bitBE(0x18,streamFile) > 0;
|
||||
channel_count = read_32bitBE(0x0c,streamFile);
|
||||
|
||||
/* build the VGMSTREAM */
|
||||
vgmstream = allocate_vgmstream(channel_count,loop_flag);
|
||||
if (!vgmstream) goto fail;
|
||||
|
||||
start_offset = read_32bitBE(0x04,streamFile) + read_32bitBE(0x28,streamFile); /* assumed, seek table always at 0x800 */
|
||||
/* 0x04: data start? */
|
||||
vgmstream->sample_rate = read_32bitBE(0x08,streamFile);
|
||||
vgmstream->channels = channel_count; /*0x0c*/
|
||||
vgmstream->num_samples = read_32bitBE(0x10,streamFile) + 576; /*todo add proper encoder_delay*/
|
||||
vgmstream->loop_start_sample = read_32bitBE(0x14,streamFile);
|
||||
vgmstream->loop_end_sample = read_32bitBE(0x18,streamFile);
|
||||
/* 0x1c: below */
|
||||
|
||||
vgmstream->meta_type = meta_X360_CXS;
|
||||
vgmstream->layout_type = layout_none;
|
||||
|
||||
#ifdef VGM_USE_FFMPEG
|
||||
{
|
||||
ffmpeg_codec_data *ffmpeg_data = NULL;
|
||||
uint8_t buf[100];
|
||||
size_t bytes, datasize, block_size, block_count;
|
||||
|
||||
block_count = read_32bitBE(0x1c,streamFile);
|
||||
block_size = read_32bitBE(0x20,streamFile);
|
||||
datasize = read_32bitBE(0x24,streamFile);
|
||||
|
||||
/* make a fake riff so FFmpeg can parse the XMA2 */
|
||||
bytes = header_make_riff_xma2(buf,100, vgmstream->num_samples, datasize, vgmstream->channels, vgmstream->sample_rate, block_count, block_size);
|
||||
if (bytes <= 0)
|
||||
goto fail;
|
||||
ffmpeg_data = init_ffmpeg_header_offset(streamFile, buf,bytes, start_offset,datasize);
|
||||
if ( !ffmpeg_data ) goto fail;
|
||||
|
||||
vgmstream->codec_data = ffmpeg_data;
|
||||
vgmstream->coding_type = coding_FFmpeg;
|
||||
}
|
||||
#else
|
||||
goto fail;
|
||||
#endif
|
||||
|
||||
/* open the file for reading */
|
||||
if ( !header_open_stream(vgmstream, streamFile, start_offset) )
|
||||
goto fail;
|
||||
return vgmstream;
|
||||
|
||||
fail:
|
||||
close_vgmstream(vgmstream);
|
||||
return NULL;
|
||||
}
|
1515
src/vgmstream.c
1515
src/vgmstream.c
File diff suppressed because it is too large
Load Diff
529
src/vgmstream.h
529
src/vgmstream.h
@ -7,11 +7,12 @@
|
||||
|
||||
enum { PATH_LIMIT = 32768 };
|
||||
|
||||
/* Due mostly to licensing issues, Vorbis, MPEG, and G.722.1 decoding are
|
||||
#include "streamfile.h"
|
||||
|
||||
/* Due mostly to licensing issues, Vorbis, MPEG, G.722.1, etc decoding is
|
||||
* 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) */
|
||||
* removing these defines (and the references to the libraries in the Makefile) */
|
||||
#define VGM_USE_VORBIS
|
||||
|
||||
/* can be disabled to decode with FFmpeg instead */
|
||||
@ -19,18 +20,22 @@ enum { PATH_LIMIT = 32768 };
|
||||
#define VGM_USE_MPEG
|
||||
#endif
|
||||
|
||||
/* disabled by default, defined for builds that support it */
|
||||
/* disabled by default, defined on compile-time for builds that support it*/
|
||||
//#define VGM_USE_G7221
|
||||
//#define VGM_USE_G719
|
||||
//#define VGM_USE_MP4V2
|
||||
//#define VGM_USE_FDKAAC
|
||||
//#define VGM_USE_MAIATRAC3PLUS
|
||||
//#define VGM_USE_FFMPEG
|
||||
|
||||
#include "streamfile.h"
|
||||
#include "coding/g72x_state.h"
|
||||
#ifdef VGM_USE_VORBIS
|
||||
#include <vorbis/vorbisfile.h>
|
||||
#endif
|
||||
|
||||
#ifdef VGM_USE_MPEG
|
||||
#include <mpg123.h>
|
||||
#endif
|
||||
|
||||
#ifdef VGM_USE_G7221
|
||||
#include "g7221.h"
|
||||
#endif
|
||||
@ -51,79 +56,99 @@ enum { PATH_LIMIT = 32768 };
|
||||
#include "maiatrac3plus.h"
|
||||
#endif
|
||||
|
||||
#include "clHCA.h"
|
||||
|
||||
#ifdef VGM_USE_FFMPEG
|
||||
#include <libavcodec/avcodec.h>
|
||||
#include <libavformat/avformat.h>
|
||||
#endif
|
||||
|
||||
#include "coding/g72x_state.h"
|
||||
#include "coding/acm_decoder.h"
|
||||
#include "coding/nwa_decoder.h"
|
||||
#include "clHCA.h"
|
||||
|
||||
|
||||
/* 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 */
|
||||
coding_PCM16LE_int, /* little endian 16-bit PCM with sample-level
|
||||
interleave handled by the decoder */
|
||||
coding_PCM16LE_int, /* little endian 16-bit PCM with sample-level interleave */
|
||||
coding_PCM16LE_XOR_int, /* little endian 16-bit PCM with sample-level xor */
|
||||
coding_PCM16BE, /* big endian 16-bit PCM */
|
||||
|
||||
/* 8-bit PCM */
|
||||
coding_PCM8, /* 8-bit PCM */
|
||||
coding_PCM8_int, /* 8-Bit PCM with sample-level interleave */
|
||||
coding_PCM8_U, /* 8-bit PCM, unsigned (0x80 = 0) */
|
||||
coding_PCM8_int, /* 8-Bit PCM with sample-level interleave handled
|
||||
by the decoder */
|
||||
coding_PCM8_SB_int, /* 8-bit PCM, sign bit (others are 2's complement),
|
||||
sample-level interleave */
|
||||
coding_PCM8_U_int, /* 8-bit PCM, unsigned (0x80 = 0), sample-level
|
||||
interleave */
|
||||
coding_PCM8_U_int, /* 8-bit PCM, unsigned (0x80 = 0) with sample-level interleave */
|
||||
coding_PCM8_SB_int, /* 8-bit PCM, sign bit (others are 2's complement) with sample-level interleave */
|
||||
|
||||
/* 4-bit ADPCM */
|
||||
coding_NDS_IMA, /* IMA ADPCM w/ NDS layout */
|
||||
coding_CRI_ADX, /* CRI ADX */
|
||||
coding_CRI_ADX_enc_8, /* encrypted CRI ADX, type 8 (God Hand) */
|
||||
coding_CRI_ADX_enc_9, /* encrypted CRI ADX, type 9 (PSO2) */
|
||||
coding_NGC_DSP, /* NGC ADPCM, called DSP */
|
||||
coding_NGC_DTK, /* NGC hardware disc ADPCM, called DTK, TRK or ADP */
|
||||
coding_G721, /* CCITT G.721 ADPCM */
|
||||
coding_NGC_AFC, /* NGC ADPCM, called AFC */
|
||||
coding_PSX, /* PSX & PS2 ADPCM */
|
||||
coding_invert_PSX, /* PSX ADPCM with some weirdness */
|
||||
coding_PSX_badflags, /* with garbage in the flags byte */
|
||||
coding_HEVAG_ADPCM, /* PSVita games */
|
||||
coding_VAG_ADPCM_cfg, /* VAG with configurable frame size: FF XI, SGXD type 5, Bizarre Creations */
|
||||
coding_XA, /* PSX CD-XA */
|
||||
coding_XBOX, /* XBOX IMA */
|
||||
coding_INT_XBOX, /* XBOX 'real interleaved' IMA */
|
||||
coding_EAXA, /* EA/XA ADPCM */
|
||||
coding_EA_ADPCM, /* EA ADPCM */
|
||||
coding_MAXIS_ADPCM, /* MAXIS ADPCM */
|
||||
coding_NDS_PROCYON, /* NDS Procyon Studio ADPCM */
|
||||
coding_CRI_ADX_enc_8, /* CRI ADX, type 8 encryption (God Hand) */
|
||||
coding_CRI_ADX_enc_9, /* CRI ADX, type 9 encryption (PSO2) */
|
||||
|
||||
#ifdef VGM_USE_VORBIS
|
||||
coding_ogg_vorbis, /* vorbis */
|
||||
#endif
|
||||
coding_SDX2, /* SDX2 2:1 Squareroot-Delta-Exact compression */
|
||||
coding_SDX2_int, /* SDX2 2:1 Squareroot-Delta-Exact compression,
|
||||
with smaple-level interleave handled by the
|
||||
decoder */
|
||||
coding_CBD2, /* CBD2 2:1 Cuberoot-Delta-Exact compression */
|
||||
coding_CBD2_int, /* CBD2 2:1 Cuberoot-Delta-Exact compression,
|
||||
with sample-level interleave handled by the
|
||||
decoder */
|
||||
coding_DVI_IMA, /* DVI (bare IMA, high nibble first), aka ADP4 */
|
||||
coding_INT_DVI_IMA, /* Interleaved DVI */
|
||||
coding_NGC_DSP, /* Nintendo DSP ADPCM */
|
||||
coding_NGC_DTK, /* Nintendo DTK ADPCM (hardware disc), also called TRK or ADP */
|
||||
coding_NGC_AFC, /* Nintendo AFC ADPCM */
|
||||
|
||||
coding_G721, /* CCITT G.721 */
|
||||
|
||||
coding_XA, /* CD-ROM XA */
|
||||
coding_PSX, /* Sony PS ADPCM (VAG) */
|
||||
coding_PSX_badflags, /* Sony PS ADPCM with garbage in the flag byte */
|
||||
coding_PSX_bmdx, /* Sony PS ADPCM with BMDX encryption */
|
||||
coding_PSX_cfg, /* Sony PS ADPCM with configurable frame size (FF XI, SGXD type 5, Bizarre Creations) */
|
||||
coding_HEVAG, /* Sony PSVita ADPCM */
|
||||
|
||||
coding_EA_XA, /* Electronic Arts XA ADPCM */
|
||||
coding_EA_ADPCM, /* Electronic Arts R1 ADPCM */
|
||||
coding_MAXIS_ADPCM, /* Maxis ADPCM */
|
||||
coding_NDS_PROCYON, /* Procyon Studio ADPCM */
|
||||
|
||||
coding_XBOX, /* XBOX IMA ADPCM */
|
||||
coding_INT_XBOX, /* XBOX IMA ADPCM (interleaved) */
|
||||
coding_IMA, /* IMA ADPCM (low nibble first) */
|
||||
coding_INT_IMA, /* IMA ADPCM (interleaved) */
|
||||
coding_DVI_IMA, /* DVI IMA ADPCM (high nibble first), aka ADP4 */
|
||||
coding_INT_DVI_IMA, /* DVI IMA ADPCM (Interleaved) */
|
||||
coding_NDS_IMA, /* IMA ADPCM w/ NDS layout */
|
||||
coding_EACS_IMA,
|
||||
coding_IMA, /* bare IMA, low nibble first */
|
||||
coding_INT_IMA, /* */
|
||||
coding_MS_IMA, /* Microsoft IMA */
|
||||
coding_RAD_IMA, /* "Radical ADPCM" IMA */
|
||||
coding_RAD_IMA_mono, /* "Radical ADPCM" IMA, mono (for interleave) */
|
||||
coding_APPLE_IMA4, /* Apple Quicktime IMA4 */
|
||||
coding_DAT4_IMA, /* Eurocom 'DAT4' IMA ADPCM */
|
||||
coding_SNDS_IMA, /* Heavy Iron Studios .snds IMA ADPCM */
|
||||
coding_WS, /* Westwood Studios' custom VBR ADPCM */
|
||||
coding_WS, /* Westwood Studios VBR ADPCM */
|
||||
|
||||
coding_MSADPCM, /* Microsoft ADPCM */
|
||||
coding_AICA, /* Yamaha AICA ADPCM */
|
||||
coding_L5_555, /* Level-5 0x555 ADPCM */
|
||||
coding_SASSC, /* Activision EXAKT SASSC DPCM */
|
||||
coding_LSF, /* lsf ADPCM (Fastlane Street Racing iPhone)*/
|
||||
coding_MTAF, /* Konami MTAF ADPCM (IMA-derived) */
|
||||
|
||||
/* others */
|
||||
coding_SDX2, /* SDX2 2:1 Squareroot-Delta-Exact compression DPCM */
|
||||
coding_SDX2_int, /* SDX2 2:1 Squareroot-Delta-Exact compression with sample-level interleave */
|
||||
coding_CBD2, /* CBD2 2:1 Cuberoot-Delta-Exact compression DPCM */
|
||||
coding_CBD2_int, /* CBD2 2:1 Cuberoot-Delta-Exact compression, with sample-level interleave */
|
||||
|
||||
coding_ACM, /* InterPlay ACM */
|
||||
|
||||
coding_NWA0, /* Visual Art's NWA (compressed at various levels) */
|
||||
coding_NWA1,
|
||||
coding_NWA2,
|
||||
coding_NWA3,
|
||||
coding_NWA4,
|
||||
coding_NWA5,
|
||||
|
||||
coding_CRI_HCA, /* CRI High Compression Audio (MDCT-based) */
|
||||
|
||||
#ifdef VGM_USE_VORBIS
|
||||
coding_ogg_vorbis, /* Xiph Vorbis (MDCT-based) */
|
||||
#endif
|
||||
|
||||
#ifdef VGM_USE_MPEG
|
||||
coding_fake_MPEG2_L2, /* MPEG-2 Layer 2 (AHX), with lying headers */
|
||||
/* I don't even know offhand if all these combinations exist... */
|
||||
@ -137,43 +162,26 @@ typedef enum {
|
||||
coding_MPEG25_L2,
|
||||
coding_MPEG25_L3,
|
||||
#endif
|
||||
|
||||
#ifdef VGM_USE_G7221
|
||||
coding_G7221, /* G.722.1 (Polycom Siren 7) */
|
||||
coding_G7221C, /* G.722.1 with Annex C extension (Polycom Siren 14) */
|
||||
coding_G7221, /* ITU G.722.1 (Polycom Siren 7) */
|
||||
coding_G7221C, /* ITU G.722.1 annex C (Polycom Siren 14) */
|
||||
#endif
|
||||
|
||||
#ifdef VGM_USE_G719
|
||||
coding_G719,
|
||||
#endif
|
||||
|
||||
coding_ACM, /* InterPlay ACM */
|
||||
/* compressed NWA at various levels */
|
||||
coding_NWA0,
|
||||
coding_NWA1,
|
||||
coding_NWA2,
|
||||
coding_NWA3,
|
||||
coding_NWA4,
|
||||
coding_NWA5,
|
||||
|
||||
coding_MSADPCM, /* Microsoft ADPCM */
|
||||
coding_AICA, /* Yamaha AICA ADPCM */
|
||||
coding_L5_555, /* Level-5 0x555 */
|
||||
coding_SASSC, /* Activision EXAKT SASSC DPCM */
|
||||
coding_PCM16LE_XOR_int, /* sample-level xor */
|
||||
coding_LSF, /* lsf ADPCM */
|
||||
coding_MTAF, /* Konami IMA-derived MTAF ADPCM */
|
||||
|
||||
coding_CRI_HCA, /* CRI High Compression Audio */
|
||||
|
||||
#ifdef VGM_USE_FFMPEG
|
||||
coding_FFmpeg,
|
||||
coding_G719, /* ITU G.719 annex B (Polycom Siren 22) */
|
||||
#endif
|
||||
|
||||
#if defined(VGM_USE_MP4V2) && defined(VGM_USE_FDKAAC)
|
||||
coding_MP4_AAC,
|
||||
coding_MP4_AAC, /* AAC (MDCT-based) */
|
||||
#endif
|
||||
|
||||
#ifdef VGM_USE_MAIATRAC3PLUS
|
||||
coding_AT3plus,
|
||||
coding_AT3plus, /* Sony ATRAC3plus (MDCT-based) */
|
||||
#endif
|
||||
|
||||
#ifdef VGM_USE_FFMPEG
|
||||
coding_FFmpeg, /* Formats handled by FFmpeg (ATRAC3, XMA, AC3, etc) */
|
||||
#endif
|
||||
} coding_t;
|
||||
|
||||
@ -181,15 +189,15 @@ typedef enum {
|
||||
typedef enum {
|
||||
/* generic */
|
||||
layout_none, /* straight data */
|
||||
|
||||
/* interleave */
|
||||
layout_interleave, /* equal interleave throughout the stream */
|
||||
layout_interleave_shortblock, /* interleave with a short last block */
|
||||
|
||||
layout_interleave_byte, /* full byte interleave */
|
||||
|
||||
/* headered blocks */
|
||||
layout_ast_blocked, /* .ast STRM with BLCK blocks*/
|
||||
layout_halpst_blocked, /* blocks with HALPST-format header */
|
||||
layout_ast_blocked,
|
||||
layout_halpst_blocked,
|
||||
layout_xa_blocked,
|
||||
layout_ea_blocked,
|
||||
layout_eacs_blocked,
|
||||
@ -210,12 +218,18 @@ typedef enum {
|
||||
layout_ps2_adm_blocked,
|
||||
layout_dsp_bdsp_blocked,
|
||||
layout_mxch_blocked,
|
||||
layout_ivaud_blocked, /* GTA IV .ivaud blocks */
|
||||
layout_tra_blocked, /* DefJam Rapstar .tra blocks */
|
||||
layout_ps2_iab_blocked,
|
||||
layout_ps2_strlr_blocked,
|
||||
|
||||
#if 0
|
||||
layout_strm_blocked, /* */
|
||||
#endif
|
||||
/* otherwise odd */
|
||||
layout_dtk_interleave, /* dtk interleaves channels by nibble */
|
||||
layout_acm, /* libacm layout */
|
||||
layout_mus_acm, /* mus has multi-files to deal with */
|
||||
layout_aix, /* CRI AIX's wheels within wheels */
|
||||
layout_aax, /* CRI AAX's wheels within databases */
|
||||
layout_scd_int, /* deinterleave done by the SCDINTSTREAMFILE */
|
||||
|
||||
#ifdef VGM_USE_VORBIS
|
||||
layout_ogg_vorbis, /* ogg vorbis file */
|
||||
#endif
|
||||
@ -223,31 +237,22 @@ typedef enum {
|
||||
layout_fake_mpeg, /* MPEG audio stream with bad frame headers (AHX) */
|
||||
layout_mpeg, /* proper MPEG audio stream */
|
||||
#endif
|
||||
layout_acm, /* dummy, let libacm handle layout */
|
||||
layout_mus_acm, /* mus has multi-files to deal with */
|
||||
layout_aix, /* CRI AIX's wheels within wheels */
|
||||
layout_aax, /* CRI AAX's wheels within databases */
|
||||
layout_ivaud_blocked, /* GTA IV .ivaud blocks */
|
||||
layout_tra_blocked, /* DefJam Rapstar .tra blocks */
|
||||
layout_ps2_iab_blocked,
|
||||
layout_ps2_strlr_blocked,
|
||||
layout_scd_int, /* deinterleave done by the SCDINTSTREAMFILE */
|
||||
} 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. */
|
||||
/* 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_CSMP, /* Metroid Prime 3, Donkey Kong Country Returns */
|
||||
meta_DSP_STD, /* Nintendo standard GC ADPCM (DSP) header */
|
||||
meta_DSP_CSMP, /* Retro: Metroid Prime 3, Donkey Kong Country Returns */
|
||||
meta_DSP_CSTR, /* Star Fox Assault "Cstr" */
|
||||
meta_DSP_RS03, /* Metroid Prime 2 "RS03" */
|
||||
meta_DSP_RS03, /* Retro: Metroid Prime 2 "RS03" */
|
||||
meta_DSP_STM, /* Paper Mario 2 STM */
|
||||
meta_DSP_HALP, /* SSB:M "HALPST" */
|
||||
meta_DSP_AGSC, /* Metroid Prime 2 title */
|
||||
meta_DSP_AGSC, /* Retro: Metroid Prime 2 title */
|
||||
meta_DSP_MPDSP, /* Monopoly Party single header stereo */
|
||||
meta_DSP_JETTERS, /* Bomberman Jetters .dsp */
|
||||
meta_DSP_MSS,
|
||||
meta_DSP_GCM,
|
||||
meta_DSP_MSS, /* ? */
|
||||
meta_DSP_GCM, /* ? */
|
||||
meta_DSP_STR, /* Conan .str files */
|
||||
meta_DSP_SADB, /* .sad */
|
||||
meta_DSP_WSI, /* .wsi */
|
||||
@ -255,12 +260,12 @@ typedef enum {
|
||||
meta_DSP_WII_IDSP, /* .gcm with IDSP header */
|
||||
meta_DSP_WII_MUS, /* .mus */
|
||||
meta_DSP_WII_WSD, /* Phantom Brave (WII) */
|
||||
meta_WII_NDP, /* Vertigo (Wii) */
|
||||
meta_DSP_YGO, /* Yu-Gi-Oh! The Falsebound Kingdom (NGC), Hikaru no Go 3 (NGC) */
|
||||
meta_WII_NDP, /* Vertigo (Wii) */
|
||||
meta_DSP_YGO, /* Konami: Yu-Gi-Oh! The Falsebound Kingdom (NGC), Hikaru no Go 3 (NGC) */
|
||||
|
||||
/* Nintendo */
|
||||
meta_STRM, /* STRM */
|
||||
meta_RSTM, /* RSTM (similar to STRM) */
|
||||
meta_STRM, /* Nintendo STRM */
|
||||
meta_RSTM, /* Nintendo RSTM (similar to STRM) */
|
||||
meta_AFC, /* AFC */
|
||||
meta_AST, /* AST */
|
||||
meta_RWSD, /* single-stream RWSD */
|
||||
@ -269,7 +274,7 @@ typedef enum {
|
||||
meta_CWAV, /* contents of CWAR */
|
||||
meta_FWAV, /* contents of FWAR */
|
||||
meta_RSTM_SPM, /* RSTM with 44->22khz hack */
|
||||
meta_THP,
|
||||
meta_THP, /* THP movie files */
|
||||
meta_RSTM_shrunken, /* Atlus' mutant shortened RSTM */
|
||||
meta_NDS_SWAV, /* Asphalt Urban GT 1 & 2 */
|
||||
meta_NDS_RRDS, /* Ridge Racer DS */
|
||||
@ -277,18 +282,16 @@ typedef enum {
|
||||
meta_STX, /* Pikmin .stx */
|
||||
meta_WIIU_BTSND, /* Wii U Boot Sound */
|
||||
|
||||
/* CRI ADX */
|
||||
meta_ADX_03, /* ADX "type 03" */
|
||||
meta_ADX_04, /* ADX "type 04" */
|
||||
meta_ADX_05, /* ADX "type 05" */
|
||||
meta_ADX_03, /* CRI ADX "type 03" */
|
||||
meta_ADX_04, /* CRI ADX "type 04" */
|
||||
meta_ADX_05, /* CRI ADX "type 05" */
|
||||
meta_AIX, /* CRI AIX */
|
||||
meta_AAX, /* CRI AAX */
|
||||
meta_UTF_DSP, /* CRI ADPCM_WII, like AAX with DSP */
|
||||
|
||||
/* etc */
|
||||
meta_NGC_ADPDTK, /* NGC DTK/ADP, no header (.adp) */
|
||||
meta_NGC_ADPDTK, /* NGC DTK/ADP (.adp/dkt DTK) [no header_id] */
|
||||
meta_kRAW, /* almost headerless PCM */
|
||||
meta_RSF, /* Retro Studios RSF, no header (.rsf) */
|
||||
meta_RSF, /* Retro Studios RSF (Metroid Prime .rsf) [no header_id] */
|
||||
meta_HALPST, /* HAL Labs HALPST */
|
||||
meta_GCSW, /* GCSW (PCM) */
|
||||
meta_CFN, /* Namco CAF Audio File */
|
||||
@ -296,6 +299,7 @@ typedef enum {
|
||||
meta_HIS, /* Her Ineractive .his */
|
||||
meta_BNSF, /* Bandai Namco Sound Format */
|
||||
|
||||
meta_PSX_XA, /* CD-ROM XA with RIFF header */
|
||||
meta_PS2_SShd, /* .ADS with SShd header */
|
||||
meta_PS2_NPSF, /* Namco Production Sound File */
|
||||
meta_PS2_RXW, /* Sony Arc The Lad Sound File */
|
||||
@ -309,11 +313,10 @@ typedef enum {
|
||||
meta_PS2_VAGp, /* VAGp Mono File */
|
||||
meta_PS2_VAGm, /* VAGp Mono File */
|
||||
meta_PS2_pGAV, /* VAGp with Little Endian Header */
|
||||
meta_PSX_GMS, /* GMS File (used in PS1 & PS2) */
|
||||
meta_PSX_GMS, /* GMS File (used in PS1 & PS2) [no header_id] */
|
||||
meta_PS2_STR, /* Pacman STR+STH files */
|
||||
meta_PS2_ILD, /* ILD File */
|
||||
meta_PS2_PNB, /* PsychoNauts Bgm File */
|
||||
meta_PSX_XA, /* CD-XA with RIFF header */
|
||||
meta_PS2_VAGs, /* VAG Stereo from Kingdom Hearts */
|
||||
meta_PS2_VPK, /* VPK Audio File */
|
||||
meta_PS2_BMDX, /* Beatmania thing */
|
||||
@ -323,8 +326,8 @@ typedef enum {
|
||||
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 */
|
||||
meta_AUS, /* Various Capcom games */
|
||||
meta_RWS, /* Various Konami games */
|
||||
meta_FSB1, /* FMOD Sample Bank, version 1 */
|
||||
meta_FSB2, /* FMOD Sample Bank, version 2 */
|
||||
meta_FSB3, /* FMOD Sample Bank, version 3.0/3.1 */
|
||||
@ -339,7 +342,7 @@ typedef enum {
|
||||
meta_MUSX_V006, /* Spyro Games, possibly more */
|
||||
meta_MUSX_V010, /* Spyro Games, possibly more */
|
||||
meta_MUSX_V201, /* Sphinx and the cursed Mummy */
|
||||
meta_LEG, /* Legaia 2 */
|
||||
meta_LEG, /* Legaia 2 [no header_id] */
|
||||
meta_FILP, /* Resident Evil - Dead Aim */
|
||||
meta_IKM, /* Zwei! */
|
||||
meta_SFS, /* Baroque */
|
||||
@ -348,8 +351,8 @@ typedef enum {
|
||||
meta_PS2_KCES, /* Dance Dance Revolution */
|
||||
meta_PS2_DXH, /* Tokobot Plus - Myteries of the Karakuri */
|
||||
meta_PS2_PSH, /* Dawn of Mana - Seiken Densetsu 4 */
|
||||
meta_PCM_SCD, /* Ephemeral Fantasia */
|
||||
meta_PCM_PS2, /* Lunar - Eternal Blue */
|
||||
meta_PCM_SCD, /* Lunar - Eternal Blue */
|
||||
meta_PCM_PS2, /* Konami: Ephemeral Fantasia, Yu-Gi-Oh! The Duelists of the Roses */
|
||||
meta_PS2_RKV, /* Legacy of Kain - Blood Omen 2 */
|
||||
meta_PS2_PSW, /* Rayman Raving Rabbids */
|
||||
meta_PS2_VAS, /* Pro Baseball Spirits 5 */
|
||||
@ -358,7 +361,7 @@ typedef enum {
|
||||
meta_SDT, /* Baldur's Gate - Dark Alliance */
|
||||
meta_NGC_TYDSP, /* Ty - The Tasmanian Tiger */
|
||||
meta_NGC_SWD, /* Conflict - Desert Storm 1 & 2 */
|
||||
meta_CAPDSP, /* Capcom DSP Header */
|
||||
meta_CAPDSP, /* Capcom DSP Header [no header_id] */
|
||||
meta_DC_STR, /* SEGA Stream Asset Builder */
|
||||
meta_DC_STR_V2, /* variant of SEGA Stream Asset Builder */
|
||||
meta_NGC_BH2PCM, /* Bio Hazard 2 */
|
||||
@ -368,40 +371,39 @@ typedef enum {
|
||||
meta_PS2_OMU, /* PS2 Int file with Header */
|
||||
meta_PS2_XA2, /* XG3 Extreme-G Racing */
|
||||
meta_IDSP, /* Chronicles of Narnia, Soul Calibur Legends, Mario Strikers Charged */
|
||||
meta_SPT_SPD, /* Variouis */
|
||||
meta_ISH_ISD, /* Various */
|
||||
meta_GSP_GSB, /* Various */
|
||||
meta_SPT_SPD, /* Various (SPT+SPT DSP) */
|
||||
meta_ISH_ISD, /* Various (ISH+ISD DSP) */
|
||||
meta_GSP_GSB, /* Various (GSP+GSB DSP), Super Swing Golf 1 & 2 */
|
||||
meta_YDSP, /* WWE Day of Reckoning */
|
||||
meta_FFCC_STR, /* Final Fantasy: Crystal Chronicles */
|
||||
|
||||
meta_FFCC_STR, /* Final Fantasy: Crystal Chronicles */
|
||||
|
||||
meta_WAA_WAC_WAD_WAM, /* Beyond Good & Evil */
|
||||
meta_GCA, /* Metal Slug Anthology */
|
||||
meta_MSVP, /* Popcap Hits */
|
||||
meta_NGC_SSM, /* Golden Gashbell Full Power */
|
||||
meta_PS2_JOE, /* Wall-E / Pixar games */
|
||||
meta_GCA, /* Metal Slug Anthology */
|
||||
meta_MSVP, /* Popcap Hits */
|
||||
meta_NGC_SSM, /* Golden Gashbell Full Power */
|
||||
meta_PS2_JOE, /* Wall-E / Pixar games */
|
||||
|
||||
meta_NGC_YMF, /* WWE WrestleMania X8 */
|
||||
meta_SADL, /* .sad */
|
||||
meta_PS2_CCC, /* Tokyo Xtreme Racer DRIFT 2 */
|
||||
meta_PSX_FAG, /* Jackie Chan - Stuntmaster */
|
||||
meta_PS2_MIHB, /* Merged MIH+MIB */
|
||||
meta_NGC_PDT, /* Mario Party 6 */
|
||||
meta_DC_ASD, /* Miss Moonligh */
|
||||
meta_NAOMI_SPSD, /* Guilty Gear X */
|
||||
meta_NGC_YMF, /* WWE WrestleMania X8 */
|
||||
meta_SADL, /* .sad */
|
||||
meta_PS2_CCC, /* Tokyo Xtreme Racer DRIFT 2 */
|
||||
meta_PSX_FAG, /* Jackie Chan - Stuntmaster */
|
||||
meta_PS2_MIHB, /* Merged MIH+MIB */
|
||||
meta_NGC_PDT, /* Mario Party 6 */
|
||||
meta_DC_ASD, /* Miss Moonligh */
|
||||
meta_NAOMI_SPSD, /* Guilty Gear X */
|
||||
|
||||
meta_RSD2VAG, /* RSD2VAG */
|
||||
meta_RSD2VAG, /* RSD2VAG */
|
||||
meta_RSD2PCMB, /* RSD2PCMB */
|
||||
meta_RSD2XADP, /* RSD2XADP */
|
||||
meta_RSD3VAG, /* RSD3VAG */
|
||||
meta_RSD3GADP, /* RSD3GADP */
|
||||
meta_RSD3VAG, /* RSD3VAG */
|
||||
meta_RSD3GADP, /* RSD3GADP */
|
||||
meta_RSD3PCM, /* RSD3PCM */
|
||||
meta_RSD3PCMB, /* RSD3PCMB */
|
||||
meta_RSD4PCMB, /* RSD4PCMB */
|
||||
meta_RSD4PCM, /* RSD4PCM */
|
||||
meta_RSD4PCM, /* RSD4PCM */
|
||||
meta_RSD4RADP, /* RSD4RADP */
|
||||
meta_RSD4VAG, /* RSD4VAG */
|
||||
meta_RSD6VAG, /* RSD6VAG */
|
||||
meta_RSD4VAG, /* RSD4VAG */
|
||||
meta_RSD6VAG, /* RSD6VAG */
|
||||
meta_RSD6WADP, /* RSD6WADP */
|
||||
meta_RSD6XADP, /* RSD6XADP */
|
||||
meta_RSD6RADP, /* RSD6RADP */
|
||||
@ -409,7 +411,7 @@ typedef enum {
|
||||
|
||||
meta_PS2_ASS, /* ASS */
|
||||
meta_PS2_SEG, /* Eragon */
|
||||
meta_XBOX_SEG,
|
||||
meta_XBOX_SEG, /* Eragon */
|
||||
meta_NDS_STRM_FFTA2, /* Final Fantasy Tactics A2 */
|
||||
meta_STR_ASR, /* Donkey Kong Jet Race */
|
||||
meta_ZWDSP, /* Zack and Wiki */
|
||||
@ -420,19 +422,19 @@ typedef enum {
|
||||
meta_EMFF_PS2, /* Eidos Music File Format for PS2*/
|
||||
meta_EMFF_NGC, /* Eidos Music File Format for NGC/WII */
|
||||
meta_SAT_BAKA, /* Crypt Killer */
|
||||
meta_PS2_VSF, /* Musashi: Samurai Legend */
|
||||
meta_PS2_VSF_TTA, /* Tiny Toon Adventures: Defenders of the Universe */
|
||||
meta_ADS, /* Gauntlet Dark Legends (GC) */
|
||||
meta_PS2_SPS, /* Ape Escape 2 */
|
||||
meta_PS2_XA2_RRP, /* RC Revenge Pro */
|
||||
meta_PS2_STM, /* Red Dead Revolver .stm, renamed .ps2stm */
|
||||
meta_NGC_DSP_KONAMI, /* Konami DSP header, found in various games */
|
||||
meta_UBI_CKD, /* Ubisoft CKD RIFF header from Rayman Origins */
|
||||
meta_PS2_VSF, /* Musashi: Samurai Legend */
|
||||
meta_PS2_VSF_TTA, /* Tiny Toon Adventures: Defenders of the Universe */
|
||||
meta_ADS, /* Gauntlet Dark Legends (GC) */
|
||||
meta_PS2_SPS, /* Ape Escape 2 */
|
||||
meta_PS2_XA2_RRP, /* RC Revenge Pro */
|
||||
meta_PS2_STM, /* Red Dead Revolver .stm, renamed .ps2stm */
|
||||
meta_NGC_DSP_KONAMI, /* Konami DSP header, found in various games */
|
||||
meta_UBI_CKD, /* Ubisoft CKD RIFF header from Rayman Origins */
|
||||
|
||||
meta_XBOX_WAVM, /* XBOX WAVM File */
|
||||
meta_XBOX_RIFF, /* XBOX RIFF/WAVE File */
|
||||
meta_XBOX_WVS, /* XBOX WVS */
|
||||
meta_NGC_WVS, /* NGC WVS */
|
||||
meta_NGC_WVS, /* Metal Arms - Glitch in the System */
|
||||
meta_XBOX_STMA, /* XBOX STMA */
|
||||
meta_XBOX_MATX, /* XBOX MATX */
|
||||
meta_XBOX_XMU, /* XBOX XMU */
|
||||
@ -444,69 +446,56 @@ typedef enum {
|
||||
meta_EACS_PC, /* EACS PC */
|
||||
meta_EACS_PSX, /* EACS PSX */
|
||||
meta_EACS_SAT, /* EACS SATURN */
|
||||
meta_EA_ADPCM, /* EA XA ADPCM */
|
||||
meta_EA_IMA, /* EA IMA */
|
||||
meta_EA_PCM, /* EA PCM */
|
||||
meta_EA_ADPCM, /* EA header using XA ADPCM */
|
||||
meta_EA_IMA, /* EA header using IMA */
|
||||
meta_EA_PCM, /* EA header using PCM */
|
||||
|
||||
meta_RAW, /* RAW PCM file */
|
||||
|
||||
meta_GENH, /* generic header */
|
||||
|
||||
#ifdef VGM_USE_VORBIS
|
||||
meta_ogg_vorbis, /* ogg vorbis */
|
||||
meta_OGG_SLI, /* Ogg Vorbis file w/ companion .sli for looping */
|
||||
meta_OGG_SLI2, /* Ogg Vorbis file w/ different styled .sli for looping */
|
||||
meta_OGG_SFL, /* Ogg Vorbis file w/ .sfl (RIFF SFPL) for looping */
|
||||
meta_um3_ogg, /* Ogg Vorbis with first 0x800 bytes XOR 0xFF */
|
||||
meta_KOVS_ogg, /* Ogg Vorbis with exta header and 0x100 bytes XOR */
|
||||
meta_psych_ogg, /* Ogg Vorbis with all bytes -0x23*/
|
||||
#endif
|
||||
|
||||
meta_AIFC, /* Audio Interchange File Format AIFF-C */
|
||||
meta_AIFF, /* Audio Interchange File Format */
|
||||
meta_STR_SNDS, /* .str with SNDS blocks and SHDR header */
|
||||
meta_WS_AUD, /* Westwood Studios .aud */
|
||||
meta_WS_AUD_old, /* Westwood Studios .aud, old style */
|
||||
#ifdef VGM_USE_MPEG
|
||||
meta_AHX, /* CRI AHX header (same structure as ADX) */
|
||||
#endif
|
||||
meta_RIFF_WAVE, /* RIFF, for WAVs */
|
||||
meta_RIFF_WAVE_POS, /* .wav + .pos for looping */
|
||||
meta_RIFF_WAVE_labl_Marker, /* RIFF w/ loop Markers in LIST-adtl-labl */
|
||||
meta_RIFF_WAVE_labl, /* RIFF w/ loop Markers in LIST-adtl-labl */
|
||||
meta_RIFF_WAVE_smpl, /* RIFF w/ loop data in smpl chunk */
|
||||
meta_RIFF_WAVE_MWV, /* .mwv RIFF w/ loop data in ctrl chunk pflt */
|
||||
meta_RIFF_WAVE_SNS, /* .sns RIFF */
|
||||
meta_RIFX_WAVE, /* RIFX, for big-endian WAVs */
|
||||
meta_RIFX_WAVE_smpl, /* RIFX w/ loop data in smpl chunk */
|
||||
meta_XNBm, /* XNBm, which has a RIFF fmt chunk */
|
||||
meta_PC_MXST, /* Lego Island MxSt */
|
||||
meta_PC_SOB_SAB, /* Worms 4 Mayhem SOB+SAB file */
|
||||
meta_PC_MXST, /* Lego Island MxSt */
|
||||
meta_PC_SOB_SAB, /* Worms 4 Mayhem SOB+SAB file */
|
||||
meta_NWA, /* Visual Art's NWA */
|
||||
meta_NWA_NWAINFOINI, /* NWA w/ NWAINFO.INI for looping */
|
||||
meta_NWA_GAMEEXEINI, /* NWA w/ Gameexe.ini for looping */
|
||||
meta_DVI, /* DVI Interleaved */
|
||||
meta_KCEY, /* KCEYCOMP */
|
||||
meta_NWA_NWAINFOINI, /* Visual Art's NWA w/ NWAINFO.INI for looping */
|
||||
meta_NWA_GAMEEXEINI, /* Visual Art's NWA w/ Gameexe.ini for looping */
|
||||
meta_DVI, /* DVI Interleaved */
|
||||
meta_KCEY, /* KCEYCOMP */
|
||||
meta_ACM, /* InterPlay ACM header */
|
||||
meta_MUS_ACM, /* MUS playlist of InterPlay ACM files */
|
||||
meta_DE2, /* Falcom (Gurumin) .de2 */
|
||||
meta_VS, /* Men in Black .vs */
|
||||
meta_VS, /* Men in Black .vs */
|
||||
meta_FFXI_BGW, /* FFXI BGW */
|
||||
meta_FFXI_SPW, /* FFXI SPW */
|
||||
meta_STS_WII, /* Shikigami No Shiro 3 STS Audio File */
|
||||
meta_PS2_P2BT, /* Pop'n'Music 7 Audio File */
|
||||
meta_PS2_GBTS, /* Pop'n'Music 9 Audio File */
|
||||
meta_STS_WII, /* Shikigami No Shiro 3 STS Audio File */
|
||||
meta_PS2_P2BT, /* Pop'n'Music 7 Audio File */
|
||||
meta_PS2_GBTS, /* Pop'n'Music 9 Audio File */
|
||||
meta_NGC_DSP_IADP, /* Gamecube Interleave DSP */
|
||||
meta_PS2_TK5, /* Tekken 5 Stream Files */
|
||||
meta_WII_STR, /* House of The Dead Overkill STR+STH */
|
||||
meta_PS2_MCG, /* Gunvari MCG Files (was name .GCM on disk) */
|
||||
meta_PS2_TK5, /* Tekken 5 Stream Files */
|
||||
meta_WII_STR, /* House of The Dead Overkill STR+STH */
|
||||
meta_PS2_MCG, /* Gunvari MCG Files (was name .GCM on disk) */
|
||||
meta_ZSD, /* Dragon Booster ZSD */
|
||||
meta_RedSpark, /* "RedSpark" RSD (MadWorld) */
|
||||
meta_PC_IVAUD, /* .ivaud GTA IV */
|
||||
meta_NDS_HWAS, /* Spider-Man 3, Tony Hawk's Downhill Jam, possibly more... */
|
||||
meta_NGC_LPS, /* Rave Master (Groove Adventure Rave)(GC) */
|
||||
meta_NAOMI_ADPCM, /* NAOMI/NAOMI2 ARcade games */
|
||||
meta_SD9, /* beatmaniaIIDX16 - EMPRESS (Arcade) */
|
||||
meta_2DX9, /* beatmaniaIIDX16 - EMPRESS (Arcade) */
|
||||
meta_PC_IVAUD, /* .ivaud GTA IV */
|
||||
meta_NDS_HWAS, /* Spider-Man 3, Tony Hawk's Downhill Jam, possibly more... */
|
||||
meta_NGC_LPS, /* Rave Master (Groove Adventure Rave)(GC) */
|
||||
meta_NAOMI_ADPCM, /* NAOMI/NAOMI2 ARcade games */
|
||||
meta_SD9, /* beatmaniaIIDX16 - EMPRESS (Arcade) */
|
||||
meta_2DX9, /* beatmaniaIIDX16 - EMPRESS (Arcade) */
|
||||
meta_PS2_VGV, /* Rune: Viking Warlord */
|
||||
meta_NGC_GCUB, /* Sega Soccer Slam */
|
||||
meta_MAXIS_XA, /* Sim City 3000 (PC) */
|
||||
@ -517,9 +506,9 @@ typedef enum {
|
||||
meta_PONA_3DO, /* Policenauts (3DO) */
|
||||
meta_PONA_PSX, /* Policenauts (PSX) */
|
||||
meta_XBOX_HLWAV, /* Half Life 2 (XBOX) */
|
||||
meta_PS2_AST, /* Some KOEI game (PS2) */
|
||||
meta_DMSG, /* Nightcaster II - Equinox (XBOX) */
|
||||
meta_NGC_DSP_AAAP, /* Turok: Evolution (NGC), Vexx (NGC) */
|
||||
meta_PS2_AST, /* Some KOEI game (PS2) */
|
||||
meta_DMSG, /* Nightcaster II - Equinox (XBOX) */
|
||||
meta_NGC_DSP_AAAP, /* Turok: Evolution (NGC), Vexx (NGC) */
|
||||
meta_PS2_STER, /* Juuni Kokuki: Kakukaku Taru Ou Michi Beni Midori no Uka */
|
||||
meta_PS2_WB, /* Shooting Love. ~TRIZEAL~ */
|
||||
meta_S14, /* raw Siren 14, 24kbit mono */
|
||||
@ -531,7 +520,7 @@ typedef enum {
|
||||
meta_PS2_KHV, /* Kingdom Hearts 2 VAG streams */
|
||||
meta_PC_SMP, /* Ghostbusters PC .smp */
|
||||
meta_P3D, /* Prototype P3D */
|
||||
meta_PS2_TK1, /* Tekken (NamCollection) */
|
||||
meta_PS2_TK1, /* Tekken (NamCollection) */
|
||||
meta_PS2_ADSC, /* Kenka Bancho 2: Full Throttle */
|
||||
meta_NGC_BO2, /* Blood Omen 2 (NGC) */
|
||||
meta_DSP_DDSP, /* Various (2 dsp files stuck together */
|
||||
@ -544,17 +533,17 @@ typedef enum {
|
||||
meta_DSP_XIII, /* XIII, possibly more (Ubisoft header???) */
|
||||
meta_DSP_CABELAS, /* Cabelas games */
|
||||
meta_PS2_ADM, /* Dragon Quest 5 */
|
||||
meta_PS2_LPCM, /* Ah! My Goddess */
|
||||
meta_PS2_LPCM, /* Ah! My Goddess */
|
||||
meta_DSP_BDSP, /* Ah! My Goddess */
|
||||
meta_PS2_VMS, /* Autobahn Raser - Police Madness */
|
||||
meta_PS2_XAU, // Spectral Force Chronicle
|
||||
meta_PS2_VMS, /* Autobahn Raser - Police Madness */
|
||||
meta_PS2_XAU, /* Spectral Force Chronicle */
|
||||
meta_GH3_BAR, /* Guitar Hero III Mobile .bar */
|
||||
meta_FFW, /* Freedom Fighters [NGC] */
|
||||
meta_DSP_DSPW, /* Sengoku Basara 3 [WII] */
|
||||
meta_PS2_JSTM, /* Tantei Jinguji Saburo - Kind of Blue (PS2) */
|
||||
meta_SQEX_SCD, /* Square-Enix SCD */
|
||||
meta_SQEX_SCD, /* Square-Enix SCD */
|
||||
meta_NGC_NST_DSP, /* Animaniacs [NGC] */
|
||||
meta_BAF, /* .baf (Blur) */
|
||||
meta_BAF, /* Bizarre Creations (Blur, James Bond) */
|
||||
meta_PS3_XVAG, /* Ratchet & Clank Future: Quest for Booty (PS3) */
|
||||
meta_PS3_CPS, /* Eternal Sonata (PS3) */
|
||||
meta_PS3_MSF, /* MSF header */
|
||||
@ -563,13 +552,13 @@ typedef enum {
|
||||
meta_PS3_SGDX, /* Folklore, Genji, Tokyo Jungle (PS3), Brave Story, Kurohyo (PSP) */
|
||||
meta_NGCA, /* GoldenEye 007 (Wii) */
|
||||
meta_WII_RAS, /* Donkey Kong Country Returns (Wii) */
|
||||
meta_PS2_SPM, /* Lethal Skies Elite Pilot: Team SW */
|
||||
meta_PS2_SPM, /* Lethal Skies Elite Pilot: Team SW */
|
||||
meta_X360_TRA, /* Def Jam Rapstar */
|
||||
meta_PS2_VGS, // Princess Soft PS2 games
|
||||
meta_PS2_IAB, // Ueki no Housoku - Taosu ze Robert Juudan!! (PS2)
|
||||
meta_PS2_STRLR,
|
||||
meta_PS2_VGS, /* Princess Soft PS2 games */
|
||||
meta_PS2_IAB, /* Ueki no Housoku - Taosu ze Robert Juudan!! (PS2) */
|
||||
meta_PS2_STRLR, /* The Bouncer */
|
||||
meta_LSF_N1NJ4N, /* .lsf n1nj4n Fastlane Street Racing (iPhone) */
|
||||
meta_PS3_VAWX, // No More Heroes: Heroes Paradise (PS3)
|
||||
meta_VAWX, /* feelplus: No More Heroes Heroes Paradise, Moon Diver */
|
||||
meta_PC_SNDS, // Incredibles PC .snds
|
||||
meta_PS2_WMUS, // The Warriors (PS2)
|
||||
meta_HYPERSCAN_KVAG, // Hyperscan KVAG/BVG
|
||||
@ -584,28 +573,45 @@ typedef enum {
|
||||
meta_TUN, // LEGO Racers (PC)
|
||||
meta_WPD, // Shuffle! (PC)
|
||||
meta_MN_STR, // Mini Ninjas (PC/PS3/WII)
|
||||
meta_PS2_MSS, // ShellShock Nam '67 (PS2)
|
||||
meta_PS2_MSS, // Guerilla: ShellShock Nam '67, Killzone (PS2)
|
||||
meta_PS2_HSF, // Lowrider (PS2)
|
||||
meta_PS3_IVAG, // Interleaved VAG files (PS3)
|
||||
meta_PS2_2PFS, // Mahoromatic: Moetto - KiraKira Maid-San (PS2)
|
||||
meta_PS2_VBK,
|
||||
meta_OTM, // Otomedius (Arcade)
|
||||
meta_CSTM, // Nintendo 3DS CSTM
|
||||
meta_FSTM, // Nintendo Wii U FSTM
|
||||
meta_3DS_IDSP, // Nintendo 3DS IDSP
|
||||
meta_G1L, // Tecmo Koei G1L
|
||||
meta_MCA, // Capcom MCA "MADP"
|
||||
meta_XB3D_ADX, // Xenoblade Chronicles 3D ADX
|
||||
meta_HCA, /* CRI HCA */
|
||||
meta_PS2_SVAG_SNK, /* SNK PS2 SVAG */
|
||||
#ifdef VGM_USE_FFMPEG
|
||||
meta_FFmpeg,
|
||||
meta_PS2_2PFS, // Konami: Mahoromatic: Moetto - KiraKira Maid-San, GANTZ (PS2)
|
||||
meta_PS2_VBK, // Disney's Stitch - Experiment 626
|
||||
meta_OTM, // Otomedius (Arcade)
|
||||
meta_CSTM, // Nintendo 3DS CSTM
|
||||
meta_FSTM, // Nintendo Wii U FSTM
|
||||
meta_3DS_IDSP, // Nintendo 3DS IDSP
|
||||
meta_G1L, // Tecmo Koei G1L
|
||||
meta_MCA, // Capcom MCA "MADP"
|
||||
meta_XB3D_ADX, // Xenoblade Chronicles 3D ADX
|
||||
meta_HCA, /* CRI HCA */
|
||||
meta_PS2_SVAG_SNK, /* SNK PS2 SVAG */
|
||||
meta_PS2_VDS_VDM, /* Graffiti Kingdom */
|
||||
meta_X360_CXS, /* Eternal Sonata (Xbox 360) */
|
||||
|
||||
#ifdef VGM_USE_VORBIS
|
||||
meta_OGG_VORBIS, /* Ogg Vorbis */
|
||||
meta_OGG_SLI, /* Ogg Vorbis file w/ companion .sli for looping */
|
||||
meta_OGG_SLI2, /* Ogg Vorbis file w/ different styled .sli for looping */
|
||||
meta_OGG_SFL, /* Ogg Vorbis file w/ .sfl (RIFF SFPL) for looping */
|
||||
meta_OGG_UM3, /* Ogg Vorbis with first 0x800 bytes XOR 0xFF */
|
||||
meta_OGG_KOVS, /* Ogg Vorbis with exta header and 0x100 bytes XOR */
|
||||
meta_OGG_PSYCH, /* Ogg Vorbis with all bytes -0x23*/
|
||||
#endif
|
||||
#ifdef VGM_USE_MPEG
|
||||
meta_AHX, /* CRI AHX header (same structure as ADX) */
|
||||
#endif
|
||||
#ifdef VGM_USE_MP4V2
|
||||
meta_MP4,
|
||||
meta_MP4, /* AAC (iOS) */
|
||||
#endif
|
||||
#ifdef VGM_USE_FFMPEG
|
||||
meta_FFmpeg,
|
||||
#endif
|
||||
} meta_t;
|
||||
|
||||
|
||||
/* info for a single vgmstream channel */
|
||||
typedef struct {
|
||||
STREAMFILE * streamfile; /* file used by this channel */
|
||||
off_t channel_start_offset; /* where data for this channel begins */
|
||||
@ -642,13 +648,8 @@ typedef struct {
|
||||
int adpcm_step_index; /* for IMA */
|
||||
int adpcm_scale; /* for MS ADPCM */
|
||||
|
||||
struct g72x_state g72x_state; /* state for G.721 decoder, sort of big but we
|
||||
might as well keep it around */
|
||||
|
||||
#ifdef DEBUG
|
||||
int samples_done;
|
||||
int16_t loop_history1,loop_history2;
|
||||
#endif
|
||||
/* state for G.721 decoder, sort of big but we might as well keep it around */
|
||||
struct g72x_state g72x_state;
|
||||
|
||||
/* ADX encryption */
|
||||
int adx_channels;
|
||||
@ -664,6 +665,7 @@ typedef struct {
|
||||
uint16_t key_xor;
|
||||
} VGMSTREAMCHANNEL;
|
||||
|
||||
/* main vgmstream info */
|
||||
typedef struct {
|
||||
/* basics */
|
||||
int32_t num_samples; /* the actual number of samples in this stream */
|
||||
@ -701,28 +703,28 @@ typedef struct {
|
||||
|
||||
/* 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 */
|
||||
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 */
|
||||
|
||||
uint8_t xa_channel; /* Selected XA Channel */
|
||||
int32_t xa_sector_length; /* XA block */
|
||||
uint8_t xa_headerless; /* headerless XA block */
|
||||
int8_t get_high_nibble;
|
||||
/* decoder specific */
|
||||
uint8_t xa_channel; /* XA ADPCM: selected channel */
|
||||
int32_t xa_sector_length; /* XA ADPCM: XA block */
|
||||
uint8_t xa_headerless; /* XA ADPCM: headerless XA block */
|
||||
|
||||
uint8_t ea_big_endian; /* Big Endian ? */
|
||||
uint8_t ea_compression_type;
|
||||
uint8_t ea_compression_version;
|
||||
int8_t get_high_nibble; /* ADPCM: which nibble (XA, IMA, EA) */
|
||||
|
||||
uint8_t ea_big_endian; /* EA ADPCM stuff */
|
||||
uint8_t ea_compression_type;
|
||||
uint8_t ea_compression_version;
|
||||
uint8_t ea_platform;
|
||||
|
||||
int32_t ws_output_size; /* output bytes for this block */
|
||||
int32_t ws_output_size; /* WS ADPCM: output bytes for this block */
|
||||
|
||||
void * start_vgmstream; /* a copy of the VGMSTREAM as it was at the beginning of the stream */
|
||||
int32_t thpNextFrameSize; /* THP */
|
||||
|
||||
int32_t thpNextFrameSize;
|
||||
|
||||
int skip_last_channel;
|
||||
void * start_vgmstream; /* a copy of the VGMSTREAM as it was at the beginning of the stream (for AAX/AIX/SCD) */
|
||||
|
||||
/* Data the codec needs for the whole stream. This is for codecs too
|
||||
* different from vgmstream's structure to be reasonably shoehorned into
|
||||
@ -744,7 +746,6 @@ typedef struct {
|
||||
void (*decryption_callback)(void *ptr, size_t size, size_t nmemb, void *datasource, int bytes_read);
|
||||
uint8_t scd_xor;
|
||||
off_t scd_xor_length;
|
||||
|
||||
} ogg_vorbis_streamfile;
|
||||
|
||||
typedef struct {
|
||||
@ -759,6 +760,7 @@ typedef struct {
|
||||
#define AHX_EXPECTED_FRAME_SIZE 0x414
|
||||
/* MPEG_BUFFER_SIZE should be >= AHX_EXPECTED_FRAME_SIZE */
|
||||
#define MPEG_BUFFER_SIZE 0x1000
|
||||
|
||||
typedef struct {
|
||||
uint8_t buffer[MPEG_BUFFER_SIZE];
|
||||
int buffer_used;
|
||||
@ -791,8 +793,7 @@ typedef struct {
|
||||
} maiatrac3plus_codec_data;
|
||||
#endif
|
||||
|
||||
/* with one file this is also used for just
|
||||
ACM */
|
||||
/* with one file this is also used for just ACM */
|
||||
typedef struct {
|
||||
int file_count;
|
||||
int current_file;
|
||||
@ -835,6 +836,7 @@ typedef struct {
|
||||
NWAData *nwa;
|
||||
} nwa_codec_data;
|
||||
|
||||
/* SQEX SCD interleaved */
|
||||
typedef struct {
|
||||
int substream_count;
|
||||
VGMSTREAM **substreams;
|
||||
@ -927,6 +929,11 @@ typedef struct {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------*/
|
||||
/* vgmstream "public" API */
|
||||
/* -------------------------------------------------------------------------*/
|
||||
|
||||
/* do format detection, return pointer to a usable VGMSTREAM, or NULL on failure */
|
||||
VGMSTREAM * init_vgmstream(const char * const filename);
|
||||
|
||||
@ -935,10 +942,7 @@ VGMSTREAM * init_vgmstream_from_STREAMFILE(STREAMFILE *streamFile);
|
||||
/* reset a VGMSTREAM to start of stream */
|
||||
void reset_vgmstream(VGMSTREAM * vgmstream);
|
||||
|
||||
/* allocate a VGMSTREAM and channel stuff */
|
||||
VGMSTREAM * allocate_vgmstream(int channel_count, int looped);
|
||||
|
||||
/* deallocate, close, etc. */
|
||||
/* close an open vgmstream */
|
||||
void close_vgmstream(VGMSTREAM * vgmstream);
|
||||
|
||||
/* calculate the number of samples to be played based on looping parameters */
|
||||
@ -947,6 +951,21 @@ int32_t get_vgmstream_play_samples(double looptimes, double fadeseconds, double
|
||||
/* render! */
|
||||
void render_vgmstream(sample * buffer, int32_t sample_count, VGMSTREAM * vgmstream);
|
||||
|
||||
/* 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 */
|
||||
void describe_vgmstream(VGMSTREAM * vgmstream, char * desc, int length);
|
||||
|
||||
/* Return the average bitrate in bps of all unique files contained within this
|
||||
* stream. Compares files by absolute paths. */
|
||||
int get_vgmstream_average_bitrate(VGMSTREAM * vgmstream);
|
||||
|
||||
/* -------------------------------------------------------------------------*/
|
||||
/* vgmstream "private" API */
|
||||
/* -------------------------------------------------------------------------*/
|
||||
|
||||
/* allocate a VGMSTREAM and channel stuff */
|
||||
VGMSTREAM * allocate_vgmstream(int channel_count, int looped);
|
||||
|
||||
/* smallest self-contained group of samples is a frame */
|
||||
int get_vgmstream_samples_per_frame(VGMSTREAM * vgmstream);
|
||||
/* number of bytes per frame */
|
||||
@ -970,19 +989,9 @@ int vgmstream_samples_to_do(int samples_this_block, int samples_per_frame, VGMST
|
||||
* Returns 1 if loop was done. */
|
||||
int vgmstream_do_loop(VGMSTREAM * vgmstream);
|
||||
|
||||
/* 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
|
||||
*/
|
||||
void describe_vgmstream(VGMSTREAM * vgmstream, char * desc, int length);
|
||||
|
||||
/* 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. */
|
||||
* If a suitable file is found, open it and change opened_stream to a stereo stream. */
|
||||
void try_dual_file_stereo(VGMSTREAM * opened_stream, STREAMFILE *streamFile);
|
||||
|
||||
/* Return the average bitrate in bps of all unique files contained within this
|
||||
* stream. Compares files by absolute paths. */
|
||||
int get_vgmstream_average_bitrate(VGMSTREAM * vgmstream);
|
||||
|
||||
#endif
|
||||
|
@ -1,7 +1,7 @@
|
||||
# optional parts
|
||||
VGM_ENABLE_FFMPEG=1
|
||||
ifeq ($(VGM_ENABLE_FFMPEG),1)
|
||||
FFMPEG_CC=-DVGM_USE_FFMPEG -DVGM_USE_FFMPEG_ACCURATE_LOOPING
|
||||
FFMPEG_CC=-DVGM_USE_FFMPEG
|
||||
FFMPEG_LD=-lavcodec -lavformat -lavutil
|
||||
endif
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
# optional parts
|
||||
VGM_ENABLE_FFMPEG=1
|
||||
ifeq ($(VGM_ENABLE_FFMPEG),1)
|
||||
FFMPEG_CC=-DVGM_USE_FFMPEG -DVGM_USE_FFMPEG_ACCURATE_LOOPING
|
||||
FFMPEG_CC=-DVGM_USE_FFMPEG
|
||||
FFMPEG_LD=-lavcodec -lavformat -lavutil
|
||||
endif
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
# optional parts
|
||||
VGM_ENABLE_FFMPEG=1
|
||||
ifeq ($(VGM_ENABLE_FFMPEG),1)
|
||||
FFMPEG_CC=-DVGM_USE_FFMPEG -DVGM_USE_FFMPEG_ACCURATE_LOOPING
|
||||
FFMPEG_CC=-DVGM_USE_FFMPEG
|
||||
FFMPEG_LD=-lavcodec -lavformat -lavutil
|
||||
endif
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user