| 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) { |
| 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 |