mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-13 07:49:19 +01:00
Merge pull request #1895 from JosJuice/isvolumewiidisc
Don't read from disk when checking volume type
This commit is contained in:
commit
f9fc9d47c0
@ -214,8 +214,7 @@ bool CBoot::BootUp()
|
||||
if (pVolume == nullptr)
|
||||
break;
|
||||
|
||||
bool isoWii = DiscIO::IsVolumeWiiDisc(pVolume);
|
||||
if (isoWii != _StartupPara.bWii)
|
||||
if (pVolume->IsWiiDisc() != _StartupPara.bWii)
|
||||
{
|
||||
PanicAlertT("Warning - starting ISO in wrong console mode!");
|
||||
}
|
||||
@ -237,7 +236,7 @@ bool CBoot::BootUp()
|
||||
}
|
||||
|
||||
|
||||
_StartupPara.bWii = VolumeHandler::IsWii();
|
||||
_StartupPara.bWii = VolumeHandler::IsWiiDisc();
|
||||
|
||||
// HLE BS2 or not
|
||||
if (_StartupPara.bHLE_BS2)
|
||||
@ -295,7 +294,7 @@ bool CBoot::BootUp()
|
||||
{
|
||||
BS2Success = EmulatedBS2(dolWii);
|
||||
}
|
||||
else if (!VolumeHandler::IsWii() && !_StartupPara.m_strDefaultISO.empty())
|
||||
else if (!VolumeHandler::IsWiiDisc() && !_StartupPara.m_strDefaultISO.empty())
|
||||
{
|
||||
VolumeHandler::SetVolumeName(_StartupPara.m_strDefaultISO);
|
||||
BS2Success = EmulatedBS2(dolWii);
|
||||
@ -345,7 +344,7 @@ bool CBoot::BootUp()
|
||||
{
|
||||
BS2Success = EmulatedBS2(elfWii);
|
||||
}
|
||||
else if (!VolumeHandler::IsWii() && !_StartupPara.m_strDefaultISO.empty())
|
||||
else if (!VolumeHandler::IsWiiDisc() && !_StartupPara.m_strDefaultISO.empty())
|
||||
{
|
||||
VolumeHandler::SetVolumeName(_StartupPara.m_strDefaultISO);
|
||||
BS2Success = EmulatedBS2(elfWii);
|
||||
|
@ -21,8 +21,6 @@
|
||||
#include "Core/HW/Memmap.h"
|
||||
#include "Core/PowerPC/PowerPC.h"
|
||||
|
||||
#include "DiscIO/VolumeCreator.h"
|
||||
|
||||
void CBoot::RunFunction(u32 _iAddr)
|
||||
{
|
||||
PC = _iAddr;
|
||||
@ -320,7 +318,7 @@ bool CBoot::EmulatedBS2_Wii()
|
||||
|
||||
// Execute the apploader
|
||||
bool apploaderRan = false;
|
||||
if (VolumeHandler::IsValid() && VolumeHandler::IsWii())
|
||||
if (VolumeHandler::IsValid() && VolumeHandler::IsWiiDisc())
|
||||
{
|
||||
// Set up MSR and the BAT SPR registers.
|
||||
UReg_MSR& m_MSR = ((UReg_MSR&)PowerPC::ppcState.msr);
|
||||
|
@ -153,7 +153,7 @@ bool SCoreStartupParameter::AutoSetup(EBootBS2 _BootBS2)
|
||||
m_strRevisionSpecificUniqueID = pVolume->GetRevisionSpecificUniqueID();
|
||||
|
||||
// Check if we have a Wii disc
|
||||
bWii = DiscIO::IsVolumeWiiDisc(pVolume.get());
|
||||
bWii = pVolume.get()->IsWiiDisc();
|
||||
switch (pVolume->GetCountry())
|
||||
{
|
||||
case DiscIO::IVolume::COUNTRY_USA:
|
||||
|
@ -1328,7 +1328,7 @@ s64 CalculateRawDiscReadTime(u64 offset, s64 length)
|
||||
// Note that the speed at a track (in bytes per second) is the same as
|
||||
// the radius of that track because of the length unit used.
|
||||
double speed;
|
||||
if (VolumeHandler::IsWii())
|
||||
if (VolumeHandler::IsWiiDisc())
|
||||
{
|
||||
speed = std::sqrt(((average_offset - WII_DISC_LOCATION_1_OFFSET) /
|
||||
WII_BYTES_PER_AREA_UNIT + WII_DISC_AREA_UP_TO_LOCATION_1) / PI);
|
||||
|
@ -77,10 +77,10 @@ bool IsValid()
|
||||
return (g_pVolume != nullptr);
|
||||
}
|
||||
|
||||
bool IsWii()
|
||||
bool IsWiiDisc()
|
||||
{
|
||||
if (g_pVolume)
|
||||
return IsVolumeWiiDisc(g_pVolume);
|
||||
return g_pVolume->IsWiiDisc();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ u32 Read32(u64 _Offset, bool decrypt);
|
||||
bool ReadToPtr(u8* ptr, u64 _dwOffset, u64 _dwLength, bool decrypt);
|
||||
|
||||
bool IsValid();
|
||||
bool IsWii();
|
||||
bool IsWiiDisc();
|
||||
|
||||
DiscIO::IVolume *GetVolume();
|
||||
|
||||
|
@ -8,7 +8,6 @@
|
||||
#include "DiscIO/BannerLoaderGC.h"
|
||||
#include "DiscIO/BannerLoaderWii.h"
|
||||
#include "DiscIO/Filesystem.h"
|
||||
#include "DiscIO/VolumeCreator.h"
|
||||
|
||||
namespace DiscIO
|
||||
{
|
||||
@ -18,7 +17,7 @@ class IVolume;
|
||||
|
||||
IBannerLoader* CreateBannerLoader(DiscIO::IFileSystem& _rFileSystem, DiscIO::IVolume *pVolume)
|
||||
{
|
||||
if (IsVolumeWiiDisc(pVolume) || IsVolumeWadFile(pVolume))
|
||||
if (pVolume->IsWiiDisc() || pVolume->IsWadFile())
|
||||
return new CBannerLoaderWii(pVolume);
|
||||
if (_rFileSystem.IsValid())
|
||||
return new CBannerLoaderGC(_rFileSystem, pVolume);
|
||||
|
@ -79,7 +79,7 @@ void ReadFileSystem(const std::string& filename)
|
||||
if (!OpenISO)
|
||||
return;
|
||||
|
||||
if (!DiscIO::IsVolumeWadFile(OpenISO))
|
||||
if (!OpenISO->IsWadFile())
|
||||
{
|
||||
pFileSystem = DiscIO::CreateFileSystem(OpenISO);
|
||||
|
||||
|
@ -36,9 +36,11 @@ public:
|
||||
virtual std::vector<std::string> GetNames() const = 0;
|
||||
virtual u32 GetFSTSize() const = 0;
|
||||
virtual std::string GetApploaderDate() const = 0;
|
||||
virtual bool IsDiscTwo() const { return false; }
|
||||
virtual bool IsWiiDisc() const { return false; }
|
||||
virtual bool IsWadFile() const { return false; }
|
||||
virtual bool SupportsIntegrityCheck() const { return false; }
|
||||
virtual bool CheckIntegrity() const { return false; }
|
||||
virtual bool IsDiscTwo() const { return false; }
|
||||
|
||||
virtual bool ChangePartition(u64 offset) { return false; }
|
||||
|
||||
|
@ -120,15 +120,6 @@ IVolume* CreateVolumeFromDirectory(const std::string& _rDirectory, bool _bIsWii,
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool IsVolumeWiiDisc(const IVolume *_rVolume)
|
||||
{
|
||||
u32 MagicWord = 0;
|
||||
_rVolume->Read(0x18, 4, (u8*)&MagicWord, false);
|
||||
|
||||
return (Common::swap32(MagicWord) == 0x5D1C9EA3);
|
||||
//GameCube 0xc2339f3d
|
||||
}
|
||||
|
||||
bool IsVolumeWadFile(const IVolume *_rVolume)
|
||||
{
|
||||
u32 MagicWord = 0;
|
||||
|
@ -67,12 +67,7 @@ bool CVolumeDirectory::IsValidDirectory(const std::string& _rDirectory)
|
||||
|
||||
bool CVolumeDirectory::Read(u64 _Offset, u64 _Length, u8* _pBuffer, bool decrypt) const
|
||||
{
|
||||
// VolumeHandler::IsWii is used here to check whether a Wii disc is used.
|
||||
// That function calls this function to check a magic word in the disc header,
|
||||
// so it is important that VolumeHandler::IsWii is not called when the header
|
||||
// is being read with decrypt=false, as it would result in a stack overflow.
|
||||
|
||||
if (!decrypt && (_Offset + _Length >= 0x400) && VolumeHandler::IsWii())
|
||||
if (!decrypt && (_Offset + _Length >= 0x400) && m_is_wii)
|
||||
{
|
||||
// Fully supporting this would require re-encrypting every file that's read.
|
||||
// Only supporting the areas that IOS allows software to read could be more feasible.
|
||||
@ -82,7 +77,7 @@ bool CVolumeDirectory::Read(u64 _Offset, u64 _Length, u8* _pBuffer, bool decrypt
|
||||
return false;
|
||||
}
|
||||
|
||||
if (decrypt && !VolumeHandler::IsWii())
|
||||
if (decrypt && !m_is_wii)
|
||||
PanicAlertT("Tried to decrypt data from a non-Wii volume");
|
||||
|
||||
// header
|
||||
@ -214,6 +209,11 @@ std::string CVolumeDirectory::GetApploaderDate() const
|
||||
return "VOID";
|
||||
}
|
||||
|
||||
bool CVolumeDirectory::IsWiiDisc() const
|
||||
{
|
||||
return m_is_wii;
|
||||
}
|
||||
|
||||
u64 CVolumeDirectory::GetSize() const
|
||||
{
|
||||
return 0;
|
||||
@ -257,6 +257,7 @@ void CVolumeDirectory::SetDiskTypeWii()
|
||||
m_diskHeader[0x1b] = 0xa3;
|
||||
memset(&m_diskHeader[0x1c], 0, 4);
|
||||
|
||||
m_is_wii = true;
|
||||
m_addressShift = 2;
|
||||
}
|
||||
|
||||
@ -268,6 +269,7 @@ void CVolumeDirectory::SetDiskTypeGC()
|
||||
m_diskHeader[0x1e] = 0x9f;
|
||||
m_diskHeader[0x1f] = 0x3d;
|
||||
|
||||
m_is_wii = false;
|
||||
m_addressShift = 0;
|
||||
}
|
||||
|
||||
|
@ -45,6 +45,7 @@ public:
|
||||
u32 GetFSTSize() const override;
|
||||
|
||||
std::string GetApploaderDate() const override;
|
||||
bool IsWiiDisc() const override;
|
||||
|
||||
ECountry GetCountry() const override;
|
||||
|
||||
@ -85,6 +86,8 @@ private:
|
||||
|
||||
u32 m_totalNameSize;
|
||||
|
||||
bool m_is_wii;
|
||||
|
||||
// GameCube has no shift, Wii has 2 bit shift
|
||||
u32 m_addressShift;
|
||||
|
||||
|
@ -103,6 +103,11 @@ bool CVolumeWAD::GetTitleID(u8* _pBuffer) const
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CVolumeWAD::IsWadFile() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
std::vector<std::string> CVolumeWAD::GetNames() const
|
||||
{
|
||||
std::vector<std::string> names;
|
||||
|
@ -32,6 +32,7 @@ public:
|
||||
std::vector<std::string> GetNames() const override;
|
||||
u32 GetFSTSize() const override { return 0; }
|
||||
std::string GetApploaderDate() const override { return "0"; }
|
||||
bool IsWadFile() const override;
|
||||
ECountry GetCountry() const override;
|
||||
u64 GetSize() const override;
|
||||
u64 GetRawSize() const override;
|
||||
|
@ -227,6 +227,11 @@ std::string CVolumeWiiCrypted::GetApploaderDate() const
|
||||
return date;
|
||||
}
|
||||
|
||||
bool CVolumeWiiCrypted::IsWiiDisc() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
u64 CVolumeWiiCrypted::GetSize() const
|
||||
{
|
||||
if (m_pReader)
|
||||
|
@ -32,6 +32,7 @@ public:
|
||||
std::vector<std::string> GetNames() const override;
|
||||
u32 GetFSTSize() const override;
|
||||
std::string GetApploaderDate() const override;
|
||||
bool IsWiiDisc() const override;
|
||||
ECountry GetCountry() const override;
|
||||
u64 GetSize() const override;
|
||||
u64 GetRawSize() const override;
|
||||
|
@ -61,8 +61,8 @@ GameFile::GameFile(const QString& fileName)
|
||||
|
||||
if (volume != nullptr)
|
||||
{
|
||||
if (!DiscIO::IsVolumeWadFile(volume))
|
||||
m_platform = DiscIO::IsVolumeWiiDisc(volume) ? WII_DISC : GAMECUBE_DISC;
|
||||
if (!volume->IsWadFile())
|
||||
m_platform = volume->IsWiiDisc() ? WII_DISC : GAMECUBE_DISC;
|
||||
else
|
||||
m_platform = WII_WAD;
|
||||
|
||||
@ -305,7 +305,7 @@ const QString GameFile::GetWiiFSPath() const
|
||||
if (volume == nullptr)
|
||||
return ret;
|
||||
|
||||
if (DiscIO::IsVolumeWiiDisc(volume) || DiscIO::IsVolumeWadFile(volume))
|
||||
if (volume->IsWiiDisc() || volume->IsWadFile())
|
||||
{
|
||||
std::string path;
|
||||
u64 title;
|
||||
|
@ -62,14 +62,14 @@ GameListItem::GameListItem(const std::string& _rFileName)
|
||||
|
||||
if (pVolume != nullptr)
|
||||
{
|
||||
if (!DiscIO::IsVolumeWadFile(pVolume))
|
||||
m_Platform = DiscIO::IsVolumeWiiDisc(pVolume) ? WII_DISC : GAMECUBE_DISC;
|
||||
if (!pVolume->IsWadFile())
|
||||
m_Platform = pVolume->IsWiiDisc() ? WII_DISC : GAMECUBE_DISC;
|
||||
else
|
||||
m_Platform = WII_WAD;
|
||||
|
||||
m_volume_names = pVolume->GetNames();
|
||||
|
||||
m_Country = pVolume->GetCountry();
|
||||
m_Country = pVolume->GetCountry();
|
||||
m_FileSize = pVolume->GetRawSize();
|
||||
m_VolumeSize = pVolume->GetSize();
|
||||
|
||||
@ -281,7 +281,7 @@ const std::string GameListItem::GetWiiFSPath() const
|
||||
if (iso == nullptr)
|
||||
return ret;
|
||||
|
||||
if (DiscIO::IsVolumeWiiDisc(iso) || DiscIO::IsVolumeWadFile(iso))
|
||||
if (iso->IsWiiDisc() || iso->IsWadFile())
|
||||
{
|
||||
u64 title = 0;
|
||||
|
||||
|
@ -128,9 +128,8 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW
|
||||
{
|
||||
// Load ISO data
|
||||
OpenISO = DiscIO::CreateVolumeFromFilename(fileName);
|
||||
bool IsWad = DiscIO::IsVolumeWadFile(OpenISO);
|
||||
bool IsWiiDisc = DiscIO::IsVolumeWiiDisc(OpenISO);
|
||||
if (IsWiiDisc)
|
||||
bool IsWad = OpenISO->IsWadFile();
|
||||
if (OpenISO->IsWiiDisc())
|
||||
{
|
||||
for (int group = 0; group < 4; group++)
|
||||
{
|
||||
@ -264,7 +263,7 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW
|
||||
break;
|
||||
}
|
||||
|
||||
if (IsWiiDisc) // Only one language with Wii banners
|
||||
if (OpenISO->IsWiiDisc()) // Only one language with Wii banners
|
||||
{
|
||||
m_Lang->SetSelection(0);
|
||||
m_Lang->Disable();
|
||||
@ -291,9 +290,9 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW
|
||||
|
||||
// Filesystem browser/dumper
|
||||
// TODO : Should we add a way to browse the wad file ?
|
||||
if (!DiscIO::IsVolumeWadFile(OpenISO))
|
||||
if (!OpenISO->IsWadFile())
|
||||
{
|
||||
if (DiscIO::IsVolumeWiiDisc(OpenISO))
|
||||
if (OpenISO->IsWiiDisc())
|
||||
{
|
||||
for (u32 i = 0; i < WiiDisc.size(); i++)
|
||||
{
|
||||
@ -316,7 +315,7 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW
|
||||
|
||||
CISOProperties::~CISOProperties()
|
||||
{
|
||||
if (!IsVolumeWiiDisc(OpenISO) && !IsVolumeWadFile(OpenISO) && pFileSystem)
|
||||
if (!OpenISO->IsWiiDisc() && !OpenISO->IsWadFile() && pFileSystem)
|
||||
delete pFileSystem;
|
||||
// two vector's items are no longer valid after deleting filesystem
|
||||
WiiDisc.clear();
|
||||
@ -480,7 +479,7 @@ void CISOProperties::CreateGUIControls(bool IsWad)
|
||||
sbCoreOverrides->Add(sGPUDeterminism, 0, wxEXPAND|wxALL, 5);
|
||||
|
||||
wxStaticBoxSizer * const sbWiiOverrides = new wxStaticBoxSizer(wxVERTICAL, m_GameConfig, _("Wii Console"));
|
||||
if (!DiscIO::IsVolumeWiiDisc(OpenISO) && !DiscIO::IsVolumeWadFile(OpenISO))
|
||||
if (!OpenISO->IsWiiDisc() && !OpenISO->IsWadFile())
|
||||
{
|
||||
sbWiiOverrides->ShowItems(false);
|
||||
EnableWideScreen->Hide();
|
||||
@ -741,7 +740,7 @@ void CISOProperties::OnRightClickOnTree(wxTreeEvent& event)
|
||||
|
||||
popupMenu.Append(IDM_EXTRACTALL, _("Extract All Files..."));
|
||||
|
||||
if (!DiscIO::IsVolumeWiiDisc(OpenISO) ||
|
||||
if (!OpenISO->IsWiiDisc() ||
|
||||
(m_Treectrl->GetItemImage(m_Treectrl->GetSelection()) == 0 &&
|
||||
m_Treectrl->GetFirstVisibleItem() != m_Treectrl->GetSelection()))
|
||||
{
|
||||
@ -784,7 +783,7 @@ void CISOProperties::OnExtractFile(wxCommandEvent& WXUNUSED (event))
|
||||
m_Treectrl->SelectItem(m_Treectrl->GetItemParent(m_Treectrl->GetSelection()));
|
||||
}
|
||||
|
||||
if (DiscIO::IsVolumeWiiDisc(OpenISO))
|
||||
if (OpenISO->IsWiiDisc())
|
||||
{
|
||||
int partitionNum = wxAtoi(File.Mid(File.find_first_of("/") - 1, 1));
|
||||
File.erase(0, File.find_first_of("/") + 1); // Remove "Partition x/"
|
||||
@ -798,7 +797,7 @@ void CISOProperties::OnExtractFile(wxCommandEvent& WXUNUSED (event))
|
||||
|
||||
void CISOProperties::ExportDir(const std::string& _rFullPath, const std::string& _rExportFolder, const int partitionNum)
|
||||
{
|
||||
DiscIO::IFileSystem* const fs = DiscIO::IsVolumeWiiDisc(OpenISO) ? WiiDisc[partitionNum].FileSystem : pFileSystem;
|
||||
DiscIO::IFileSystem* const fs = OpenISO->IsWiiDisc() ? WiiDisc[partitionNum].FileSystem : pFileSystem;
|
||||
|
||||
std::vector<const DiscIO::SFileInfo*> fst;
|
||||
fs->GetFileList(fst);
|
||||
@ -813,7 +812,7 @@ void CISOProperties::ExportDir(const std::string& _rFullPath, const std::string&
|
||||
size = (u32)fst.size();
|
||||
|
||||
fs->ExportApploader(_rExportFolder);
|
||||
if (!DiscIO::IsVolumeWiiDisc(OpenISO))
|
||||
if (!OpenISO->IsWiiDisc())
|
||||
fs->ExportDOL(_rExportFolder);
|
||||
}
|
||||
else
|
||||
@ -898,7 +897,7 @@ void CISOProperties::OnExtractDir(wxCommandEvent& event)
|
||||
|
||||
if (event.GetId() == IDM_EXTRACTALL)
|
||||
{
|
||||
if (DiscIO::IsVolumeWiiDisc(OpenISO))
|
||||
if (OpenISO->IsWiiDisc())
|
||||
for (u32 i = 0; i < WiiDisc.size(); i++)
|
||||
ExportDir("", WxStrToStr(Path), i);
|
||||
else
|
||||
@ -917,7 +916,7 @@ void CISOProperties::OnExtractDir(wxCommandEvent& event)
|
||||
|
||||
Directory += DIR_SEP_CHR;
|
||||
|
||||
if (DiscIO::IsVolumeWiiDisc(OpenISO))
|
||||
if (OpenISO->IsWiiDisc())
|
||||
{
|
||||
int partitionNum = wxAtoi(Directory.Mid(Directory.find_first_of("/") - 1, 1));
|
||||
Directory.erase(0, Directory.find_first_of("/") + 1); // Remove "Partition x/"
|
||||
@ -937,7 +936,7 @@ void CISOProperties::OnExtractDataFromHeader(wxCommandEvent& event)
|
||||
if (Path.empty())
|
||||
return;
|
||||
|
||||
if (DiscIO::IsVolumeWiiDisc(OpenISO))
|
||||
if (OpenISO->IsWiiDisc())
|
||||
{
|
||||
wxString Directory = m_Treectrl->GetItemText(m_Treectrl->GetSelection());
|
||||
unsigned int partitionNum = wxAtoi(Directory.Mid(Directory.find_first_of("0123456789"), 2));
|
||||
@ -994,7 +993,7 @@ void CISOProperties::CheckPartitionIntegrity(wxCommandEvent& event)
|
||||
{
|
||||
// Normally we can't enter this function if we aren't analyzing a Wii disc
|
||||
// anyway, but let's still check to be sure.
|
||||
if (!DiscIO::IsVolumeWiiDisc(OpenISO))
|
||||
if (!OpenISO->IsWiiDisc())
|
||||
return;
|
||||
|
||||
wxString PartitionName = m_Treectrl->GetItemText(m_Treectrl->GetSelection());
|
||||
|
Loading…
x
Reference in New Issue
Block a user