mirror of
https://github.com/vgmstream/vgmstream.git
synced 2024-11-24 23:10:10 +01:00
Fix mono .thp [WarioWare, Inc. Mega Party Game$! (GC)]
This commit is contained in:
parent
bc91258ebf
commit
68b9164d72
@ -2,15 +2,15 @@
|
|||||||
#include "../vgmstream.h"
|
#include "../vgmstream.h"
|
||||||
|
|
||||||
/* set up for the block at the given offset */
|
/* set up for the block at the given offset */
|
||||||
void block_update_thp(off_t block_offset, VGMSTREAM *vgmstream) {
|
void block_update_thp(off_t block_offset, VGMSTREAM* vgmstream) {
|
||||||
int i, j;
|
int i, j;
|
||||||
STREAMFILE *streamFile = vgmstream->ch[0].streamfile;
|
STREAMFILE* sf = vgmstream->ch[0].streamfile;
|
||||||
off_t audio_offset;
|
off_t audio_offset;
|
||||||
size_t next_block_size, video_size;
|
size_t next_block_size, video_size;
|
||||||
|
|
||||||
next_block_size = read_32bitBE(block_offset + 0x00, streamFile);
|
next_block_size = read_u32be(block_offset + 0x00, sf);
|
||||||
/* 0x04: frame size previous */
|
/* 0x04: frame size previous */
|
||||||
video_size = read_32bitBE(block_offset + 0x08,streamFile);
|
video_size = read_u32be(block_offset + 0x08,sf);
|
||||||
/* 0x0c: audio size */
|
/* 0x0c: audio size */
|
||||||
|
|
||||||
audio_offset = block_offset + 0x10 + video_size;
|
audio_offset = block_offset + 0x10 + video_size;
|
||||||
@ -21,21 +21,21 @@ void block_update_thp(off_t block_offset, VGMSTREAM *vgmstream) {
|
|||||||
|
|
||||||
/* block samples can be smaller than block size, normally in the last block,
|
/* block samples can be smaller than block size, normally in the last block,
|
||||||
* but num_samples already takes that into account, so there is no real difference */
|
* but num_samples already takes that into account, so there is no real difference */
|
||||||
vgmstream->current_block_size = read_32bitBE(audio_offset + 0x00, streamFile);
|
vgmstream->current_block_size = read_u32be(audio_offset + 0x00, sf);
|
||||||
vgmstream->current_block_samples = read_32bitBE(audio_offset + 0x04, streamFile);
|
vgmstream->current_block_samples = read_u32be(audio_offset + 0x04, sf);
|
||||||
|
|
||||||
audio_offset += 0x08;
|
audio_offset += 0x08;
|
||||||
|
|
||||||
for (i = 0; i < vgmstream->channels; i++) {
|
for (i = 0; i < vgmstream->channels; i++) {
|
||||||
off_t coef_offset = audio_offset + i*0x20;
|
off_t coef_offset = audio_offset + i*0x20;
|
||||||
off_t hist_offset = audio_offset + vgmstream->channels*0x20 + i*0x04;
|
off_t hist_offset = audio_offset + vgmstream->channels*0x20 + i*0x04;
|
||||||
off_t data_offset = audio_offset + vgmstream->channels*0x24 + i*vgmstream->current_block_size;
|
off_t data_offset = audio_offset + 2*0x24 + i*vgmstream->current_block_size; /* reserved for 2 even in mono [WarioWare Inc. (GC)] */
|
||||||
|
|
||||||
for (j = 0; j < 16; j++) {
|
for (j = 0; j < 16; j++) {
|
||||||
vgmstream->ch[i].adpcm_coef[j] = read_16bitBE(coef_offset + (j*0x02),streamFile);
|
vgmstream->ch[i].adpcm_coef[j] = read_s16be(coef_offset + (j*0x02),sf);
|
||||||
}
|
}
|
||||||
vgmstream->ch[i].adpcm_history1_16 = read_16bitBE(hist_offset + 0x00,streamFile);
|
vgmstream->ch[i].adpcm_history1_16 = read_s16be(hist_offset + 0x00,sf);
|
||||||
vgmstream->ch[i].adpcm_history2_16 = read_16bitBE(hist_offset + 0x02,streamFile);
|
vgmstream->ch[i].adpcm_history2_16 = read_s16be(hist_offset + 0x02,sf);
|
||||||
vgmstream->ch[i].offset = data_offset;
|
vgmstream->ch[i].offset = data_offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,12 +2,12 @@
|
|||||||
#include "../layout/layout.h"
|
#include "../layout/layout.h"
|
||||||
|
|
||||||
/* THP - Nintendo movie format found in GC/Wii games */
|
/* THP - Nintendo movie format found in GC/Wii games */
|
||||||
VGMSTREAM* init_vgmstream_thp(STREAMFILE *streamFile) {
|
VGMSTREAM* init_vgmstream_thp(STREAMFILE* sf) {
|
||||||
VGMSTREAM *vgmstream = NULL;
|
VGMSTREAM* vgmstream = NULL;
|
||||||
off_t start_offset, component_type_offset, component_data_offset;
|
off_t start_offset, component_type_offset, component_data_offset;
|
||||||
uint32_t version, max_audio_size;
|
uint32_t version, max_audio_size;
|
||||||
int num_components;
|
int num_components;
|
||||||
int loop_flag, channel_count;
|
int loop_flag, channels;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|
||||||
@ -15,14 +15,14 @@ VGMSTREAM* init_vgmstream_thp(STREAMFILE *streamFile) {
|
|||||||
/* .thp: actual extension
|
/* .thp: actual extension
|
||||||
* .dsp: fake extension?
|
* .dsp: fake extension?
|
||||||
* (extensionless): Fragile (Wii) */
|
* (extensionless): Fragile (Wii) */
|
||||||
if (!check_extensions(streamFile, "thp,dsp,"))
|
if (!check_extensions(sf, "thp,dsp,"))
|
||||||
goto fail;
|
goto fail;
|
||||||
if (read_32bitBE(0x00,streamFile) != 0x54485000) /* "THP\0" */
|
if (!is_id32be(0x00,sf, "THP\0"))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
version = read_32bitBE(0x04,streamFile); /* 16b+16b major/minor */
|
version = read_u32be(0x04,sf); /* 16b+16b major/minor */
|
||||||
/* 0x08: max buffer size */
|
/* 0x08: max buffer size */
|
||||||
max_audio_size = read_32bitBE(0x0C,streamFile);
|
max_audio_size = read_u32be(0x0C,sf);
|
||||||
/* 0x10: fps in float */
|
/* 0x10: fps in float */
|
||||||
/* 0x14: block count */
|
/* 0x14: block count */
|
||||||
/* 0x18: first block size */
|
/* 0x18: first block size */
|
||||||
@ -33,19 +33,19 @@ VGMSTREAM* init_vgmstream_thp(STREAMFILE *streamFile) {
|
|||||||
if (max_audio_size == 0) /* no sound */
|
if (max_audio_size == 0) /* no sound */
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
component_type_offset = read_32bitBE(0x20,streamFile);
|
component_type_offset = read_u32be(0x20,sf);
|
||||||
/* 0x24: block offsets table offset (optional, for seeking) */
|
/* 0x24: block offsets table offset (optional, for seeking) */
|
||||||
start_offset = read_32bitBE(0x28,streamFile);
|
start_offset = read_u32be(0x28,sf);
|
||||||
/* 0x2c: last block offset */
|
/* 0x2c: last block offset */
|
||||||
|
|
||||||
/* first component "type" x16 then component headers */
|
/* first component "type" x16 then component headers */
|
||||||
num_components = read_32bitBE(component_type_offset,streamFile);
|
num_components = read_u32be(component_type_offset,sf);
|
||||||
component_type_offset += 0x04;
|
component_type_offset += 0x04;
|
||||||
component_data_offset = component_type_offset + 0x10;
|
component_data_offset = component_type_offset + 0x10;
|
||||||
|
|
||||||
/* parse "component" (data that goes into blocks) */
|
/* parse "component" (data that goes into blocks) */
|
||||||
for (i = 0; i < num_components; i++) {
|
for (i = 0; i < num_components; i++) {
|
||||||
int type = read_8bit(component_type_offset + i,streamFile);
|
int type = read_u8(component_type_offset + i,sf);
|
||||||
|
|
||||||
if (type == 0x00) { /* video */
|
if (type == 0x00) { /* video */
|
||||||
if (version == 0x00010000)
|
if (version == 0x00010000)
|
||||||
@ -73,24 +73,24 @@ VGMSTREAM* init_vgmstream_thp(STREAMFILE *streamFile) {
|
|||||||
* adjusted, but we can't detect Wii (non adjusted) .thp tho */
|
* adjusted, but we can't detect Wii (non adjusted) .thp tho */
|
||||||
|
|
||||||
loop_flag = 0;
|
loop_flag = 0;
|
||||||
channel_count = read_32bitBE(component_data_offset + 0x00,streamFile);
|
channels = read_u32be(component_data_offset + 0x00,sf);
|
||||||
|
|
||||||
|
|
||||||
/* build the VGMSTREAM */
|
/* build the VGMSTREAM */
|
||||||
vgmstream = allocate_vgmstream(channel_count,loop_flag);
|
vgmstream = allocate_vgmstream(channels,loop_flag);
|
||||||
if (!vgmstream) goto fail;
|
if (!vgmstream) goto fail;
|
||||||
|
|
||||||
vgmstream->sample_rate = read_32bitBE(component_data_offset + 0x04,streamFile);
|
vgmstream->sample_rate = read_u32be(component_data_offset + 0x04,sf);
|
||||||
vgmstream->num_samples = read_32bitBE(component_data_offset + 0x08,streamFile);
|
vgmstream->num_samples = read_u32be(component_data_offset + 0x08,sf);
|
||||||
|
|
||||||
vgmstream->meta_type = meta_THP;
|
vgmstream->meta_type = meta_THP;
|
||||||
vgmstream->coding_type = coding_NGC_DSP;
|
vgmstream->coding_type = coding_NGC_DSP;
|
||||||
vgmstream->layout_type = layout_blocked_thp;
|
vgmstream->layout_type = layout_blocked_thp;
|
||||||
/* coefs are in every block */
|
/* coefs are in every block */
|
||||||
|
|
||||||
vgmstream->full_block_size = read_32bitBE(0x18,streamFile); /* next block size */
|
vgmstream->full_block_size = read_u32be(0x18,sf); /* next block size */
|
||||||
|
|
||||||
if (!vgmstream_open_stream(vgmstream,streamFile,start_offset))
|
if (!vgmstream_open_stream(vgmstream,sf,start_offset))
|
||||||
goto fail;
|
goto fail;
|
||||||
return vgmstream;
|
return vgmstream;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user