mirror of
https://github.com/vgmstream/vgmstream.git
synced 2025-01-18 07:44:43 +01:00
adding svag support - fixing implicit warning on vs2005 for ps2_xxx functions
git-svn-id: https://vgmstream.svn.sourceforge.net/svnroot/vgmstream@114 51a99a44-fe44-0410-b1ba-c3e57ba2b86b
This commit is contained in:
parent
b97479a9d7
commit
b1aaf2ba85
@ -51,6 +51,8 @@ File types supported by this version of vgmstream:
|
||||
- .xa (CD-ROM XA audio)
|
||||
- .rxw (PSX ADPCM)
|
||||
- .int (16 bit PCM)
|
||||
- .sts (PSX ADPCM)
|
||||
- .svag (PSX ADPCM)
|
||||
|
||||
Enjoy!
|
||||
-hcs
|
||||
|
@ -34,7 +34,8 @@ META_OBJS=meta/adx_header.o \
|
||||
meta/psx_cdxa.o \
|
||||
meta/ps2_rxw.o \
|
||||
meta/ps2_int.o \
|
||||
meta/ps2_exst.o
|
||||
meta/ps2_exst.o \
|
||||
meta/ps2_svag.o
|
||||
|
||||
OBJECTS=vgmstream.o streamfile.o util.o $(CODING_OBJS) $(LAYOUT_OBJS) $(META_OBJS)
|
||||
|
||||
|
@ -16,15 +16,22 @@ void decode_psx(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing,
|
||||
short scale;
|
||||
int i;
|
||||
int32_t sample_count;
|
||||
uint8_t flag;
|
||||
|
||||
int framesin = first_sample/28;
|
||||
|
||||
predict_nr = read_8bit(stream->offset+framesin*16,stream->streamfile) >> 4;
|
||||
shift_factor = read_8bit(stream->offset+framesin*16,stream->streamfile) & 0xf;
|
||||
flag = read_8bit(stream->offset+framesin*16+1,stream->streamfile);
|
||||
|
||||
first_sample = first_sample % 28;
|
||||
|
||||
for (i=first_sample,sample_count=0; i<first_sample+samples_to_do; i++,sample_count+=channelspacing) {
|
||||
|
||||
sample=0;
|
||||
|
||||
if(flag!=0x07) {
|
||||
|
||||
short sample_byte = (short)read_8bit(stream->offset+(framesin*16)+2+i/2,stream->streamfile);
|
||||
|
||||
scale = ((i&1 ?
|
||||
@ -32,8 +39,9 @@ void decode_psx(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing,
|
||||
sample_byte & 0x0f)<<12);
|
||||
|
||||
sample=(int)((scale >> shift_factor)+hist1*VAG_f[predict_nr][0]+hist2*VAG_f[predict_nr][1]);
|
||||
outbuf[sample_count] = clamp16(sample);
|
||||
}
|
||||
|
||||
outbuf[sample_count] = clamp16(sample);
|
||||
hist2=hist1;
|
||||
hist1=sample;
|
||||
}
|
||||
|
@ -262,6 +262,10 @@
|
||||
RelativePath=".\meta\ps2_rxw.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\meta\ps2_svag.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\meta\psx_cdxa.c"
|
||||
>
|
||||
|
@ -45,4 +45,6 @@ VGMSTREAM * init_vgmstream_ps2_int(const char * const filename);
|
||||
|
||||
VGMSTREAM * init_vgmstream_ps2_exst(const char * const filename);
|
||||
|
||||
VGMSTREAM * init_vgmstream_ps2_svag(const char * const filename);
|
||||
|
||||
#endif
|
||||
|
@ -79,7 +79,7 @@ VGMSTREAM * init_vgmstream_ps2_ads(const char * const filename) {
|
||||
|
||||
vgmstream->ch[i].channel_start_offset=
|
||||
vgmstream->ch[i].offset=
|
||||
0x28+vgmstream->interleave_block_size*i;
|
||||
(off_t)(0x28+vgmstream->interleave_block_size*i);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -71,7 +71,7 @@ VGMSTREAM * init_vgmstream_ps2_exst(const char * const filename) {
|
||||
|
||||
vgmstream->ch[i].channel_start_offset=
|
||||
vgmstream->ch[i].offset=
|
||||
0x800+vgmstream->interleave_block_size*i;
|
||||
(off_t)(0x800+vgmstream->interleave_block_size*i);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -34,7 +34,7 @@ VGMSTREAM * init_vgmstream_ps2_int(const char * const filename) {
|
||||
vgmstream->channels = 2;
|
||||
vgmstream->sample_rate = 48000;
|
||||
vgmstream->coding_type = coding_PCM16LE;
|
||||
vgmstream->num_samples = get_streamfile_size(infile)/4;
|
||||
vgmstream->num_samples = (int32_t)(get_streamfile_size(infile)/4);
|
||||
vgmstream->interleave_block_size = 0x200;
|
||||
vgmstream->layout_type = layout_interleave;
|
||||
vgmstream->meta_type = meta_PS2_RAW;
|
||||
|
@ -62,7 +62,7 @@ VGMSTREAM * init_vgmstream_ps2_npsf(const char * const filename) {
|
||||
|
||||
vgmstream->ch[i].channel_start_offset=
|
||||
vgmstream->ch[i].offset=
|
||||
start_offset+vgmstream->interleave_block_size*i;
|
||||
(off_t)(start_offset+vgmstream->interleave_block_size*i);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -64,7 +64,7 @@ VGMSTREAM * init_vgmstream_ps2_rxw(const char * const filename) {
|
||||
|
||||
vgmstream->ch[i].channel_start_offset=
|
||||
vgmstream->ch[i].offset=
|
||||
start_offset+vgmstream->interleave_block_size*i;
|
||||
(off_t)(start_offset+vgmstream->interleave_block_size*i);
|
||||
}
|
||||
}
|
||||
|
||||
|
88
src/meta/ps2_svag.c
Normal file
88
src/meta/ps2_svag.c
Normal file
@ -0,0 +1,88 @@
|
||||
#include "meta.h"
|
||||
#include "../util.h"
|
||||
|
||||
/* SVAG
|
||||
|
||||
PS2 SVAG format is an interleaved format found in many konami Games
|
||||
The header start with a Svag id and have the sentence :
|
||||
"ALL RIGHTS RESERVED.KONAMITYO Sound Design Dept. "
|
||||
or "ALL RIGHTS RESERVED.KCE-Tokyo Sound Design Dept. "
|
||||
|
||||
2008-05-13 - Fastelbja : First version ...
|
||||
Thx to HCS for his awesome work on shortblock interleave
|
||||
*/
|
||||
|
||||
VGMSTREAM * init_vgmstream_ps2_svag(const char * const filename) {
|
||||
VGMSTREAM * vgmstream = NULL;
|
||||
STREAMFILE * infile = NULL;
|
||||
|
||||
int loop_flag=0;
|
||||
int channel_count;
|
||||
int i;
|
||||
|
||||
/* check extension, case insensitive */
|
||||
if (strcasecmp("svag",filename_extension(filename))) goto fail;
|
||||
|
||||
/* try to open the file for header reading */
|
||||
infile = open_streamfile(filename);
|
||||
if (!infile) goto fail;
|
||||
|
||||
/* check SVAG Header */
|
||||
if (read_32bitBE(0x00,infile) != 0x53766167)
|
||||
goto fail;
|
||||
|
||||
/* check loop */
|
||||
loop_flag = (read_32bitLE(0x14,infile)==1);
|
||||
|
||||
channel_count=read_16bitLE(0x0C,infile);
|
||||
|
||||
/* build the VGMSTREAM */
|
||||
vgmstream = allocate_vgmstream(channel_count,loop_flag);
|
||||
if (!vgmstream) goto fail;
|
||||
|
||||
/* fill in the vital statistics */
|
||||
vgmstream->channels = read_16bitLE(0x0C,infile);
|
||||
vgmstream->sample_rate = read_32bitLE(0x08,infile);
|
||||
|
||||
/* Compression Scheme */
|
||||
vgmstream->coding_type = coding_PSX;
|
||||
vgmstream->num_samples = read_32bitLE(0x04,infile)/16*28/vgmstream->channels;
|
||||
|
||||
/* Get loop point values */
|
||||
if(vgmstream->loop_flag) {
|
||||
vgmstream->loop_start_sample = read_32bitLE(0x18,infile)/16*28;
|
||||
vgmstream->loop_end_sample = read_32bitLE(0x04,infile)/16*28/vgmstream->channels;
|
||||
}
|
||||
|
||||
vgmstream->interleave_block_size = read_32bitLE(0x10,infile);
|
||||
|
||||
/* There's no value on header to get the smallblock_size length */
|
||||
/* so we add to calculate it based upon the file length, which can broke things */
|
||||
/* with bad ripped stuff ... */
|
||||
vgmstream->interleave_smallblock_size = ((get_streamfile_size(infile)-0x800)%(2*vgmstream->interleave_block_size))/2;
|
||||
vgmstream->layout_type = layout_interleave_shortblock;
|
||||
vgmstream->meta_type = meta_PS2_SVAG;
|
||||
|
||||
close_streamfile(infile); infile=NULL;
|
||||
|
||||
/* open the file for reading by each channel */
|
||||
{
|
||||
for (i=0;i<channel_count;i++) {
|
||||
vgmstream->ch[i].streamfile = open_streamfile_buffer(filename,0x8000);
|
||||
|
||||
if (!vgmstream->ch[i].streamfile) goto fail;
|
||||
|
||||
vgmstream->ch[i].channel_start_offset=
|
||||
vgmstream->ch[i].offset=
|
||||
(off_t)(0x800+vgmstream->interleave_block_size*i);
|
||||
}
|
||||
}
|
||||
|
||||
return vgmstream;
|
||||
|
||||
/* clean up anything we may have opened */
|
||||
fail:
|
||||
if (infile) close_streamfile(infile);
|
||||
if (vgmstream) close_vgmstream(vgmstream);
|
||||
return NULL;
|
||||
}
|
@ -15,7 +15,7 @@
|
||||
* List of functions that will recognize files. These should correspond pretty
|
||||
* directly to the metadata types
|
||||
*/
|
||||
#define INIT_VGMSTREAM_FCNS 21
|
||||
#define INIT_VGMSTREAM_FCNS 22
|
||||
VGMSTREAM * (*init_vgmstream_fcns[INIT_VGMSTREAM_FCNS])(const char * const) = {
|
||||
init_vgmstream_adx, /* 0 */
|
||||
init_vgmstream_brstm, /* 1 */
|
||||
@ -38,6 +38,7 @@ VGMSTREAM * (*init_vgmstream_fcns[INIT_VGMSTREAM_FCNS])(const char * const) = {
|
||||
init_vgmstream_ps2_int, /* 18 */
|
||||
init_vgmstream_ngc_dsp_stm, /* 19 */
|
||||
init_vgmstream_ps2_exst, /* 20 */
|
||||
init_vgmstream_ps2_svag, /* 21 */
|
||||
};
|
||||
|
||||
|
||||
@ -602,6 +603,9 @@ void describe_vgmstream(VGMSTREAM * vgmstream, char * desc, int length) {
|
||||
case meta_PS2_EXST:
|
||||
snprintf(temp,TEMPSIZE,"EXST File (Shadow of the Colossus)");
|
||||
break;
|
||||
case meta_PS2_SVAG:
|
||||
snprintf(temp,TEMPSIZE,"Konami SVAG Audio File");
|
||||
break;
|
||||
default:
|
||||
snprintf(temp,TEMPSIZE,"THEY SHOULD HAVE SENT A POET");
|
||||
}
|
||||
|
@ -79,6 +79,8 @@ typedef enum {
|
||||
meta_PS2_RXW, /* Sony Arc The Lad Sound File */
|
||||
meta_PS2_RAW, /* RAW Interleaved Format */
|
||||
meta_PS2_EXST, /* Shadow of Colossus EXST */
|
||||
meta_PS2_SVAG, /* Konami SVAG */
|
||||
|
||||
meta_PSX_XA, /* CD-XA with RIFF header */
|
||||
|
||||
} meta_t;
|
||||
|
@ -45,7 +45,7 @@ int fade_samples = 0;
|
||||
|
||||
#define EXTENSION_LIST_SIZE 1024
|
||||
char working_extension_list[EXTENSION_LIST_SIZE] = {0};
|
||||
#define EXTENSION_COUNT 19
|
||||
#define EXTENSION_COUNT 20
|
||||
char * extension_list[EXTENSION_COUNT] = {
|
||||
"adx\0ADX Audio File (*.ADX)\0",
|
||||
"afc\0AFC Audio File (*.AFC)\0",
|
||||
@ -66,6 +66,7 @@ char * extension_list[EXTENSION_COUNT] = {
|
||||
"rxw\0PS2 RXWS File (*.RXW)\0",
|
||||
"int\0PS2 RAW Interleaved PCM (*.INT)\0",
|
||||
"sts\0PS2 EXST Audio File (*.STS)\0",
|
||||
"svag\0PS2 SVAG Audio File (*.SVAG)\0",
|
||||
};
|
||||
|
||||
/* stubs, we don't do anything fancy yet */
|
||||
|
Loading…
x
Reference in New Issue
Block a user