diff --git a/src/mips/psyqo/cdrom-device.hh b/src/mips/psyqo/cdrom-device.hh index c95905d6a..a554591e2 100644 --- a/src/mips/psyqo/cdrom-device.hh +++ b/src/mips/psyqo/cdrom-device.hh @@ -132,6 +132,7 @@ class CDRomDevice final : public CDRom { */ void reset(eastl::function &&callback); TaskQueue::Task scheduleReset(); + bool resetBlocking(GPU &); /** * @brief Reads sectors from the CDRom. @@ -151,6 +152,7 @@ class CDRomDevice final : public CDRom { */ void readSectors(uint32_t sector, uint32_t count, void *buffer, eastl::function &&callback) override; TaskQueue::Task scheduleReadSectors(uint32_t sector, uint32_t count, void *buffer); + bool readSectorsBlocking(uint32_t sector, uint32_t count, void *buffer, GPU &); /** * @brief Gets the size of the Table of Contents from the CDRom. Note that diff --git a/src/mips/psyqo/examples/cdda/cdda.cpp b/src/mips/psyqo/examples/cdda/cdda.cpp index 88c997bc2..2fef6e0c6 100644 --- a/src/mips/psyqo/examples/cdda/cdda.cpp +++ b/src/mips/psyqo/examples/cdda/cdda.cpp @@ -116,6 +116,9 @@ void CDDA::loopPlaybackTrack(unsigned track) { void CDDA::createScene() { m_font.uploadSystemFont(gpu()); pushScene(&cddaScene); + syscall_puts("CD-Rom device reset...\n"); + m_cdrom.resetBlocking(gpu()); + syscall_puts("CD-Rom device ready, getting TOC size...\n"); auto tocSize = m_cdrom.getTOCSizeBlocking(gpu()); ramsyscall_printf("CD-Rom track count: %d\n", tocSize); // Start playback of track 2, which is a good diff --git a/src/mips/psyqo/src/cdrom-device-readsectors.cpp b/src/mips/psyqo/src/cdrom-device-readsectors.cpp index 685e231a4..977d72a3a 100644 --- a/src/mips/psyqo/src/cdrom-device-readsectors.cpp +++ b/src/mips/psyqo/src/cdrom-device-readsectors.cpp @@ -142,3 +142,13 @@ psyqo::TaskQueue::Task psyqo::CDRomDevice::scheduleReadSectors(uint32_t sector, readSectors(sector, count, buffer, [task](bool success) { task->complete(success); }); }); } + +bool psyqo::CDRomDevice::readSectorsBlocking(uint32_t sector, uint32_t count, void *buffer, GPU &gpu) { + Kernel::assert(m_callback == nullptr, "CDRomDevice::readSectorsBlocking called with pending action"); + bool success = false; + { + BlockingAction blocking(this, gpu); + s_readSectorsAction.start(this, sector, count, buffer, [&success](bool success_) { success = success_; }); + } + return success; +} diff --git a/src/mips/psyqo/src/cdrom-device-reset.cpp b/src/mips/psyqo/src/cdrom-device-reset.cpp index de42ce0e8..8175311e1 100644 --- a/src/mips/psyqo/src/cdrom-device-reset.cpp +++ b/src/mips/psyqo/src/cdrom-device-reset.cpp @@ -78,3 +78,14 @@ void psyqo::CDRomDevice::reset(eastl::function &&callback) { psyqo::TaskQueue::Task psyqo::CDRomDevice::scheduleReset() { return TaskQueue::Task([this](auto task) { reset([task](bool success) { task->complete(success); }); }); } + +bool psyqo::CDRomDevice::resetBlocking(GPU &gpu) { + Kernel::assert(m_callback == nullptr, "CDRomDevice::resetBlocking called with pending action"); + unsigned size = 0; + bool success = false; + { + BlockingAction blocking(this, gpu); + s_resetAction.start(this, [&success](bool success_) { success = success_; }); + } + return success; +}