mirror of https://github.com/PCSX2/pcsx2.git
SPU2: Change input area updates for Hifi reads
Remove the no longer required InputPosRead Bump Savestates
This commit is contained in:
parent
4497532edb
commit
7c37e86283
|
@ -97,7 +97,7 @@ void V_Core::LogAutoDMA(FILE* fp)
|
|||
|
||||
void V_Core::AutoDMAReadBuffer(int mode) //mode: 0= split stereo; 1 = do not split stereo
|
||||
{
|
||||
int spos = ActiveTSA & 0x100;// ((InputPosRead + 0xff) & 0x100); //starting position of the free buffer
|
||||
int spos = ActiveTSA & 0x100; // Starting position passed by TSA
|
||||
|
||||
if (spos == (OutPos & 0x100))
|
||||
return;
|
||||
|
@ -173,9 +173,6 @@ void V_Core::StartADMAWrite(u16* pMem, u32 sz)
|
|||
AutoDMAReadBuffer(Index, 0);
|
||||
}
|
||||
#else
|
||||
if (((PlayMode & 4) == 4) && (Index == 0))
|
||||
Cores[0].InputPosRead = 0;
|
||||
|
||||
AutoDMAReadBuffer(0);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -33,23 +33,10 @@ StereoOut32 V_Core::ReadInput_HiFi()
|
|||
{
|
||||
if (psxmode)
|
||||
ConLog("ReadInput_HiFi!!!!!\n");
|
||||
InputPosRead &= ~1;
|
||||
//
|
||||
//#ifdef PCM24_S1_INTERLEAVE
|
||||
// StereoOut32 retval(
|
||||
// *((s32*)(ADMATempBuffer+(InputPosRead<<1))),
|
||||
// *((s32*)(ADMATempBuffer+(InputPosRead<<1)+2))
|
||||
// );
|
||||
//#else
|
||||
// StereoOut32 retval(
|
||||
// (s32&)(ADMATempBuffer[InputPosRead]),
|
||||
// (s32&)(ADMATempBuffer[InputPosRead+0x200])
|
||||
// );
|
||||
//#endif
|
||||
|
||||
StereoOut32 retval(
|
||||
(s32&)(*GetMemPtr(0x2000 + (Index << 10) + InputPosRead)),
|
||||
(s32&)(*GetMemPtr(0x2200 + (Index << 10) + InputPosRead)));
|
||||
(s32&)(*GetMemPtr(0x2000 + (Index << 10) + OutPos)),
|
||||
(s32&)(*GetMemPtr(0x2200 + (Index << 10) + OutPos)));
|
||||
|
||||
if (Index == 1)
|
||||
{
|
||||
|
@ -61,25 +48,19 @@ StereoOut32 V_Core::ReadInput_HiFi()
|
|||
retval.Right >>= 4;
|
||||
}
|
||||
|
||||
InputPosRead += 2;
|
||||
|
||||
// Why does CDDA mode check for InputPos == 0x100? In the old code, SPDIF mode did not but CDDA did.
|
||||
// One of these seems wrong, they should be the same. Since standard ADMA checks too I'm assuming that as default. -- air
|
||||
|
||||
if ((InputPosRead == 0x100) || (InputPosRead >= 0x200))
|
||||
if ((OutPos == 0xFF || OutPos == 0x1FF))
|
||||
{
|
||||
AdmaInProgress = 0;
|
||||
if (InputDataLeft >= 0x200)
|
||||
{
|
||||
#ifdef PCM24_S1_INTERLEAVE
|
||||
AutoDMAReadBuffer(1);
|
||||
#else
|
||||
int oldOutPos = OutPos;
|
||||
OutPos = (OutPos + 1) & 0x1FF;
|
||||
AutoDMAReadBuffer(0);
|
||||
#endif
|
||||
OutPos = oldOutPos;
|
||||
AdmaInProgress = 1;
|
||||
|
||||
ActiveTSA = (Index << 10) + InputPosRead;
|
||||
TSA = ActiveTSA;
|
||||
if (InputDataLeft < 0x200)
|
||||
{
|
||||
FileLog("[%10d] %s AutoDMA%c block end.\n", (Index == 1) ? "CDDA" : "SPDIF", Cycles, GetDmaIndexChar());
|
||||
|
@ -92,26 +73,12 @@ StereoOut32 V_Core::ReadInput_HiFi()
|
|||
ConLog("WARNING: adma buffer didn't finish with a whole block!!\n");
|
||||
}
|
||||
}
|
||||
AdmaInProgress = 0;
|
||||
InputDataLeft = 0;
|
||||
// Hack, kinda. We call the interrupt early here, since PCSX2 doesn't like them delayed.
|
||||
//DMAICounter = 1;
|
||||
if (Index == 0)
|
||||
{
|
||||
if (!SPU2_dummy_callback)
|
||||
spu2DMA4Irq();
|
||||
else
|
||||
SPU2interruptDMA4();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!SPU2_dummy_callback)
|
||||
spu2DMA7Irq();
|
||||
else
|
||||
SPU2interruptDMA7();
|
||||
}
|
||||
DMAICounter = 0x200 * 4;
|
||||
LastClock = *cyclePtr;
|
||||
}
|
||||
}
|
||||
InputPosRead &= 0x1ff;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
@ -126,22 +93,16 @@ StereoOut32 V_Core::ReadInput()
|
|||
if (Cores[i].IRQEnable && 0x2000 + (Index << 10) + OutPos == (Cores[i].IRQA & 0xfffffdff))
|
||||
SetIrqCall(i);
|
||||
|
||||
//retval = StereoOut32(
|
||||
// (s32)ADMATempBuffer[InputPosRead],
|
||||
// (s32)ADMATempBuffer[InputPosRead+0x200]
|
||||
//);
|
||||
retval = StereoOut32(
|
||||
(s32)(*GetMemPtr(0x2000 + (Index << 10) + OutPos)),
|
||||
(s32)(*GetMemPtr(0x2200 + (Index << 10) + OutPos)));
|
||||
}
|
||||
|
||||
#ifdef PCSX2_DEVBUILD
|
||||
DebugCores[Index].admaWaveformL[InputPosRead % 0x100] = retval.Left;
|
||||
DebugCores[Index].admaWaveformR[InputPosRead % 0x100] = retval.Right;
|
||||
DebugCores[Index].admaWaveformL[OutPos % 0x100] = retval.Left;
|
||||
DebugCores[Index].admaWaveformR[OutPos % 0x100] = retval.Right;
|
||||
#endif
|
||||
|
||||
InputPosRead++;
|
||||
|
||||
if ((OutPos == 0xFF || OutPos == 0x1FF))
|
||||
{
|
||||
if (InputDataLeft >= 0x200)
|
||||
|
@ -173,6 +134,5 @@ StereoOut32 V_Core::ReadInput()
|
|||
}
|
||||
}
|
||||
}
|
||||
InputPosRead &= 0x1ff;
|
||||
return retval;
|
||||
}
|
||||
|
|
|
@ -406,7 +406,6 @@ struct V_Core
|
|||
s32 DMAICounter; // DMA Interrupt Counter
|
||||
u32 LastClock; // DMA Interrupt Clock Cycle Counter
|
||||
u32 InputDataLeft; // Input Buffer
|
||||
u32 InputPosRead;
|
||||
u32 InputPosWrite;
|
||||
u32 InputDataProgress;
|
||||
|
||||
|
|
|
@ -134,7 +134,6 @@ void V_Core::Init(int index)
|
|||
NoiseOut = 0;
|
||||
AutoDMACtrl = 0;
|
||||
InputDataLeft = 0;
|
||||
InputPosRead = 0;
|
||||
InputPosWrite = 0;
|
||||
InputDataProgress = 0;
|
||||
ReverbX = 0;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
// the lower 16 bit value. IF the change is breaking of all compatibility with old
|
||||
// states, increment the upper 16 bit value, and clear the lower 16 bits to 0.
|
||||
|
||||
static const u32 g_SaveVersion = (0x9A18 << 16) | 0x0000;
|
||||
static const u32 g_SaveVersion = (0x9A19 << 16) | 0x0000;
|
||||
|
||||
// this function is meant to be used in the place of GSfreeze, and provides a safe layer
|
||||
// between the GS saving function and the MTGS's needs. :)
|
||||
|
|
Loading…
Reference in New Issue