diff --git a/include/PSX/File/Processor/cd_file_processor.hpp b/include/PSX/File/Processor/cd_file_processor.hpp index 58b08920..552541b4 100644 --- a/include/PSX/File/Processor/cd_file_processor.hpp +++ b/include/PSX/File/Processor/cd_file_processor.hpp @@ -30,7 +30,7 @@ namespace JabyEngine { LZ4Decompressor lz4_decomp; JobArray jobs; const AutoLBAEntry* lba = nullptr; - uint32_t*const tmp_area = nullptr; //< The start of the area to copy data to for the file processor + uint32_t* tmp_area = nullptr; void start_cur_job(); bool process_data(); @@ -38,8 +38,15 @@ namespace JabyEngine { public: CDFileProcessor() = default; - void setup(const volatile AutoLBAEntry* lba, JobArray jobs, uint32_t* tmp_area = &__heap_base); + void setup(const volatile AutoLBAEntry* lba, JobArray jobs, uint32_t* tmp_area = &__heap_base); + + template + void setup(const volatile AutoLBAEntry* lba, const CDFile (&file_array)[N], uint32_t* tmp_area = &__heap_base) { + CDFileProcessor::setup(lba, JobArray{file_array, N}, tmp_area); + } + Progress process(); + bool next() { if(this->jobs.next()) { CDFileProcessor::start_cur_job(); diff --git a/src/Library/src/File/Processor/cd_file_processor.cpp b/src/Library/src/File/Processor/cd_file_processor.cpp index 3bd92faa..3fe5550a 100644 --- a/src/Library/src/File/Processor/cd_file_processor.cpp +++ b/src/Library/src/File/Processor/cd_file_processor.cpp @@ -8,34 +8,41 @@ namespace JabyEngine { void CDFileProcessor :: start_cur_job() { using CD::internal::FileInfo; using CD::internal::SectorBufferAllocator; - const auto configurate_for = [this](const CDFile& file) -> SectorBufferAllocator { - static const auto circular_buffer_callback = [](void* ctx) -> CD_IO::DataSector* { - CDFileProcessor &self = *reinterpret_cast(ctx); - return self.circular_buffer.allocate(); + const auto configurate_for = [this](const CDFile& file) { + const auto disable_lz4 = [this](uint32_t* work_area, size_t size) -> uint32_t* { + uint8_t* dst_adr = reinterpret_cast(this->circular_buffer.setup(reinterpret_cast(work_area), size)); + + this->lz4_decomp.disable(); + return reinterpret_cast(dst_adr); + }; + + const auto enable_lz4 = [this](uint32_t* work_area, size_t size) -> uint32_t* { + uint8_t* dst_adr = reinterpret_cast(this->circular_buffer.setup(reinterpret_cast(work_area), size)); + + this->lz4_decomp.setup(dst_adr); + return reinterpret_cast(dst_adr); }; switch(file.type) { case CDFileType::SimpleTIM: - printf("CDFileProcessor: SimpleTIM not supported yet\n"); - return SectorBufferAllocator::invalid(); + this->file_state = FileProcessor::create(enable_lz4(this->tmp_area, NormalCircularBufferSize), file.payload.simple_tim); + break; case CDFileType::CopyTo: - this->circular_buffer.setup(reinterpret_cast(file.payload.copy_to.dst), 512); - this->lz4_decomp.disable(); - - this->file_state = FileProcessor::create(this->tmp_area, Nothing()); - return SectorBufferAllocator::create(this, circular_buffer_callback); - - default: - return SectorBufferAllocator::invalid(); + this->file_state = FileProcessor::create(disable_lz4(file.payload.copy_to.dst, 512), Nothing()); + break; } }; const auto& cur_job = *this->jobs.files; const auto& cur_lba = this->lba[cur_job.rel_lba_idx]; - const auto cfg = configurate_for(cur_job); - - CD::internal::read_file(FileInfo::from(cur_lba), cfg); + + configurate_for(cur_job); + CD::internal::read_file(FileInfo::from(cur_lba), SectorBufferAllocator::create(this, + [](void* ctx) -> CD_IO::DataSector* { + CDFileProcessor &self = *reinterpret_cast(ctx); + return self.circular_buffer.allocate(); + })); printf(">>> CD needs to load LBA: %i -> %i\n", cur_lba.lba, cur_lba.size_words); } @@ -66,8 +73,7 @@ namespace JabyEngine { this->lba = const_cast(lba); this->jobs = jobs; - // Setsup the circular buffer and determines where to place the temp area in - const_cast(this->tmp_area) = reinterpret_cast(this->circular_buffer.setup(reinterpret_cast(tmp_area), NormalCircularBufferSize)); + this->tmp_area = tmp_area; CDFileProcessor::start_cur_job(); }