Merge pull request #9897 from leoetlino/axe-faulty-ax-checks
DSPHLE: Minor AX fixes
This commit is contained in:
commit
cccb1eef84
|
@ -236,8 +236,8 @@ struct AXPB
|
||||||
u16 coef_select;
|
u16 coef_select;
|
||||||
u16 mixer_control;
|
u16 mixer_control;
|
||||||
|
|
||||||
u16 running; // 1=RUN 0=STOP
|
u16 running; // 1 = playing, anything else = stopped
|
||||||
u16 is_stream; // 1 = stream, 0 = one shot
|
u16 is_stream; // 1 = stream, anything else = one shot
|
||||||
|
|
||||||
PBMixer mixer;
|
PBMixer mixer;
|
||||||
PBInitialTimeDelay initial_time_delay;
|
PBInitialTimeDelay initial_time_delay;
|
||||||
|
|
|
@ -146,7 +146,6 @@ void WritePB(u32 addr, const PB_TYPE& pb, u32 crc)
|
||||||
|
|
||||||
// Simulated accelerator state.
|
// Simulated accelerator state.
|
||||||
static PB_TYPE* acc_pb;
|
static PB_TYPE* acc_pb;
|
||||||
static bool acc_end_reached;
|
|
||||||
|
|
||||||
class HLEAccelerator final : public Accelerator
|
class HLEAccelerator final : public Accelerator
|
||||||
{
|
{
|
||||||
|
@ -157,7 +156,7 @@ protected:
|
||||||
{
|
{
|
||||||
// Set the ADPCM info to continue processing at loop_addr.
|
// Set the ADPCM info to continue processing at loop_addr.
|
||||||
SetPredScale(acc_pb->adpcm_loop_info.pred_scale);
|
SetPredScale(acc_pb->adpcm_loop_info.pred_scale);
|
||||||
if (!acc_pb->is_stream)
|
if (acc_pb->is_stream != 1)
|
||||||
{
|
{
|
||||||
SetYn1(acc_pb->adpcm_loop_info.yn1);
|
SetYn1(acc_pb->adpcm_loop_info.yn1);
|
||||||
SetYn2(acc_pb->adpcm_loop_info.yn2);
|
SetYn2(acc_pb->adpcm_loop_info.yn2);
|
||||||
|
@ -177,15 +176,6 @@ protected:
|
||||||
{
|
{
|
||||||
// Non looping voice reached the end -> running = 0.
|
// Non looping voice reached the end -> running = 0.
|
||||||
acc_pb->running = 0;
|
acc_pb->running = 0;
|
||||||
|
|
||||||
#ifdef AX_WII
|
|
||||||
// One of the few meaningful differences between AXGC and AXWii:
|
|
||||||
// while AXGC handles non looping voices ending by relying on the
|
|
||||||
// accelerator to stop reads once the loop address is reached,
|
|
||||||
// AXWii has the 0000 samples internally in DRAM and use an internal
|
|
||||||
// pointer to it (loop addr does not contain 0000 samples on AXWii!).
|
|
||||||
acc_end_reached = true;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,7 +196,6 @@ void AcceleratorSetup(PB_TYPE* pb)
|
||||||
s_accelerator->SetYn1(pb->adpcm.yn1);
|
s_accelerator->SetYn1(pb->adpcm.yn1);
|
||||||
s_accelerator->SetYn2(pb->adpcm.yn2);
|
s_accelerator->SetYn2(pb->adpcm.yn2);
|
||||||
s_accelerator->SetPredScale(pb->adpcm.pred_scale);
|
s_accelerator->SetPredScale(pb->adpcm.pred_scale);
|
||||||
acc_end_reached = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reads a sample from the accelerator. Also handles looping and
|
// Reads a sample from the accelerator. Also handles looping and
|
||||||
|
@ -214,10 +203,6 @@ void AcceleratorSetup(PB_TYPE* pb)
|
||||||
// by the accelerator on real hardware).
|
// by the accelerator on real hardware).
|
||||||
u16 AcceleratorGetSample()
|
u16 AcceleratorGetSample()
|
||||||
{
|
{
|
||||||
// See below for explanations about acc_end_reached.
|
|
||||||
if (acc_end_reached)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return s_accelerator->Read(acc_pb->adpcm.coefs);
|
return s_accelerator->Read(acc_pb->adpcm.coefs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -418,7 +403,7 @@ void ProcessVoice(PB_TYPE& pb, const AXBuffers& buffers, u16 count, AXMixControl
|
||||||
const s16* coeffs)
|
const s16* coeffs)
|
||||||
{
|
{
|
||||||
// If the voice is not running, nothing to do.
|
// If the voice is not running, nothing to do.
|
||||||
if (!pb.running)
|
if (pb.running != 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Read input samples, performing sample rate conversion if needed.
|
// Read input samples, performing sample rate conversion if needed.
|
||||||
|
|
Loading…
Reference in New Issue