Merge pull request #5306 from leoetlino/dsphle-ptrs
DSPHLE: Use unique_ptr for ucodes
This commit is contained in:
commit
f77fc55568
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include "Core/DSPEmulator.h"
|
#include "Core/DSPEmulator.h"
|
||||||
#include "Core/HW/DSPHLE/DSPHLE.h"
|
#include "Core/HW/DSPHLE/DSPHLE.h"
|
||||||
|
#include "Core/HW/DSPHLE/UCodes/UCodes.h"
|
||||||
#include "Core/HW/DSPLLE/DSPLLE.h"
|
#include "Core/HW/DSPLLE/DSPLLE.h"
|
||||||
|
|
||||||
std::unique_ptr<DSPEmulator> CreateDSPEmulator(bool hle)
|
std::unique_ptr<DSPEmulator> CreateDSPEmulator(bool hle)
|
||||||
|
|
|
@ -43,7 +43,6 @@ void DSPHLE::DSP_StopSoundStream()
|
||||||
|
|
||||||
void DSPHLE::Shutdown()
|
void DSPHLE::Shutdown()
|
||||||
{
|
{
|
||||||
delete m_ucode;
|
|
||||||
m_ucode = nullptr;
|
m_ucode = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,16 +68,8 @@ void DSPHLE::SendMailToDSP(u32 mail)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UCodeInterface* DSPHLE::GetUCode()
|
|
||||||
{
|
|
||||||
return m_ucode;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DSPHLE::SetUCode(u32 crc)
|
void DSPHLE::SetUCode(u32 crc)
|
||||||
{
|
{
|
||||||
delete m_ucode;
|
|
||||||
|
|
||||||
m_ucode = nullptr;
|
|
||||||
m_mail_handler.Clear();
|
m_mail_handler.Clear();
|
||||||
m_ucode = UCodeFactory(crc, this, m_wii);
|
m_ucode = UCodeFactory(crc, this, m_wii);
|
||||||
m_ucode->Initialize();
|
m_ucode->Initialize();
|
||||||
|
@ -93,15 +84,13 @@ void DSPHLE::SwapUCode(u32 crc)
|
||||||
|
|
||||||
if (m_last_ucode == nullptr)
|
if (m_last_ucode == nullptr)
|
||||||
{
|
{
|
||||||
m_last_ucode = m_ucode;
|
m_last_ucode = std::move(m_ucode);
|
||||||
m_ucode = UCodeFactory(crc, this, m_wii);
|
m_ucode = UCodeFactory(crc, this, m_wii);
|
||||||
m_ucode->Initialize();
|
m_ucode->Initialize();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
delete m_ucode;
|
m_ucode = std::move(m_last_ucode);
|
||||||
m_ucode = m_last_ucode;
|
|
||||||
m_last_ucode = nullptr;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,9 +109,9 @@ void DSPHLE::DoState(PointerWrap& p)
|
||||||
p.DoPOD(m_dsp_control);
|
p.DoPOD(m_dsp_control);
|
||||||
p.DoPOD(m_dsp_state);
|
p.DoPOD(m_dsp_state);
|
||||||
|
|
||||||
int ucode_crc = UCodeInterface::GetCRC(m_ucode);
|
int ucode_crc = UCodeInterface::GetCRC(m_ucode.get());
|
||||||
int ucode_crc_beforeLoad = ucode_crc;
|
int ucode_crc_before_load = ucode_crc;
|
||||||
int last_ucode_crc = UCodeInterface::GetCRC(m_last_ucode);
|
int last_ucode_crc = UCodeInterface::GetCRC(m_last_ucode.get());
|
||||||
int last_ucode_crc_before_load = last_ucode_crc;
|
int last_ucode_crc_before_load = last_ucode_crc;
|
||||||
|
|
||||||
p.Do(ucode_crc);
|
p.Do(ucode_crc);
|
||||||
|
@ -130,43 +119,19 @@ void DSPHLE::DoState(PointerWrap& p)
|
||||||
|
|
||||||
// if a different type of ucode was being used when the savestate was created,
|
// if a different type of ucode was being used when the savestate was created,
|
||||||
// we have to reconstruct the old type of ucode so that we have a valid thing to call DoState on.
|
// we have to reconstruct the old type of ucode so that we have a valid thing to call DoState on.
|
||||||
UCodeInterface* ucode =
|
const bool same_ucode = ucode_crc == ucode_crc_before_load;
|
||||||
(ucode_crc == ucode_crc_beforeLoad) ? m_ucode : UCodeFactory(ucode_crc, this, m_wii);
|
const bool same_last_ucode = last_ucode_crc != last_ucode_crc_before_load;
|
||||||
UCodeInterface* last_ucode = (last_ucode_crc != last_ucode_crc_before_load) ?
|
auto ucode = same_ucode ? std::move(m_ucode) : UCodeFactory(ucode_crc, this, m_wii);
|
||||||
m_last_ucode :
|
auto last_ucode =
|
||||||
UCodeFactory(last_ucode_crc, this, m_wii);
|
same_last_ucode ? std::move(m_last_ucode) : UCodeFactory(last_ucode_crc, this, m_wii);
|
||||||
|
|
||||||
if (ucode)
|
if (ucode)
|
||||||
ucode->DoState(p);
|
ucode->DoState(p);
|
||||||
if (last_ucode)
|
if (last_ucode)
|
||||||
last_ucode->DoState(p);
|
last_ucode->DoState(p);
|
||||||
|
|
||||||
// if a different type of ucode was being used when the savestate was created,
|
m_ucode = std::move(ucode);
|
||||||
// discard it if we're not loading, otherwise discard the old one and keep the new one.
|
m_last_ucode = std::move(last_ucode);
|
||||||
if (ucode != m_ucode)
|
|
||||||
{
|
|
||||||
if (p.GetMode() != PointerWrap::MODE_READ)
|
|
||||||
{
|
|
||||||
delete ucode;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
delete m_ucode;
|
|
||||||
m_ucode = ucode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (last_ucode != m_last_ucode)
|
|
||||||
{
|
|
||||||
if (p.GetMode() != PointerWrap::MODE_READ)
|
|
||||||
{
|
|
||||||
delete last_ucode;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
delete m_last_ucode;
|
|
||||||
m_last_ucode = last_ucode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_mail_handler.DoState(p);
|
m_mail_handler.DoState(p);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
#include "Core/DSPEmulator.h"
|
#include "Core/DSPEmulator.h"
|
||||||
#include "Core/HW/DSP.h"
|
#include "Core/HW/DSP.h"
|
||||||
|
@ -39,8 +41,6 @@ public:
|
||||||
u32 DSP_UpdateRate() override;
|
u32 DSP_UpdateRate() override;
|
||||||
|
|
||||||
CMailHandler& AccessMailHandler() { return m_mail_handler; }
|
CMailHandler& AccessMailHandler() { return m_mail_handler; }
|
||||||
// Formerly DSPHandler
|
|
||||||
UCodeInterface* GetUCode();
|
|
||||||
void SetUCode(u32 crc);
|
void SetUCode(u32 crc);
|
||||||
void SwapUCode(u32 crc);
|
void SwapUCode(u32 crc);
|
||||||
|
|
||||||
|
@ -63,8 +63,8 @@ private:
|
||||||
};
|
};
|
||||||
DSPState m_dsp_state;
|
DSPState m_dsp_state;
|
||||||
|
|
||||||
UCodeInterface* m_ucode;
|
std::unique_ptr<UCodeInterface> m_ucode;
|
||||||
UCodeInterface* m_last_ucode;
|
std::unique_ptr<UCodeInterface> m_last_ucode;
|
||||||
|
|
||||||
DSP::UDSPControl m_dsp_control;
|
DSP::UDSPControl m_dsp_control;
|
||||||
CMailHandler m_mail_handler;
|
CMailHandler m_mail_handler;
|
||||||
|
|
|
@ -227,25 +227,25 @@ void UCodeInterface::DoStateShared(PointerWrap& p)
|
||||||
p.Do(m_needs_resume_mail);
|
p.Do(m_needs_resume_mail);
|
||||||
}
|
}
|
||||||
|
|
||||||
UCodeInterface* UCodeFactory(u32 crc, DSPHLE* dsphle, bool wii)
|
std::unique_ptr<UCodeInterface> UCodeFactory(u32 crc, DSPHLE* dsphle, bool wii)
|
||||||
{
|
{
|
||||||
switch (crc)
|
switch (crc)
|
||||||
{
|
{
|
||||||
case UCODE_ROM:
|
case UCODE_ROM:
|
||||||
INFO_LOG(DSPHLE, "Switching to ROM ucode");
|
INFO_LOG(DSPHLE, "Switching to ROM ucode");
|
||||||
return new ROMUCode(dsphle, crc);
|
return std::make_unique<ROMUCode>(dsphle, crc);
|
||||||
|
|
||||||
case UCODE_INIT_AUDIO_SYSTEM:
|
case UCODE_INIT_AUDIO_SYSTEM:
|
||||||
INFO_LOG(DSPHLE, "Switching to INIT ucode");
|
INFO_LOG(DSPHLE, "Switching to INIT ucode");
|
||||||
return new INITUCode(dsphle, crc);
|
return std::make_unique<INITUCode>(dsphle, crc);
|
||||||
|
|
||||||
case 0x65d6cc6f: // CARD
|
case 0x65d6cc6f: // CARD
|
||||||
INFO_LOG(DSPHLE, "Switching to CARD ucode");
|
INFO_LOG(DSPHLE, "Switching to CARD ucode");
|
||||||
return new CARDUCode(dsphle, crc);
|
return std::make_unique<CARDUCode>(dsphle, crc);
|
||||||
|
|
||||||
case 0xdd7e72d5:
|
case 0xdd7e72d5:
|
||||||
INFO_LOG(DSPHLE, "Switching to GBA ucode");
|
INFO_LOG(DSPHLE, "Switching to GBA ucode");
|
||||||
return new GBAUCode(dsphle, crc);
|
return std::make_unique<GBAUCode>(dsphle, crc);
|
||||||
|
|
||||||
case 0x3ad3b7ac: // Naruto 3, Paper Mario - The Thousand Year Door
|
case 0x3ad3b7ac: // Naruto 3, Paper Mario - The Thousand Year Door
|
||||||
case 0x3daf59b9: // Alien Hominid
|
case 0x3daf59b9: // Alien Hominid
|
||||||
|
@ -260,7 +260,7 @@ UCodeInterface* UCodeFactory(u32 crc, DSPHLE* dsphle, bool wii)
|
||||||
case 0xe2136399: // Billy Hatcher, Dragon Ball Z, Mario Party 5, TMNT, 1080° Avalanche
|
case 0xe2136399: // Billy Hatcher, Dragon Ball Z, Mario Party 5, TMNT, 1080° Avalanche
|
||||||
case 0x3389a79e: // MP1/MP2 Wii (Metroid Prime Trilogy)
|
case 0x3389a79e: // MP1/MP2 Wii (Metroid Prime Trilogy)
|
||||||
INFO_LOG(DSPHLE, "CRC %08x: AX ucode chosen", crc);
|
INFO_LOG(DSPHLE, "CRC %08x: AX ucode chosen", crc);
|
||||||
return new AXUCode(dsphle, crc);
|
return std::make_unique<AXUCode>(dsphle, crc);
|
||||||
|
|
||||||
case 0x86840740: // Zelda WW - US
|
case 0x86840740: // Zelda WW - US
|
||||||
case 0x6ca33a6d: // Zelda TP GC - US
|
case 0x6ca33a6d: // Zelda TP GC - US
|
||||||
|
@ -275,7 +275,7 @@ UCodeInterface* UCodeFactory(u32 crc, DSPHLE* dsphle, bool wii)
|
||||||
case 0x6c3f6f94: // Zelda TP Wii - US
|
case 0x6c3f6f94: // Zelda TP Wii - US
|
||||||
case 0xb7eb9a9c: // Pikmin 1 New Play Control Wii - US
|
case 0xb7eb9a9c: // Pikmin 1 New Play Control Wii - US
|
||||||
case 0xeaeb38cc: // Pikmin 2 New Play Control Wii - US
|
case 0xeaeb38cc: // Pikmin 2 New Play Control Wii - US
|
||||||
return new ZeldaUCode(dsphle, crc);
|
return std::make_unique<ZeldaUCode>(dsphle, crc);
|
||||||
|
|
||||||
case 0x2ea36ce6: // Some Wii demos
|
case 0x2ea36ce6: // Some Wii demos
|
||||||
case 0x5ef56da3: // AX demo
|
case 0x5ef56da3: // AX demo
|
||||||
|
@ -285,7 +285,7 @@ UCodeInterface* UCodeFactory(u32 crc, DSPHLE* dsphle, bool wii)
|
||||||
case 0x4cc52064: // Bleach: Versus Crusade
|
case 0x4cc52064: // Bleach: Versus Crusade
|
||||||
case 0xd9c4bf34: // WiiMenu
|
case 0xd9c4bf34: // WiiMenu
|
||||||
INFO_LOG(DSPHLE, "CRC %08x: Wii - AXWii chosen", crc);
|
INFO_LOG(DSPHLE, "CRC %08x: Wii - AXWii chosen", crc);
|
||||||
return new AXWiiUCode(dsphle, crc);
|
return std::make_unique<AXWiiUCode>(dsphle, crc);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (wii)
|
if (wii)
|
||||||
|
@ -294,7 +294,7 @@ UCodeInterface* UCodeFactory(u32 crc, DSPHLE* dsphle, bool wii)
|
||||||
"is homebrew.\n\n"
|
"is homebrew.\n\n"
|
||||||
"Unknown ucode (CRC = %08x) - forcing AXWii.",
|
"Unknown ucode (CRC = %08x) - forcing AXWii.",
|
||||||
crc);
|
crc);
|
||||||
return new AXWiiUCode(dsphle, crc);
|
return std::make_unique<AXWiiUCode>(dsphle, crc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -302,7 +302,7 @@ UCodeInterface* UCodeFactory(u32 crc, DSPHLE* dsphle, bool wii)
|
||||||
"is homebrew.\n\n"
|
"is homebrew.\n\n"
|
||||||
"DSPHLE: Unknown ucode (CRC = %08x) - forcing AX.",
|
"DSPHLE: Unknown ucode (CRC = %08x) - forcing AX.",
|
||||||
crc);
|
crc);
|
||||||
return new AXUCode(dsphle, crc);
|
return std::make_unique<AXUCode>(dsphle, crc);
|
||||||
}
|
}
|
||||||
|
|
||||||
case UCODE_NULL:
|
case UCODE_NULL:
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
|
|
||||||
|
@ -103,6 +104,6 @@ private:
|
||||||
bool m_needs_resume_mail = false;
|
bool m_needs_resume_mail = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
UCodeInterface* UCodeFactory(u32 crc, DSPHLE* dsphle, bool wii);
|
std::unique_ptr<UCodeInterface> UCodeFactory(u32 crc, DSPHLE* dsphle, bool wii);
|
||||||
} // namespace HLE
|
} // namespace HLE
|
||||||
} // namespace DSP
|
} // namespace DSP
|
||||||
|
|
Loading…
Reference in New Issue