1 #include "libretro-cdrom.h"
2 #include "../deps/libretro-common/cdrom/cdrom.c"
3 #if defined(__linux__) && !defined(ANDROID)
4 //#include <linux/cdrom.h>
7 #include "../libpcsxcore/psxcommon.h"
8 #include "../libpcsxcore/cdrom.h"
10 //#include "vfs/vfs_implementation.h"
11 #include "vfs/vfs_implementation_cdrom.h"
13 static int cdrom_send_command_dummy(const libretro_vfs_implementation_file *stream,
14 CDROM_CMD_Direction dir, void *buf, size_t len, unsigned char *cmd, size_t cmd_len,
15 unsigned char *sense, size_t sense_len)
20 static int cdrom_send_command_once(const libretro_vfs_implementation_file *stream,
21 CDROM_CMD_Direction dir, void *buf, size_t len, unsigned char *cmd, size_t cmd_len)
23 unsigned char sense[CDROM_MAX_SENSE_BYTES] = {0};
25 #if defined(__linux__) && !defined(ANDROID)
26 cdrom_send_command_linux
27 #elif defined(_WIN32) && !defined(_XBOX)
28 cdrom_send_command_win32
30 cdrom_send_command_dummy
32 (stream, dir, buf, len, cmd, cmd_len, sense, sizeof(sense));
35 cdrom_print_sense_data(sense, sizeof(sense));
37 (void)cdrom_send_command_dummy;
41 // "extensions" to libretro-common
42 int cdrom_set_read_speed_x(libretro_vfs_implementation_file *stream, unsigned speed)
44 // SET CD-ROM SPEED, DA is newer?
45 unsigned char cmd1[] = {0xDA, 0, speed - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
46 unsigned char cmd2[] = {0xBB, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
48 ret = cdrom_send_command_once(stream, DIRECTION_NONE, NULL, 0, cmd1, sizeof(cmd1));
50 #if defined(__linux__) && !defined(ANDROID)
51 // doesn't work, too late?
52 //ret = ioctl(fileno(stream->fp), CDROM_SELECT_SPEED, &speed);
56 speed = speed * 2352 * 75 / 1024;
59 ret = cdrom_send_command_once(stream, DIRECTION_NONE, NULL, 0, cmd2, sizeof(cmd2));
64 int rcdrom_readSector(void *stream, unsigned int lba, void *b)
66 unsigned char cmd[] = {0xBE, 0, 0, 0, 0, 0, 0, 0, 1, 0xF8, 0, 0};
71 return cdrom_send_command_once(stream, DIRECTION_IN, b, 2352, cmd, sizeof(cmd));
74 void *rcdrom_open(const char *name, u32 *total_lba, u32 *have_subchannel)
76 void *g_cd_handle = retro_vfs_file_open_impl(name, RETRO_VFS_FILE_ACCESS_READ,
77 RETRO_VFS_FILE_ACCESS_HINT_NONE);
79 SysPrintf("retro_vfs_file_open failed for '%s'\n", name);
83 int ret = cdrom_set_read_speed_x(g_cd_handle, 4);
84 if (ret) SysPrintf("CD speed set failed\n");
85 const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc();
86 const cdrom_track_t *last = &toc->track[toc->num_tracks - 1];
87 unsigned int lba = MSF2SECT(last->min, last->sec, last->frame);
88 *total_lba = lba + last->track_size;
90 //cdrom_get_current_config_random_readable(acdrom.h);
91 //cdrom_get_current_config_multiread(acdrom.h);
92 //cdrom_get_current_config_cdread(acdrom.h);
93 //cdrom_get_current_config_profiles(acdrom.h);
98 void rcdrom_close(void *stream)
100 retro_vfs_file_close_impl(stream);
103 int rcdrom_getTN(void *stream, u8 *tn)
105 const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc();
108 tn[1] = toc->num_tracks;
114 int rcdrom_getTD(void *stream, u32 total_lba, u8 track, u8 *rt)
116 const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc();
117 rt[0] = 0, rt[1] = 2, rt[2] = 0;
119 lba2msf(total_lba + 150, &rt[0], &rt[1], &rt[2]);
121 else if (track <= toc->num_tracks) {
123 rt[0] = toc->track[i].min;
124 rt[1] = toc->track[i].sec;
125 rt[2] = toc->track[i].frame;
130 int rcdrom_getStatus(void *stream, struct CdrStat *stat)
132 const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc();
133 stat->Type = toc->track[0].audio ? 2 : 1;
137 int rcdrom_isMediaInserted(void *stream)
139 return cdrom_is_media_inserted(stream);
142 int rcdrom_readSub(void *stream, unsigned int lba, void *b)
147 // vim:sw=3:ts=3:expandtab