29#include <EASTL/fixed_vector.h>
30#include <EASTL/functional.h>
49template <
typename T,
typename =
void>
57 std::is_enum_v<T> && std::is_same_v<uint8_t, std::underlying_type_t<T>> && CDRomDeviceStateEnumHasIdle<T>::value;
82 typedef eastl::fixed_vector<uint8_t, 16, false>
Response;
110 template <
typename U>
112 m_device.
getTOCSize(&m_result, [handle,
this](
bool success) {
128 template <
typename U>
130 m_device.
readTOC(m_toc, m_size, [handle,
this](
bool result) {
147 template <
typename U>
164 template <
typename U>
181 template <
typename U>
184 m_location = location;
197 const char *name()
const {
return m_name; }
200 ActionBase(
const char *
const name) : m_name(name) {}
201 virtual ~ActionBase() =
default;
203 virtual bool dataReady(
const Response &response);
204 virtual bool complete(
const Response &response);
205 virtual bool acknowledge(
const Response &response);
206 virtual bool end(
const Response &response);
208 void setCallback(eastl::function<
void(
bool)> &&callback);
210 void setSuccess(
bool success);
213 PlaybackLocation *getPendingLocationPtr()
const;
214 void queueGetLocationCallback(
bool success =
true);
216 friend class CDRomDevice;
217 CDRomDevice *m_device =
nullptr;
218 const char *
const m_name =
nullptr;
243 void reset(eastl::function<
void(
bool)> &&callback);
276 void getTOCSize(
unsigned *
size, eastl::function<
void(
bool)> &&callback);
298 void readTOC(
MSF *toc,
unsigned size, eastl::function<
void(
bool)> &&callback);
308 void mute(eastl::function<
void(
bool)> &&callback);
318 void unmute(eastl::function<
void(
bool)> &&callback);
347 void playCDDATrack(
unsigned track, eastl::function<
void(
bool)> &&callback);
349 void playCDDADisc(
unsigned track, eastl::function<
void(
bool)> &&callback);
350 void resumeCDDA(eastl::function<
void(
bool)> &&callback);
389 void getPlaybackLocation(PlaybackLocation *location, eastl::function<
void(PlaybackLocation *)> &&callback);
414 void setVolume(uint8_t leftToLeft, uint8_t rightToLeft, uint8_t leftToRight, uint8_t rightToRight);
435 template <Concepts::IsCDRomDeviceStateEnum S>
438 Action(
const char *
const name) : ActionBase(name) {}
440 device->switchAction(
this);
444 void setState(S state) { m_device->m_state =
static_cast<uint8_t
>(state); }
445 S
getState()
const {
return static_cast<S
>(m_device->m_state); }
452 [[nodiscard]]
bool isIdle()
const {
return m_state == 0; }
455 void switchAction(ActionBase *action);
457 void actionComplete();
461 eastl::function<
void(
bool)> m_callback;
468 bool m_success =
false;
469 bool m_blocking =
false;
470 bool m_pendingGetLocation =
false;
472 struct BlockingAction {
The action base class for the internal state machine.
Definition cdrom-device.hh:436
Action(const char *const name)
Definition cdrom-device.hh:438
S getState() const
Definition cdrom-device.hh:445
void registerMe(CDRomDevice *device)
Definition cdrom-device.hh:439
void setState(S state)
Definition cdrom-device.hh:444
A specialization of the CDRom interface.
Definition cdrom-device.hh:80
void unmute(eastl::function< void(bool)> &&callback)
Unmutes the CD audio for both CDDA and CDXA.
Definition cdrom-device-muteunmute.cpp:98
void resumeCDDA(eastl::function< void(bool)> &&callback)
Definition cdrom-device-cdda.cpp:188
unsigned getTOCSizeBlocking(GPU &)
Definition cdrom-device-toc.cpp:78
GetTOCSizeAwaiter getTOCSize()
Definition cdrom-device.hh:279
bool readTOCBlocking(MSF *toc, unsigned size, GPU &)
Definition cdrom-device-toc.cpp:167
MuteAwaiter mute()
Definition cdrom-device.hh:311
TaskQueue::Task scheduleGetTOCSize(unsigned *size)
Definition cdrom-device-toc.cpp:73
TaskQueue::Task scheduleReset()
Definition cdrom-device-reset.cpp:77
ReadTOCAwaiter readTOC(MSF *toc, unsigned size)
Definition cdrom-device.hh:301
void setVolume(uint8_t leftToLeft, uint8_t rightToLeft, uint8_t leftToRight, uint8_t rightToRight)
Set the Volume of the CDDA audio.
Definition cdrom-device-cdda.cpp:270
void playCDDADisc(MSF start, eastl::function< void(bool)> &&callback)
Definition cdrom-device-cdda.cpp:183
bool isIdle() const
Checks if the CDROM device is in idle state.
Definition cdrom-device.hh:452
void mute(eastl::function< void(bool)> &&callback)
Mutes the CD audio for both CDDA and CDXA.
Definition cdrom-device-muteunmute.cpp:61
friend class ActionBase
Definition cdrom-device.hh:459
virtual ~CDRomDevice()
Definition cdrom-device.cpp:54
void reset(eastl::function< void(bool)> &&callback)
Resets the CDRom controller.
Definition cdrom-device-reset.cpp:72
TaskQueue::Task scheduleReadTOC(MSF *toc, unsigned size)
Definition cdrom-device-toc.cpp:154
void pauseCDDA()
Pauses CDDA playback.
Definition cdrom-device-cdda.cpp:193
TaskQueue::Task scheduleGetPlaybackLocation(PlaybackLocation *location)
Definition cdrom-device-cdda.cpp:250
bool resetBlocking(GPU &)
Definition cdrom-device-reset.cpp:81
void test(const psyqo::Hardware::CDRom::CDRomCommandBuffer &commandBuffer, eastl::function< void(bool)> &&callback)
Sends a test command to the CDRom mech.
Definition cdrom-device-test.cpp:74
void playCDDATrack(MSF start, eastl::function< void(bool)> &&callback)
Begins playing CDDA audio from a given starting point.
Definition cdrom-device-cdda.cpp:173
void readSectors(uint32_t sector, uint32_t count, void *buffer, eastl::function< void(bool)> &&callback) override
Reads sectors from the CDRom.
Definition cdrom-device-readsectors.cpp:125
TaskQueue::Task scheduleMute()
Definition cdrom-device-muteunmute.cpp:66
UnmuteAwaiter unmute()
Definition cdrom-device.hh:321
GetPlaybackLocationAwaiter getPlaybackLocation()
Definition cdrom-device.hh:392
void getTOCSize(unsigned *size, eastl::function< void(bool)> &&callback)
Gets the size of the Table of Contents from the CDRom. Note that while the blocking variant is availa...
Definition cdrom-device-toc.cpp:68
void prepare()
Prepares the CDRom subsystem.
Definition cdrom-device.cpp:38
TaskQueue::Task scheduleTest(const psyqo::Hardware::CDRom::CDRomCommandBuffer &commandBuffer)
Definition cdrom-device-test.cpp:80
void testBlocking(GPU &, const psyqo::Hardware::CDRom::CDRomCommandBuffer &commandBuffer)
Definition cdrom-device-test.cpp:88
void unmuteBlocking(GPU &)
TaskQueue::Task scheduleUnmute()
Definition cdrom-device-muteunmute.cpp:103
ResetAwaiter reset()
Definition cdrom-device.hh:246
eastl::fixed_vector< uint8_t, 16, false > Response
Definition cdrom-device.hh:82
bool readSectorsBlocking(uint32_t sector, uint32_t count, void *buffer, GPU &)
Definition cdrom-device-readsectors.cpp:131
void stopCDDA()
Stops CDDA playback.
Definition cdrom-device-cdda.cpp:207
void getPlaybackLocation(PlaybackLocation *location, eastl::function< void(PlaybackLocation *)> &&callback)
Get the Playback location of the CDDA audio.
Definition cdrom-device-cdda.cpp:235
void readTOC(MSF *toc, unsigned size, eastl::function< void(bool)> &&callback)
Reads the Table of Contents from the CDRom.
Definition cdrom-device-toc.cpp:149
The base CDRom class.
Definition cdrom.hh:46
The singleton GPU class.
Definition gpu.hh:88
The Task class.
Definition task.hh:140
Definition cdrom-device.hh:56
void * result
Definition memcpy.c:47
void queueCallbackFromISR(eastl::function< void()> &&lambda)
Queues a callback to be called from the main thead.
Definition kernel.cpp:401
static int size
Definition string.h:32
Definition cdrom-device.hh:178
PlaybackLocation * await_resume()
Definition cdrom-device.hh:188
bool await_ready() const
Definition cdrom-device.hh:180
GetPlaybackLocationAwaiter(CDRomDevice &device)
Definition cdrom-device.hh:179
void await_suspend(std::coroutine_handle< U > handle)
Definition cdrom-device.hh:182
Definition cdrom-device.hh:107
bool await_ready() const
Definition cdrom-device.hh:109
GetTOCSizeAwaiter(CDRomDevice &device)
Definition cdrom-device.hh:108
void await_suspend(std::coroutine_handle< U > handle)
Definition cdrom-device.hh:111
unsigned await_resume()
Definition cdrom-device.hh:117
Definition cdrom-device.hh:144
void await_suspend(std::coroutine_handle< U > handle)
Definition cdrom-device.hh:148
bool await_resume()
Definition cdrom-device.hh:154
MuteAwaiter(CDRomDevice &device)
Definition cdrom-device.hh:145
bool await_ready() const
Definition cdrom-device.hh:146
Definition cdrom-device.hh:83
MSF relative
Definition cdrom-device.hh:84
MSF absolute
Definition cdrom-device.hh:85
unsigned index
Definition cdrom-device.hh:87
unsigned track
Definition cdrom-device.hh:86
Definition cdrom-device.hh:125
void await_suspend(std::coroutine_handle< U > handle)
Definition cdrom-device.hh:129
bool await_ready() const
Definition cdrom-device.hh:127
bool await_resume()
Definition cdrom-device.hh:135
ReadTOCAwaiter(CDRomDevice &device, MSF *toc, unsigned size)
Definition cdrom-device.hh:126
Definition cdrom-device.hh:90
ResetAwaiter(CDRomDevice &device)
Definition cdrom-device.hh:91
bool await_resume()
Definition cdrom-device.hh:100
void await_suspend(std::coroutine_handle< U > handle)
Definition cdrom-device.hh:94
bool await_ready() const
Definition cdrom-device.hh:92
Definition cdrom-device.hh:161
bool await_ready() const
Definition cdrom-device.hh:163
bool await_resume()
Definition cdrom-device.hh:171
UnmuteAwaiter(CDRomDevice &device)
Definition cdrom-device.hh:162
void await_suspend(std::coroutine_handle< U > handle)
Definition cdrom-device.hh:165
Definition cdrom-device.hh:50
Definition cdrom-commandbuffer.hh:39
static void * buffer
Definition syscalls.h:230
static const void size_t count
Definition syscalls.h:145
static int sector
Definition syscalls.h:467
void uint32_t(classId, spec)