Files
ppsspp/Core/FileSystems/CSOCompress.h
T
Claude 363d816789 Game screen: Compress game as CSO
"Compress game" in the game screen's ... menu, for ISO, CSO, CHD and PSN
EBOOT.PBP games. It opens a list of the CSO presets (and Extract to ISO
for anything that's not an ISO already):

- Best: libdeflate level 12, 64K blocks
- PSP Compatible: zlib level 9, 2K blocks, readable by custom firmware

These match maxcso's presets, and the CSOs come out byte-identical to its.
The writer, Core/FileSystems/CSOCompress, reads the input through PPSSPP's
own block devices, so recompressing is a single pass with no temporary
file.

The original is deleted when done, unless "Keep the original file" is
checked (off by default). When the new name is taken, by a kept original
or another file, a number is added to it.

The work runs on a thread using every core, with a progress bar and time
left at the bottom of the game screen. It keeps going when the screen is
left, and the ... menu offers Cancel meanwhile. On the game list the
game's icon is covered by "Compressing...", and clicking it opens the
game screen instead of playing. When done, recents follow the new file
and the game screen and lists refresh.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CCxekYqPnzNr5d8Tp1q7aZ
2026-10-19 16:01:53 +02:00

44 lines
1.8 KiB
C++

// Copyright (c) 2012- PPSSPP Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0 or later versions.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
#pragma once
#include <functional>
#include <string>
#include "Common/File/Path.h"
// Writes PSP disc images as CSO v1 or plain ISO. The input is anything PPSSPP can play as a disc
// (ISO, CSO, CHD, a PSN EBOOT.PBP), read through its own block devices, so a repack is one pass
// with no temporary file. The presets match maxcso's (LunaMoo/maxcso).
namespace CSOCompress {
enum class Preset {
Best = 0, // libdeflate level 12, 64K blocks. Small, fast to compress and quick to read.
PSPCompatible = 1, // zlib level 9, 2K blocks: what every PSP custom firmware reads.
};
// Return false to cancel.
typedef std::function<bool(float progress)> ProgressFunc;
// Blocking, and uses every core. Never overwrites, and deletes a partial output on failure or
// cancel (*cancelled is set then).
bool Compress(const Path &input, const Path &output, Preset preset, const ProgressFunc &progress, std::string *error, bool *cancelled);
bool Extract(const Path &input, const Path &output, const ProgressFunc &progress, std::string *error, bool *cancelled);
} // namespace CSOCompress