29#include <EASTL/fixed_vector.h>
30#include <EASTL/functional.h>
48template <
typename T,
typename =
void>
56 std::is_enum_v<T> && std::is_same_v<uint8_t, std::underlying_type_t<T>> && CDRomDeviceStateEnumHasIdle<T>::value;
81 typedef eastl::fixed_vector<uint8_t, 16, false>
Response;
109 template <
typename U>
111 m_device.
getTOCSize(&m_result, [handle,
this](
bool success) {
127 template <
typename U>
129 m_device.
readTOC(m_toc, m_size, [handle,
this](
bool result) {
146 template <
typename U>
163 template <
typename U>
180 template <
typename U>
183 m_location = location;
196 const char *name()
const {
return m_name; }
199 ActionBase(
const char *
const name) : m_name(name) {}
200 virtual ~ActionBase() =
default;
202 virtual bool dataReady(
const Response &response);
203 virtual bool complete(
const Response &response);
204 virtual bool acknowledge(
const Response &response);
205 virtual bool end(
const Response &response);
207 void setCallback(eastl::function<
void(
bool)> &&callback);
209 void setSuccess(
bool success);
212 PlaybackLocation *getPendingLocationPtr()
const;
213 void queueGetLocationCallback(
bool success =
true);
215 friend class CDRomDevice;
216 CDRomDevice *m_device =
nullptr;
217 const char *
const m_name =
nullptr;
242 void reset(eastl::function<
void(
bool)> &&callback);
275 void getTOCSize(
unsigned *
size, eastl::function<
void(
bool)> &&callback);
297 void readTOC(
MSF *toc,
unsigned size, eastl::function<
void(
bool)> &&callback);
307 void mute(eastl::function<
void(
bool)> &&callback);
317 void unmute(eastl::function<
void(
bool)> &&callback);
346 void playCDDATrack(
unsigned track, eastl::function<
void(
bool)> &&callback);
348 void playCDDADisc(
unsigned track, eastl::function<
void(
bool)> &&callback);
349 void resumeCDDA(eastl::function<
void(
bool)> &&callback);
388 void getPlaybackLocation(PlaybackLocation *location, eastl::function<
void(PlaybackLocation *)> &&callback);
413 void setVolume(uint8_t leftToLeft, uint8_t rightToLeft, uint8_t leftToRight, uint8_t rightToRight);
425 template <Concepts::IsCDRomDeviceStateEnum S>
428 Action(
const char *
const name) : ActionBase(name) {}
430 device->switchAction(
this);
434 void setState(S state) { m_device->m_state =
static_cast<uint8_t
>(state); }
435 S
getState()
const {
return static_cast<S
>(m_device->m_state); }
442 [[nodiscard]]
bool isIdle()
const {
return m_state == 0; }
445 void switchAction(ActionBase *action);
447 void actionComplete();
451 eastl::function<
void(
bool)> m_callback;
458 bool m_success =
false;
459 bool m_blocking =
false;
460 bool m_pendingGetLocation =
false;
462 struct BlockingAction {
The action base class for the internal state machine.
Definition cdrom-device.hh:426
Action(const char *const name)
Definition cdrom-device.hh:428
S getState() const
Definition cdrom-device.hh:435
void registerMe(CDRomDevice *device)
Definition cdrom-device.hh:429
void setState(S state)
Definition cdrom-device.hh:434
A specialization of the CDRom interface.
Definition cdrom-device.hh:79
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:278
bool readTOCBlocking(MSF *toc, unsigned size, GPU &)
Definition cdrom-device-toc.cpp:167
MuteAwaiter mute()
Definition cdrom-device.hh:310
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:300
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:442
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:449
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 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:320
GetPlaybackLocationAwaiter getPlaybackLocation()
Definition cdrom-device.hh:391
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
void unmuteBlocking(GPU &)
TaskQueue::Task scheduleUnmute()
Definition cdrom-device-muteunmute.cpp:103
ResetAwaiter reset()
Definition cdrom-device.hh:245
eastl::fixed_vector< uint8_t, 16, false > Response
Definition cdrom-device.hh:81
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:55
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:382
Definition cdrom-loader.hh:39
static int size
Definition string.h:32
Definition cdrom-device.hh:177
PlaybackLocation * await_resume()
Definition cdrom-device.hh:187
bool await_ready() const
Definition cdrom-device.hh:179
GetPlaybackLocationAwaiter(CDRomDevice &device)
Definition cdrom-device.hh:178
void await_suspend(std::coroutine_handle< U > handle)
Definition cdrom-device.hh:181
Definition cdrom-device.hh:106
bool await_ready() const
Definition cdrom-device.hh:108
GetTOCSizeAwaiter(CDRomDevice &device)
Definition cdrom-device.hh:107
void await_suspend(std::coroutine_handle< U > handle)
Definition cdrom-device.hh:110
unsigned await_resume()
Definition cdrom-device.hh:116
Definition cdrom-device.hh:143
void await_suspend(std::coroutine_handle< U > handle)
Definition cdrom-device.hh:147
bool await_resume()
Definition cdrom-device.hh:153
MuteAwaiter(CDRomDevice &device)
Definition cdrom-device.hh:144
bool await_ready() const
Definition cdrom-device.hh:145
Definition cdrom-device.hh:82
MSF relative
Definition cdrom-device.hh:83
MSF absolute
Definition cdrom-device.hh:84
unsigned index
Definition cdrom-device.hh:86
unsigned track
Definition cdrom-device.hh:85
Definition cdrom-device.hh:124
void await_suspend(std::coroutine_handle< U > handle)
Definition cdrom-device.hh:128
bool await_ready() const
Definition cdrom-device.hh:126
bool await_resume()
Definition cdrom-device.hh:134
ReadTOCAwaiter(CDRomDevice &device, MSF *toc, unsigned size)
Definition cdrom-device.hh:125
Definition cdrom-device.hh:89
ResetAwaiter(CDRomDevice &device)
Definition cdrom-device.hh:90
bool await_resume()
Definition cdrom-device.hh:99
void await_suspend(std::coroutine_handle< U > handle)
Definition cdrom-device.hh:93
bool await_ready() const
Definition cdrom-device.hh:91
Definition cdrom-device.hh:160
bool await_ready() const
Definition cdrom-device.hh:162
bool await_resume()
Definition cdrom-device.hh:170
UnmuteAwaiter(CDRomDevice &device)
Definition cdrom-device.hh:161
void await_suspend(std::coroutine_handle< U > handle)
Definition cdrom-device.hh:164
Definition cdrom-device.hh:49
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)