summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorskidau <skidau@gmail.com>2014-10-14 12:38:54 +1100
committerskidau <skidau@gmail.com>2014-10-14 12:38:54 +1100
commitb4e82a5b9bd36d3a7c8e2d0e7698e1ea47f30b13 (patch)
tree19b043d68877c83a3c2b5cbb38addf4667fd2ba6 /Source
parentce35cd301b913c87a9fa5c8431199d46423f4120 (diff)
parent32dbdbe92f5b30cb96a3c628c5c69fa918ab573a (diff)
Merge pull request #1192 from skidau/dsp-acc-loop-adpcm
Fixed the step_size_bytes in the ADPCM Accelerator loop
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Core/DSP/DSPAccelerator.cpp11
-rw-r--r--Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h8
2 files changed, 13 insertions, 6 deletions
diff --git a/Source/Core/Core/DSP/DSPAccelerator.cpp b/Source/Core/Core/DSP/DSPAccelerator.cpp
index 5e9f1ca52b..65b9d48e30 100644
--- a/Source/Core/Core/DSP/DSPAccelerator.cpp
+++ b/Source/Core/Core/DSP/DSPAccelerator.cpp
@@ -15,7 +15,7 @@ static s16 ADPCM_Step(u32& _rSamplePos)
{
const s16 *pCoefTable = (const s16 *)&g_dsp.ifx_regs[DSP_COEF_A1_0];
- if (((_rSamplePos)& 15) == 0)
+ if ((_rSamplePos & 15) == 0)
{
g_dsp.ifx_regs[DSP_PRED_SCALE] = DSPHost::ReadHostMemory((_rSamplePos & ~15) >> 1);
_rSamplePos += 2;
@@ -122,8 +122,11 @@ u16 dsp_read_accelerator()
switch (g_dsp.ifx_regs[DSP_FORMAT])
{
case 0x00: // ADPCM audio
+ if ((EndAddress & 15) == 0)
+ step_size_bytes = 1;
+ else
+ step_size_bytes = 2;
val = ADPCM_Step(Address);
- step_size_bytes = 2;
break;
case 0x0A: // 16-bit PCM audio
val = (DSPHost::ReadHostMemory(Address * 2) << 8) | DSPHost::ReadHostMemory(Address * 2 + 1);
@@ -136,12 +139,12 @@ u16 dsp_read_accelerator()
val = DSPHost::ReadHostMemory(Address) << 8;
g_dsp.ifx_regs[DSP_YN2] = g_dsp.ifx_regs[DSP_YN1];
g_dsp.ifx_regs[DSP_YN1] = val;
- step_size_bytes = 1;
+ step_size_bytes = 2;
Address++;
break;
default:
ERROR_LOG(DSPLLE, "dsp_read_accelerator() - unknown format 0x%x", g_dsp.ifx_regs[DSP_FORMAT]);
- step_size_bytes = 1;
+ step_size_bytes = 2;
Address++;
val = 0;
break;
diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h b/Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h
index 070c82170a..4dea13a075 100644
--- a/Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h
+++ b/Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h
@@ -166,6 +166,11 @@ u16 AcceleratorGetSample()
*acc_cur_addr += 2;
}
+ if ((acc_end_addr & 15) == 0)
+ step_size_bytes = 1;
+ else
+ step_size_bytes = 2;
+
int scale = 1 << (acc_pb->adpcm.pred_scale & 0xF);
int coef_idx = (acc_pb->adpcm.pred_scale >> 4) & 0x7;
@@ -184,7 +189,6 @@ u16 AcceleratorGetSample()
acc_pb->adpcm.yn2 = acc_pb->adpcm.yn1;
acc_pb->adpcm.yn1 = val;
- step_size_bytes = 2;
*acc_cur_addr += 1;
ret = val;
break;
@@ -202,7 +206,7 @@ u16 AcceleratorGetSample()
ret = DSP::ReadARAM(*acc_cur_addr) << 8;
acc_pb->adpcm.yn2 = acc_pb->adpcm.yn1;
acc_pb->adpcm.yn1 = ret;
- step_size_bytes = 1;
+ step_size_bytes = 2;
*acc_cur_addr += 1;
break;