mirror of
https://github.com/vgmstream/vgmstream.git
synced 2025-02-17 19:19:16 +01:00
git-svn-id: https://vgmstream.svn.sourceforge.net/svnroot/vgmstream@435 51a99a44-fe44-0410-b1ba-c3e57ba2b86b
This commit is contained in:
parent
80eba7a0e7
commit
7a12a632cf
@ -9,7 +9,7 @@ void decode_g721(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing,
|
||||
void g72x_init_state(struct g72x_state *state_ptr);
|
||||
|
||||
void decode_nds_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||
void decode_xbox_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel);
|
||||
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_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);
|
||||
|
||||
|
@ -64,7 +64,7 @@ void decode_nds_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspaci
|
||||
stream->adpcm_step_index = step_index;
|
||||
}
|
||||
|
||||
void decode_xbox_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel) {
|
||||
void decode_xbox_ima(VGMSTREAM * vgmstream,VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel) {
|
||||
int i=first_sample;
|
||||
int sample_nibble;
|
||||
int sample_decoded;
|
||||
@ -75,11 +75,17 @@ void decode_xbox_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspac
|
||||
int step_index = stream->adpcm_step_index;
|
||||
off_t offset=stream->offset;
|
||||
|
||||
first_sample = first_sample % 64;
|
||||
first_sample = first_sample % (32*vgmstream->channels);
|
||||
|
||||
if (first_sample == 0) {
|
||||
hist1 = read_16bitLE(offset+channel*4,stream->streamfile);
|
||||
step_index = read_16bitLE(offset+channel*4+2,stream->streamfile);
|
||||
|
||||
if(vgmstream->layout_type==layout_ea_blocked) {
|
||||
hist1 = read_16bitLE(offset,stream->streamfile);
|
||||
step_index = read_16bitLE(offset+2,stream->streamfile);
|
||||
} else {
|
||||
hist1 = read_16bitLE(offset+channel*4,stream->streamfile);
|
||||
step_index = read_16bitLE(offset+channel*4+2,stream->streamfile);
|
||||
}
|
||||
if (step_index < 0) step_index=0;
|
||||
if (step_index > 88) step_index=88;
|
||||
}
|
||||
@ -87,7 +93,10 @@ void decode_xbox_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspac
|
||||
for (i=first_sample,sample_count=0; i<first_sample+samples_to_do; i++,sample_count+=channelspacing) {
|
||||
int step = ADPCMTable[step_index];
|
||||
|
||||
offset = stream->offset + 4*channelspacing + (i/8*4*channelspacing+(i%8)/2+4*channel);
|
||||
if(vgmstream->layout_type==layout_ea_blocked)
|
||||
offset = stream->offset + (i/8*4+(i%8)/2+4);
|
||||
else
|
||||
offset = stream->offset + 4*channelspacing + (i/8*4*channelspacing+(i%8)/2+4*channel);
|
||||
|
||||
sample_nibble = (read_8bit(offset,stream->streamfile) >> (i&1?4:0))&0xf;
|
||||
|
||||
@ -112,9 +121,13 @@ void decode_xbox_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspac
|
||||
}
|
||||
|
||||
// Only increment offset on complete frame
|
||||
if(offset-stream->offset==(32*channelspacing)+(4*channel)+3) // ??
|
||||
stream->offset+=36*channelspacing;
|
||||
|
||||
if(vgmstream->layout_type==layout_ea_blocked) {
|
||||
if(offset-stream->offset==32+3) // ??
|
||||
stream->offset+=36;
|
||||
} else {
|
||||
if(offset-stream->offset==(32*channelspacing)+(4*channel)+3) // ??
|
||||
stream->offset+=36*channelspacing;
|
||||
}
|
||||
stream->adpcm_history1_32=hist1;
|
||||
stream->adpcm_step_index=step_index;
|
||||
}
|
||||
|
@ -35,42 +35,48 @@ void ea_block_update(off_t block_offset, VGMSTREAM * vgmstream) {
|
||||
vgmstream->current_block_size /= 28;
|
||||
|
||||
} else {
|
||||
if(vgmstream->coding_type==coding_PSX) {
|
||||
vgmstream->ch[0].offset=vgmstream->current_block_offset+0x10;
|
||||
vgmstream->ch[1].offset=(read_32bitLE(block_offset+0x04,vgmstream->ch[0].streamfile)-0x10)/vgmstream->channels;
|
||||
vgmstream->ch[1].offset+=vgmstream->ch[0].offset;
|
||||
vgmstream->current_block_size=read_32bitLE(block_offset+0x04,vgmstream->ch[0].streamfile)-0x10;
|
||||
vgmstream->current_block_size/=vgmstream->channels;
|
||||
} else {
|
||||
|
||||
if(vgmstream->coding_type==coding_EA_ADPCM) {
|
||||
switch(vgmstream->coding_type) {
|
||||
case coding_PSX:
|
||||
vgmstream->ch[0].offset=vgmstream->current_block_offset+0x10;
|
||||
vgmstream->ch[1].offset=(read_32bitLE(block_offset+0x04,vgmstream->ch[0].streamfile)-0x10)/vgmstream->channels;
|
||||
vgmstream->ch[1].offset+=vgmstream->ch[0].offset;
|
||||
vgmstream->current_block_size=read_32bitLE(block_offset+0x04,vgmstream->ch[0].streamfile)-0x10;
|
||||
vgmstream->current_block_size/=vgmstream->channels;
|
||||
break;
|
||||
case coding_EA_ADPCM:
|
||||
vgmstream->current_block_size = read_32bitLE(block_offset+4,vgmstream->ch[0].streamfile);
|
||||
for(i=0;i<vgmstream->channels;i++) {
|
||||
vgmstream->ch[i].offset=vgmstream->current_block_offset+0x0C+(4*vgmstream->channels);
|
||||
vgmstream->ch[i].adpcm_history1_32=(uint32_t)read_16bitLE(vgmstream->current_block_offset+0x0c+(i*4),vgmstream->ch[0].streamfile);
|
||||
vgmstream->ch[i].adpcm_history2_32=(uint32_t)read_16bitLE(vgmstream->current_block_offset+0x0e +(i*4),vgmstream->ch[0].streamfile);
|
||||
}
|
||||
} else {
|
||||
if(vgmstream->coding_type==coding_PCM16LE_int) {
|
||||
vgmstream->current_block_size = read_32bitLE(block_offset+4,vgmstream->ch[0].streamfile)-0x0C;
|
||||
for(i=0;i<vgmstream->channels;i++) {
|
||||
vgmstream->ch[i].offset=block_offset+0x0C+(i*2);
|
||||
}
|
||||
vgmstream->current_block_size/=2;
|
||||
vgmstream->current_block_size-=2;
|
||||
} else {
|
||||
vgmstream->current_block_size = read_32bitLE(block_offset+8,vgmstream->ch[0].streamfile);
|
||||
for(i=0;i<vgmstream->channels;i++) {
|
||||
vgmstream->ch[i].offset=read_32bitLE(block_offset+0x0C+(i*4),vgmstream->ch[0].streamfile)+(4*vgmstream->channels);
|
||||
vgmstream->ch[i].offset+=vgmstream->current_block_offset+0x0C;
|
||||
}
|
||||
vgmstream->current_block_size /= 28;
|
||||
break;
|
||||
case coding_PCM16LE_int:
|
||||
vgmstream->current_block_size = read_32bitLE(block_offset+4,vgmstream->ch[0].streamfile)-0x0C;
|
||||
for(i=0;i<vgmstream->channels;i++) {
|
||||
vgmstream->ch[i].offset=block_offset+0x0C+(i*2);
|
||||
}
|
||||
}
|
||||
vgmstream->current_block_size/=2;
|
||||
vgmstream->current_block_size-=2;
|
||||
break;
|
||||
case coding_XBOX:
|
||||
vgmstream->current_block_size = read_32bitLE(block_offset+0x10,vgmstream->ch[0].streamfile);
|
||||
for(i=0;i<vgmstream->channels;i++) {
|
||||
vgmstream->ch[i].offset=read_32bitLE(block_offset+0x0C+(i*4),vgmstream->ch[0].streamfile)+(4*vgmstream->channels);
|
||||
vgmstream->ch[i].offset+=vgmstream->current_block_offset+0x0C;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
vgmstream->current_block_size = read_32bitLE(block_offset+8,vgmstream->ch[0].streamfile);
|
||||
for(i=0;i<vgmstream->channels;i++) {
|
||||
vgmstream->ch[i].offset=read_32bitLE(block_offset+0x0C+(i*4),vgmstream->ch[0].streamfile)+(4*vgmstream->channels);
|
||||
vgmstream->ch[i].offset+=vgmstream->current_block_offset+0x0C;
|
||||
}
|
||||
vgmstream->current_block_size /= 28;
|
||||
}
|
||||
}
|
||||
|
||||
if((vgmstream->ea_compression_version<3) && (vgmstream->coding_type!=coding_PSX) && (vgmstream->coding_type!=coding_EA_ADPCM)) {
|
||||
if((vgmstream->ea_compression_version<3) && (vgmstream->coding_type!=coding_PSX) && (vgmstream->coding_type!=coding_EA_ADPCM) && (vgmstream->coding_type!=coding_XBOX)) {
|
||||
for(i=0;i<vgmstream->channels;i++) {
|
||||
if(vgmstream->ea_big_endian) {
|
||||
vgmstream->ch[i].adpcm_history1_32=read_16bitBE(vgmstream->ch[i].offset,vgmstream->ch[0].streamfile);
|
||||
|
@ -22,6 +22,7 @@
|
||||
#define EA_ADPCM 0x30
|
||||
#define EA_PCM_BE 0x07
|
||||
#define EA_PCM_LE 0x08
|
||||
#define EA_IMA 0x14
|
||||
|
||||
typedef struct {
|
||||
int32_t num_samples;
|
||||
@ -142,6 +143,7 @@ VGMSTREAM * init_vgmstream_ea(STREAMFILE *streamFile) {
|
||||
if (strcasecmp("sng",filename_extension(filename)) &&
|
||||
strcasecmp("asf",filename_extension(filename)) &&
|
||||
strcasecmp("str",filename_extension(filename)) &&
|
||||
strcasecmp("xsf",filename_extension(filename)) &&
|
||||
strcasecmp("eam",filename_extension(filename))) goto fail;
|
||||
|
||||
/* check Header */
|
||||
@ -234,6 +236,11 @@ VGMSTREAM * init_vgmstream_ea(STREAMFILE *streamFile) {
|
||||
vgmstream->coding_type=coding_EA_ADPCM;
|
||||
vgmstream->layout_type=layout_ea_blocked;
|
||||
break;
|
||||
case EA_IMA:
|
||||
vgmstream->meta_type=meta_EA_IMA;
|
||||
vgmstream->coding_type=coding_XBOX;
|
||||
vgmstream->layout_type=layout_ea_blocked;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
@ -535,7 +535,7 @@ int get_vgmstream_samples_per_frame(VGMSTREAM * vgmstream) {
|
||||
case coding_NWA5:
|
||||
return 1;
|
||||
case coding_NDS_IMA:
|
||||
return (vgmstream->interleave_block_size-4)*2;
|
||||
return (vgmstream->interleave_block_size-4)*2;
|
||||
case coding_NGC_DTK:
|
||||
return 28;
|
||||
case coding_G721:
|
||||
@ -730,7 +730,7 @@ void decode_vgmstream(VGMSTREAM * vgmstream, int samples_written, int samples_to
|
||||
break;
|
||||
case coding_XBOX:
|
||||
for (chan=0;chan<vgmstream->channels;chan++) {
|
||||
decode_xbox_ima(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan,
|
||||
decode_xbox_ima(vgmstream,&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan,
|
||||
vgmstream->channels,vgmstream->samples_into_block,
|
||||
samples_to_do,chan);
|
||||
}
|
||||
@ -1466,6 +1466,9 @@ void describe_vgmstream(VGMSTREAM * vgmstream, char * desc, int length) {
|
||||
break;
|
||||
case meta_EA_ADPCM:
|
||||
snprintf(temp,TEMPSIZE,"Electronic Arts XA R1");
|
||||
break;
|
||||
case meta_EA_IMA:
|
||||
snprintf(temp,TEMPSIZE,"Electronic Arts container with IMA blocks");
|
||||
break;
|
||||
case meta_EAXA_PSX:
|
||||
snprintf(temp,TEMPSIZE,"Electronic Arts With PSX ADPCM");
|
||||
|
@ -249,6 +249,7 @@ typedef enum {
|
||||
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_RAW, /* RAW PCM file */
|
||||
|
@ -183,6 +183,7 @@ char * extension_list[] = {
|
||||
"kraw\0KRAW Audio File (*.KRAW)\0",
|
||||
"omu\0OMU Audio File (*.OMU)\0",
|
||||
"xa2\0XA2 Audio File (*.XA2)\0",
|
||||
"xsf\0XSF Audio File (*.XSF)\0",
|
||||
};
|
||||
|
||||
void about(HWND hwndParent) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user