X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=frontend%2Flibretro-cdrom.c;fp=frontend%2Flibretro-cdrom.c;h=654de1c5e10c56c72c4dab38e470d475fe330bc1;hb=639a3501616d3d460eb0f886ec47c5951f83705f;hp=0000000000000000000000000000000000000000;hpb=58824199e7bf045876c70c3301093dc081e470ec;p=pcsx_rearmed.git diff --git a/frontend/libretro-cdrom.c b/frontend/libretro-cdrom.c new file mode 100644 index 00000000..654de1c5 --- /dev/null +++ b/frontend/libretro-cdrom.c @@ -0,0 +1,70 @@ +#include "libretro-cdrom.h" +#include "../deps/libretro-common/cdrom/cdrom.c" +#if defined(__linux__) && !defined(ANDROID) +//#include +#endif + +static int cdrom_send_command_dummy(const libretro_vfs_implementation_file *stream, + CDROM_CMD_Direction dir, void *buf, size_t len, unsigned char *cmd, size_t cmd_len, + unsigned char *sense, size_t sense_len) +{ + return 1; +} + +static int cdrom_send_command_once(const libretro_vfs_implementation_file *stream, + CDROM_CMD_Direction dir, void *buf, size_t len, unsigned char *cmd, size_t cmd_len) +{ + unsigned char sense[CDROM_MAX_SENSE_BYTES] = {0}; + int ret = +#if defined(__linux__) && !defined(ANDROID) + cdrom_send_command_linux +#elif defined(_WIN32) && !defined(_XBOX) + cdrom_send_command_win32 +#else + cdrom_send_command_dummy +#endif + (stream, dir, buf, len, cmd, cmd_len, sense, sizeof(sense)); +#ifdef CDROM_DEBUG + if (ret && sense[2]) + cdrom_print_sense_data(sense, sizeof(sense)); +#endif + (void)cdrom_send_command_dummy; + return ret; +} + +// "extensions" to libretro-common +int cdrom_set_read_speed_x(libretro_vfs_implementation_file *stream, unsigned speed) +{ + // SET CD-ROM SPEED, DA is newer? + unsigned char cmd1[] = {0xDA, 0, speed - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + unsigned char cmd2[] = {0xBB, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + int ret; + ret = cdrom_send_command_once(stream, DIRECTION_NONE, NULL, 0, cmd1, sizeof(cmd1)); + if (ret) { + printf("DA failed\n"); +#if defined(__linux__) && !defined(ANDROID) + // doesn't work, too late? + //ret = ioctl(fileno(stream->fp), CDROM_SELECT_SPEED, &speed); +#endif + } + if (ret) { + speed = speed * 2352 * 75 / 1024; + cmd2[2] = speed >> 8; + cmd2[3] = speed; + ret = cdrom_send_command_once(stream, DIRECTION_NONE, NULL, 0, cmd2, sizeof(cmd2)); + } + return ret; +} + +int cdrom_read_sector(libretro_vfs_implementation_file *stream, + unsigned int lba, void *b) +{ + unsigned char cmd[] = {0xBE, 0, 0, 0, 0, 0, 0, 0, 1, 0xF8, 0, 0}; + cmd[2] = lba >> 24; + cmd[3] = lba >> 16; + cmd[4] = lba >> 8; + cmd[5] = lba; + return cdrom_send_command_once(stream, DIRECTION_IN, b, 2352, cmd, sizeof(cmd)); +} + +// vim:sw=3:ts=3:expandtab