wxString FifoPlayerDlg::CreateFileFrameCountLabel() const { FifoDataFile *file = FifoPlayer::GetInstance().GetFile(); if (file) return CreateIntegerLabel(file->GetFrameCount(), _("Frame")); return _("No file loaded"); }
wxString FifoPlayerDlg::CreateRecordingFrameCountLabel() const { FifoDataFile *file = FifoRecorder::GetInstance().GetRecordedFile(); if (file) { int numFrames = file->GetFrameCount(); return CreateIntegerLabel(numFrames, _("Frame")); } return wxEmptyString; }
wxString FifoPlayerDlg::CreateRecordingFifoSizeLabel() const { FifoDataFile *file = FifoRecorder::GetInstance().GetRecordedFile(); if (file) { int fifoBytes = 0; for (int i = 0; i < file->GetFrameCount(); ++i) fifoBytes += file->GetFrame(i).fifoDataSize; return CreateIntegerLabel(fifoBytes, _("FIFO Byte")); } return _("No recorded file"); }
void FIFOPlayerWindow::SaveRecording() { QString path = QFileDialog::getSaveFileName(this, tr("Save FIFO log"), QString(), tr("Dolphin FIFO Log (*.dff)")); if (path.isEmpty()) return; FifoDataFile* file = FifoRecorder::GetInstance().GetRecordedFile(); bool result = file->Save(path.toStdString()); if (!result) QMessageBox::critical(this, tr("Error"), tr("Failed to save FIFO log.")); }
void FIFOPlayerWindow::OnFIFOLoaded() { FifoDataFile* file = FifoPlayer::GetInstance().GetFile(); auto object_count = FifoPlayer::GetInstance().GetFrameObjectCount(); auto frame_count = file->GetFrameCount(); m_frame_range_to->setMaximum(frame_count); m_object_range_to->setMaximum(object_count); m_frame_range_to->setValue(frame_count); m_object_range_to->setValue(object_count); UpdateInfo(); UpdateLimits(); UpdateControls(); }
wxString FifoPlayerDlg::CreateRecordingMemSizeLabel() const { FifoDataFile *file = FifoRecorder::GetInstance().GetRecordedFile(); if (file) { int memBytes = 0; for (int frameNum = 0; frameNum < file->GetFrameCount(); ++frameNum) { const vector<MemoryUpdate>& memUpdates = file->GetFrame(frameNum).memoryUpdates; for (unsigned int i = 0; i < memUpdates.size(); ++i) memBytes += memUpdates[i].size; } return CreateIntegerLabel(memBytes, _("Memory Byte")); } return wxEmptyString; }
void FifoPlayerDlg::OnSaveFile(wxCommandEvent& WXUNUSED(event)) { FifoDataFile *file = FifoRecorder::GetInstance().GetRecordedFile(); if (file) { wxString path = wxSaveFileSelector(_("Dolphin FIFO"), wxT("dff"), wxEmptyString, this); if (!path.empty()) { wxBeginBusyCursor(); bool result = file->Save(path.mb_str()); wxEndBusyCursor(); if (!result) PanicAlert("Error saving file"); } } }
void FifoPlayerDlg::UpdatePlayGui() { m_NumFramesLabel->SetLabel(CreateFileFrameCountLabel()); m_CurrentFrameLabel->SetLabel(CreateCurrentFrameLabel()); m_NumObjectsLabel->SetLabel(CreateFileObjectCountLabel()); FifoPlayer &player = FifoPlayer::GetInstance(); FifoDataFile *file = player.GetFile(); u32 frameCount = 0; if (file) frameCount = file->GetFrameCount(); m_FrameFromCtrl->SetRange(0, frameCount); m_FrameFromCtrl->SetValue(player.GetFrameRangeStart()); m_FrameToCtrl->SetRange(0, frameCount); m_FrameToCtrl->SetValue(player.GetFrameRangeEnd()); m_ObjectFromCtrl->SetValue(player.GetObjectRangeStart()); m_ObjectToCtrl->SetValue(player.GetObjectRangeEnd()); }
void FIFOPlayerWindow::UpdateInfo() { if (FifoPlayer::GetInstance().IsPlaying()) { FifoDataFile* file = FifoPlayer::GetInstance().GetFile(); m_info_label->setText( tr("%1 frame(s)\n%2 object(s)\nCurrent Frame: %3") .arg(QString::number(file->GetFrameCount()), QString::number(FifoPlayer::GetInstance().GetFrameObjectCount()), QString::number(FifoPlayer::GetInstance().GetCurrentFrameNum()))); return; } if (FifoRecorder::GetInstance().IsRecordingDone()) { FifoDataFile* file = FifoRecorder::GetInstance().GetRecordedFile(); size_t fifo_bytes = 0; size_t mem_bytes = 0; for (u32 i = 0; i < file->GetFrameCount(); ++i) { fifo_bytes += file->GetFrame(i).fifoData.size(); for (const auto& mem_update : file->GetFrame(i).memoryUpdates) mem_bytes += mem_update.data.size(); } m_info_label->setText(tr("%1 FIFO bytes\n%2 memory bytes\n%3 frames") .arg(QString::number(fifo_bytes), QString::number(mem_bytes), QString::number(file->GetFrameCount()))); return; } if (Core::IsRunning() && FifoRecorder::GetInstance().IsRecording()) { m_info_label->setText(tr("Recording...")); return; } m_info_label->setText(tr("No file loaded / recorded.")); }
bool SCoreStartupParameter::AutoSetup(EBootBS2 _BootBS2) { std::string Region(EUR_DIR); switch (_BootBS2) { case BOOT_DEFAULT: { bool bootDrive = cdio_is_cdrom(m_strFilename); // Check if the file exist, we may have gotten it from a --elf command line // that gave an incorrect file name if (!bootDrive && !File::Exists(m_strFilename)) { PanicAlertT("The specified file \"%s\" does not exist", m_strFilename.c_str()); return false; } std::string Extension; SplitPath(m_strFilename, NULL, NULL, &Extension); if (!strcasecmp(Extension.c_str(), ".gcm") || !strcasecmp(Extension.c_str(), ".iso") || !strcasecmp(Extension.c_str(), ".wbfs") || !strcasecmp(Extension.c_str(), ".ciso") || !strcasecmp(Extension.c_str(), ".gcz") || bootDrive) { m_BootType = BOOT_ISO; DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(m_strFilename.c_str()); if (pVolume == NULL) { if (bootDrive) PanicAlertT("Could not read \"%s\". " "There is no disc in the drive, or it is not a GC/Wii backup. " "Please note that original Gamecube and Wii discs cannot be read " "by most PC DVD drives.", m_strFilename.c_str()); else PanicAlertT("\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO.", m_strFilename.c_str()); return false; } m_strName = pVolume->GetName(); m_strUniqueID = pVolume->GetUniqueID(); // Check if we have a Wii disc bWii = DiscIO::IsVolumeWiiDisc(pVolume); switch (pVolume->GetCountry()) { case DiscIO::IVolume::COUNTRY_USA: bNTSC = true; Region = USA_DIR; break; case DiscIO::IVolume::COUNTRY_TAIWAN: case DiscIO::IVolume::COUNTRY_KOREA: // TODO: Should these have their own Region Dir? case DiscIO::IVolume::COUNTRY_JAPAN: bNTSC = true; Region = JAP_DIR; break; case DiscIO::IVolume::COUNTRY_EUROPE: case DiscIO::IVolume::COUNTRY_FRANCE: case DiscIO::IVolume::COUNTRY_ITALY: case DiscIO::IVolume::COUNTRY_RUSSIA: bNTSC = false; Region = EUR_DIR; break; default: if (PanicYesNoT("Your GCM/ISO file seems to be invalid (invalid country)." "\nContinue with PAL region?")) { bNTSC = false; Region = EUR_DIR; break; }else return false; } delete pVolume; } else if (!strcasecmp(Extension.c_str(), ".elf")) { bWii = CBoot::IsElfWii(m_strFilename.c_str()); Region = USA_DIR; m_BootType = BOOT_ELF; bNTSC = true; } else if (!strcasecmp(Extension.c_str(), ".dol")) { CDolLoader dolfile(m_strFilename.c_str()); bWii = dolfile.IsWii(); Region = USA_DIR; m_BootType = BOOT_DOL; bNTSC = true; } else if (!strcasecmp(Extension.c_str(), ".dff")) { bWii = true; Region = USA_DIR; bNTSC = true; m_BootType = BOOT_DFF; FifoDataFile *ddfFile = FifoDataFile::Load(m_strFilename.c_str(), true); if (ddfFile) { bWii = ddfFile->GetIsWii(); delete ddfFile; } } else if (DiscIO::CNANDContentManager::Access().GetNANDLoader(m_strFilename).IsValid()) { const DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(m_strFilename.c_str()); const DiscIO::INANDContentLoader& ContentLoader = DiscIO::CNANDContentManager::Access().GetNANDLoader(m_strFilename); if (ContentLoader.GetContentByIndex(ContentLoader.GetBootIndex()) == NULL) { //WAD is valid yet cannot be booted. Install instead. u64 installed = DiscIO::CNANDContentManager::Access().Install_WiiWAD(m_strFilename); if (installed) SuccessAlertT("The WAD has been installed successfully"); return false; //do not boot } switch (ContentLoader.GetCountry()) { case DiscIO::IVolume::COUNTRY_USA: bNTSC = true; Region = USA_DIR; break; case DiscIO::IVolume::COUNTRY_TAIWAN: case DiscIO::IVolume::COUNTRY_KOREA: // TODO: Should these have their own Region Dir? case DiscIO::IVolume::COUNTRY_JAPAN: bNTSC = true; Region = JAP_DIR; break; case DiscIO::IVolume::COUNTRY_EUROPE: case DiscIO::IVolume::COUNTRY_FRANCE: case DiscIO::IVolume::COUNTRY_ITALY: case DiscIO::IVolume::COUNTRY_RUSSIA: bNTSC = false; Region = EUR_DIR; break; default: bNTSC = false; Region = EUR_DIR; break; } bWii = true; m_BootType = BOOT_WII_NAND; if (pVolume) { m_strName = pVolume->GetName(); m_strUniqueID = pVolume->GetUniqueID(); delete pVolume; } else { // null pVolume means that we are loading from nand folder (Most Likely Wii Menu) // if this is the second boot we would be using the Name and id of the last title m_strName.clear(); m_strUniqueID.clear(); } // Use the TitleIDhex for name and/or unique ID if launching from nand folder // or if it is not ascii characters (specifically sysmenu could potentially apply to other things) char titleidstr[17]; snprintf(titleidstr, 17, "%016llx", ContentLoader.GetTitleID()); if (!m_strName.length()) { m_strName = titleidstr; } if (!m_strUniqueID.length()) { m_strUniqueID = titleidstr; } } else { PanicAlertT("Could not recognize ISO file %s", m_strFilename.c_str()); return false; } } break; case BOOT_BS2_USA: Region = USA_DIR; m_strFilename.clear(); bNTSC = true; break; case BOOT_BS2_JAP: Region = JAP_DIR; m_strFilename.clear(); bNTSC = true; break; case BOOT_BS2_EUR: Region = EUR_DIR; m_strFilename.clear(); bNTSC = false; break; } // Setup paths CheckMemcardPath(SConfig::GetInstance().m_strMemoryCardA, Region, true); CheckMemcardPath(SConfig::GetInstance().m_strMemoryCardB, Region, false); m_strSRAM = File::GetUserPath(F_GCSRAM_IDX); if (!bWii) { m_strBootROM = File::GetSysDirectory() + GC_SYS_DIR + DIR_SEP + Region + DIR_SEP GC_IPL; if (!bHLE_BS2) { if (!File::Exists(m_strBootROM)) { WARN_LOG(BOOT, "Bootrom file %s not found - using HLE.", m_strBootROM.c_str()); bHLE_BS2 = true; } } } else if (bWii && !bHLE_BS2) { WARN_LOG(BOOT, "GC bootrom file will not be loaded for Wii mode."); bHLE_BS2 = true; } return true; }
FifoDataFile *FifoDataFile::Load(const std::string &filename, bool flagsOnly) { File::IOFile file; file.Open(filename, "rb"); if (!file) return nullptr; FileHeader header; file.ReadBytes(&header, sizeof(header)); if (header.fileId != FILE_ID || header.min_loader_version > VERSION_NUMBER) { file.Close(); return nullptr; } FifoDataFile* dataFile = new FifoDataFile; dataFile->m_Flags = header.flags; if (flagsOnly) { file.Close(); return dataFile; } u32 size = std::min((u32)BP_MEM_SIZE, header.bpMemSize); file.Seek(header.bpMemOffset, SEEK_SET); file.ReadArray(dataFile->m_BPMem, size); size = std::min((u32)CP_MEM_SIZE, header.cpMemSize); file.Seek(header.cpMemOffset, SEEK_SET); file.ReadArray(dataFile->m_CPMem, size); size = std::min((u32)XF_MEM_SIZE, header.xfMemSize); file.Seek(header.xfMemOffset, SEEK_SET); file.ReadArray(dataFile->m_XFMem, size); size = std::min((u32)XF_REGS_SIZE, header.xfRegsSize); file.Seek(header.xfRegsOffset, SEEK_SET); file.ReadArray(dataFile->m_XFRegs, size); // Read frames for (u32 i = 0; i < header.frameCount; ++i) { u64 frameOffset = header.frameListOffset + (i * sizeof(FileFrameInfo)); file.Seek(frameOffset, SEEK_SET); FileFrameInfo srcFrame; file.ReadBytes(&srcFrame, sizeof(FileFrameInfo)); FifoFrameInfo dstFrame; dstFrame.fifoData = new u8[srcFrame.fifoDataSize]; dstFrame.fifoDataSize = srcFrame.fifoDataSize; dstFrame.fifoStart = srcFrame.fifoStart; dstFrame.fifoEnd = srcFrame.fifoEnd; file.Seek(srcFrame.fifoDataOffset, SEEK_SET); file.ReadBytes(dstFrame.fifoData, srcFrame.fifoDataSize); ReadMemoryUpdates(srcFrame.memoryUpdatesOffset, srcFrame.numMemoryUpdates, dstFrame.memoryUpdates, file); dataFile->AddFrame(dstFrame); } file.Close(); return dataFile; }