libretro: try to handle physical cdrom ejection
[pcsx_rearmed.git] / frontend / libretro-cdrom.c
CommitLineData
e0216409 1#include "libretro-cdrom.h"
2#include "../deps/libretro-common/cdrom/cdrom.c"
3#if defined(__linux__) && !defined(ANDROID)
4//#include <linux/cdrom.h>
5#endif
6
7static int cdrom_send_command_dummy(const libretro_vfs_implementation_file *stream,
8 CDROM_CMD_Direction dir, void *buf, size_t len, unsigned char *cmd, size_t cmd_len,
9 unsigned char *sense, size_t sense_len)
10{
11 return 1;
12}
13
14static int cdrom_send_command_once(const libretro_vfs_implementation_file *stream,
15 CDROM_CMD_Direction dir, void *buf, size_t len, unsigned char *cmd, size_t cmd_len)
16{
17 unsigned char sense[CDROM_MAX_SENSE_BYTES] = {0};
18 int ret =
19#if defined(__linux__) && !defined(ANDROID)
20 cdrom_send_command_linux
21#elif defined(_WIN32) && !defined(_XBOX)
22 cdrom_send_command_win32
23#else
24 cdrom_send_command_dummy
25#endif
26 (stream, dir, buf, len, cmd, cmd_len, sense, sizeof(sense));
27#ifdef CDROM_DEBUG
28 if (ret && sense[2])
29 cdrom_print_sense_data(sense, sizeof(sense));
30#endif
31 (void)cdrom_send_command_dummy;
32 return ret;
33}
34
35// "extensions" to libretro-common
36int cdrom_set_read_speed_x(libretro_vfs_implementation_file *stream, unsigned speed)
37{
38 // SET CD-ROM SPEED, DA is newer?
39 unsigned char cmd1[] = {0xDA, 0, speed - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
40 unsigned char cmd2[] = {0xBB, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
41 int ret;
42 ret = cdrom_send_command_once(stream, DIRECTION_NONE, NULL, 0, cmd1, sizeof(cmd1));
43 if (ret) {
e0216409 44#if defined(__linux__) && !defined(ANDROID)
45 // doesn't work, too late?
46 //ret = ioctl(fileno(stream->fp), CDROM_SELECT_SPEED, &speed);
47#endif
48 }
49 if (ret) {
50 speed = speed * 2352 * 75 / 1024;
51 cmd2[2] = speed >> 8;
52 cmd2[3] = speed;
53 ret = cdrom_send_command_once(stream, DIRECTION_NONE, NULL, 0, cmd2, sizeof(cmd2));
54 }
55 return ret;
56}
57
58int cdrom_read_sector(libretro_vfs_implementation_file *stream,
59 unsigned int lba, void *b)
60{
61 unsigned char cmd[] = {0xBE, 0, 0, 0, 0, 0, 0, 0, 1, 0xF8, 0, 0};
62 cmd[2] = lba >> 24;
63 cmd[3] = lba >> 16;
64 cmd[4] = lba >> 8;
65 cmd[5] = lba;
66 return cdrom_send_command_once(stream, DIRECTION_IN, b, 2352, cmd, sizeof(cmd));
67}
68
69// vim:sw=3:ts=3:expandtab