mirror of
https://github.com/vgmstream/vgmstream.git
synced 2024-12-01 01:27:20 +01:00
fix multi channels (>2)
fix loopEnd point when there's empty rows on file still need some tests git-svn-id: https://vgmstream.svn.sourceforge.net/svnroot/vgmstream@675 51a99a44-fe44-0410-b1ba-c3e57ba2b86b
This commit is contained in:
parent
7541c76985
commit
6d478b33a8
@ -60,6 +60,7 @@ VGMSTREAM * init_vgmstream_ps2_mib(STREAMFILE *streamFile) {
|
|||||||
|
|
||||||
int loopToEnd=0;
|
int loopToEnd=0;
|
||||||
int forceNoLoop=0;
|
int forceNoLoop=0;
|
||||||
|
int gotEmptyLine=0;
|
||||||
|
|
||||||
uint8_t gotMIH=0;
|
uint8_t gotMIH=0;
|
||||||
|
|
||||||
@ -99,21 +100,24 @@ VGMSTREAM * init_vgmstream_ps2_mib(STREAMFILE *streamFile) {
|
|||||||
if(readOffset<(int32_t)(fileLength*0.5)) {
|
if(readOffset<(int32_t)(fileLength*0.5)) {
|
||||||
|
|
||||||
if(memcmp(testBuffer+2, mibBuffer+2,0x0e)) {
|
if(memcmp(testBuffer+2, mibBuffer+2,0x0e)) {
|
||||||
bDoUpdateInterleave=1;
|
|
||||||
if(doChannelUpdate) {
|
if(doChannelUpdate) {
|
||||||
doChannelUpdate=0;
|
doChannelUpdate=0;
|
||||||
channel_count++;
|
channel_count++;
|
||||||
}
|
}
|
||||||
|
if(channel_count<2)
|
||||||
|
bDoUpdateInterleave=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
testBuffer[0]=0;
|
testBuffer[0]=0;
|
||||||
if(!memcmp(testBuffer,mibBuffer,0x10)) {
|
if(!memcmp(testBuffer,mibBuffer,0x10)) {
|
||||||
|
|
||||||
|
gotEmptyLine=1;
|
||||||
|
|
||||||
if(bDoUpdateInterleave) {
|
if(bDoUpdateInterleave) {
|
||||||
bDoUpdateInterleave=0;
|
bDoUpdateInterleave=0;
|
||||||
interleave=readOffset-0x10;
|
interleave=readOffset-0x10;
|
||||||
}
|
}
|
||||||
if(((readOffset-0x10)==channel_count*interleave) && (channel_count!=1)) {
|
if(((readOffset-0x10)==(channel_count*interleave))) {
|
||||||
doChannelUpdate=1;
|
doChannelUpdate=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -213,12 +217,32 @@ VGMSTREAM * init_vgmstream_ps2_mib(STREAMFILE *streamFile) {
|
|||||||
if((interleave>0x10) && (channel_count==1))
|
if((interleave>0x10) && (channel_count==1))
|
||||||
channel_count=2;
|
channel_count=2;
|
||||||
|
|
||||||
|
if(interleave==0) interleave=0x10;
|
||||||
|
|
||||||
|
// further check on channel_count ...
|
||||||
|
if(gotEmptyLine)
|
||||||
|
{
|
||||||
|
int newChannelCount = 0;
|
||||||
|
|
||||||
|
readOffset=0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
newChannelCount++;
|
||||||
|
read_streamfile(testBuffer,readOffset,0x10,streamFile);
|
||||||
|
readOffset+=interleave;
|
||||||
|
} while(!memcmp(testBuffer,mibBuffer,16));
|
||||||
|
|
||||||
|
newChannelCount--;
|
||||||
|
|
||||||
|
if(newChannelCount>channel_count)
|
||||||
|
channel_count=newChannelCount;
|
||||||
|
}
|
||||||
|
|
||||||
/* build the VGMSTREAM */
|
/* build the VGMSTREAM */
|
||||||
vgmstream = allocate_vgmstream(channel_count,(loopEnd!=0));
|
vgmstream = allocate_vgmstream(channel_count,(loopEnd!=0));
|
||||||
if (!vgmstream) goto fail;
|
if (!vgmstream) goto fail;
|
||||||
|
|
||||||
if(interleave==0) interleave=0x10;
|
|
||||||
|
|
||||||
/* fill in the vital statistics */
|
/* fill in the vital statistics */
|
||||||
vgmstream->coding_type = coding_PSX;
|
vgmstream->coding_type = coding_PSX;
|
||||||
vgmstream->layout_type = layout_interleave;
|
vgmstream->layout_type = layout_interleave;
|
||||||
@ -257,7 +281,7 @@ VGMSTREAM * init_vgmstream_ps2_mib(STREAMFILE *streamFile) {
|
|||||||
vgmstream->num_samples = (int32_t)(fileLength/16/channel_count*28);
|
vgmstream->num_samples = (int32_t)(fileLength/16/channel_count*28);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(loopStart!=0) {
|
if(loopEnd!=0) {
|
||||||
if(vgmstream->channels==1) {
|
if(vgmstream->channels==1) {
|
||||||
vgmstream->loop_start_sample = loopStart/16*18;
|
vgmstream->loop_start_sample = loopStart/16*18;
|
||||||
vgmstream->loop_end_sample = loopEnd/16*28;
|
vgmstream->loop_end_sample = loopEnd/16*28;
|
||||||
@ -272,7 +296,7 @@ VGMSTREAM * init_vgmstream_ps2_mib(STREAMFILE *streamFile) {
|
|||||||
|
|
||||||
if(loopEnd=fileLength)
|
if(loopEnd=fileLength)
|
||||||
{
|
{
|
||||||
vgmstream->loop_end_sample=(loopEnd/16*14*channel_count)/channel_count;
|
vgmstream->loop_end_sample=(loopEnd/16*28)/channel_count;
|
||||||
} else {
|
} else {
|
||||||
vgmstream->loop_end_sample = ((((loopEnd/vgmstream->interleave_block_size)-1)*vgmstream->interleave_block_size)/16*14*channel_count)/channel_count;
|
vgmstream->loop_end_sample = ((((loopEnd/vgmstream->interleave_block_size)-1)*vgmstream->interleave_block_size)/16*14*channel_count)/channel_count;
|
||||||
|
|
||||||
@ -284,6 +308,28 @@ VGMSTREAM * init_vgmstream_ps2_mib(STREAMFILE *streamFile) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(loopToEnd)
|
||||||
|
{
|
||||||
|
// try to find if there's no empty line ...
|
||||||
|
int emptySamples=0;
|
||||||
|
|
||||||
|
for(i=0; i<16;i++) {
|
||||||
|
mibBuffer[i]=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
readOffset=fileLength-0x10;
|
||||||
|
|
||||||
|
do {
|
||||||
|
read_streamfile(testBuffer,readOffset,0x10,streamFile);
|
||||||
|
if(!memcmp(mibBuffer,testBuffer,16))
|
||||||
|
{
|
||||||
|
emptySamples+=28;
|
||||||
|
}
|
||||||
|
readOffset-=0x10;
|
||||||
|
} while(!memcmp(testBuffer,mibBuffer,16));
|
||||||
|
|
||||||
|
vgmstream->loop_end_sample-=(emptySamples*channel_count);
|
||||||
|
}
|
||||||
vgmstream->meta_type = meta_PS2_MIB;
|
vgmstream->meta_type = meta_PS2_MIB;
|
||||||
|
|
||||||
if (gotMIH) {
|
if (gotMIH) {
|
||||||
|
Loading…
Reference in New Issue
Block a user