639a3501 |
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 | |
7 | static 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 | |
14 | static 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 |
36 | int 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) { |
639a3501 |
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 | |
58 | int 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 |