physical cdrom readahead
[pcsx_rearmed.git] / frontend / libretro-cdrom.c
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       printf("DA failed\n");
45 #if defined(__linux__) && !defined(ANDROID)
46       // doesn't work, too late?
47       //ret = ioctl(fileno(stream->fp), CDROM_SELECT_SPEED, &speed);
48 #endif
49    }
50    if (ret) {
51       speed = speed * 2352 * 75 / 1024;
52       cmd2[2] = speed >> 8;
53       cmd2[3] = speed;
54       ret = cdrom_send_command_once(stream, DIRECTION_NONE, NULL, 0, cmd2, sizeof(cmd2));
55    }
56    return ret;
57 }
58
59 int cdrom_read_sector(libretro_vfs_implementation_file *stream,
60       unsigned int lba, void *b)
61 {
62    unsigned char cmd[] = {0xBE, 0, 0, 0, 0, 0, 0, 0, 1, 0xF8, 0, 0};
63    cmd[2] = lba >> 24;
64    cmd[3] = lba >> 16;
65    cmd[4] = lba >> 8;
66    cmd[5] = lba;
67    return cdrom_send_command_once(stream, DIRECTION_IN, b, 2352, cmd, sizeof(cmd));
68 }
69
70 // vim:sw=3:ts=3:expandtab