From 5340b4cb9524990badefe40c71c7b3e1a8b746bd Mon Sep 17 00:00:00 2001 From: mylek4 Date: Fri, 26 Nov 2010 15:04:35 +0000 Subject: [PATCH] DSPHLE Should fix Issue 3543 Restricts 'ssbm' loop detection to PBs with valid loop pred_scale values. Masked coef_idx in the adpcm code so it can't fault on invalid values. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6480 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX_ADPCM.h | 2 +- Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX_Voice.h | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX_ADPCM.h b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX_ADPCM.h index 23d6f399c5..b05bbdc11f 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX_ADPCM.h +++ b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX_ADPCM.h @@ -31,7 +31,7 @@ inline s16 ADPCM_Step(PBADPCMInfo &adpcm, u32& samplePos, u32 newSamplePos, u16 } int scale = 1 << (adpcm.pred_scale & 0xF); - int coef_idx = adpcm.pred_scale >> 4; + int coef_idx = (adpcm.pred_scale >> 4) & 7; s32 coef1 = adpcm.coefs[coef_idx * 2 + 0]; s32 coef2 = adpcm.coefs[coef_idx * 2 + 1]; diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX_Voice.h b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX_Voice.h index 71c240a190..23d26da868 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX_Voice.h +++ b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX_Voice.h @@ -140,12 +140,14 @@ inline void MixAddVoice(ParamBlockType &pb, // identify these types of blocks. Updates did not write any looping values. if ( (pb.adpcm_loop_info.pred_scale || pb.adpcm_loop_info.yn1 || pb.adpcm_loop_info.yn2) - && pb.mixer_control == 0 - ) + && pb.mixer_control == 0 && pb.adpcm_loop_info.pred_scale <= 0x7F + ) { pb.audio_addr.looping = 1; } + + // Top Spin 3 Wii if (pb.audio_addr.sample_format > 25) pb.audio_addr.sample_format = 0;