From 961760537179fc3b2b20a7c3e7936f1bfef3efae Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sat, 29 Jun 2019 20:03:59 -0400 Subject: [PATCH] cdrom: set optimal read speed --- libretro-common/cdrom/cdrom.c | 11 +++++++++++ libretro-common/include/cdrom/cdrom.h | 2 ++ libretro-common/include/streams/file_stream.h | 3 +++ .../include/vfs/vfs_implementation_cdrom.h | 4 ++++ libretro-common/streams/file_stream.c | 5 +++++ libretro-common/vfs/vfs_implementation_cdrom.c | 5 +++++ 6 files changed, 30 insertions(+) diff --git a/libretro-common/cdrom/cdrom.c b/libretro-common/cdrom/cdrom.c index 1833d48839..8559a607b6 100644 --- a/libretro-common/cdrom/cdrom.c +++ b/libretro-common/cdrom/cdrom.c @@ -438,6 +438,15 @@ static int cdrom_read_track_info(libretro_vfs_implementation_file *stream, unsig return 0; } +int cdrom_set_read_speed(libretro_vfs_implementation_file *stream, unsigned speed) +{ + unsigned new_speed = swap_if_big32(speed); + /* MMC Command: SET CD SPEED */ + unsigned char cmd[] = {0xBB, 0, (new_speed >> 24) & 0xFF, (new_speed >> 16) & 0xFF, (new_speed >> 8) & 0xFF, new_speed & 0xFF, 0, 0, 0, 0, 0, 0 }; + + return cdrom_send_command(stream, DIRECTION_NONE, NULL, 0, cmd, sizeof(cmd), 0); +} + int cdrom_write_cue(libretro_vfs_implementation_file *stream, char **out_buf, size_t *out_len, char cdrom_drive, unsigned char *num_tracks, cdrom_toc_t *toc) { unsigned char buf[2352] = {0}; @@ -456,6 +465,8 @@ int cdrom_write_cue(libretro_vfs_implementation_file *stream, char **out_buf, si return 1; } + cdrom_set_read_speed(stream, 0xFFFFFFFF); + rv = cdrom_read_subq(stream, buf, sizeof(buf)); if (rv) diff --git a/libretro-common/include/cdrom/cdrom.h b/libretro-common/include/cdrom/cdrom.h index c431c02c84..df35c3c9c1 100644 --- a/libretro-common/include/cdrom/cdrom.h +++ b/libretro-common/include/cdrom/cdrom.h @@ -76,6 +76,8 @@ int cdrom_get_inquiry(libretro_vfs_implementation_file *stream, char *model, int int cdrom_read(libretro_vfs_implementation_file *stream, unsigned char min, unsigned char sec, unsigned char frame, void *s, size_t len, size_t skip); +int cdrom_set_read_speed(libretro_vfs_implementation_file *stream, unsigned speed); + RETRO_END_DECLS #endif diff --git a/libretro-common/include/streams/file_stream.h b/libretro-common/include/streams/file_stream.h index 8e83f6d91b..c25dfe78b5 100644 --- a/libretro-common/include/streams/file_stream.h +++ b/libretro-common/include/streams/file_stream.h @@ -36,6 +36,7 @@ #include #include +#include #define FILESTREAM_REQUIRED_VFS_VERSION 2 @@ -106,6 +107,8 @@ bool filestream_exists(const char *path); char *filestream_getline(RFILE *stream); +const libretro_vfs_implementation_file* filestream_get_vfs_handle(RFILE *stream); + RETRO_END_DECLS #endif diff --git a/libretro-common/include/vfs/vfs_implementation_cdrom.h b/libretro-common/include/vfs/vfs_implementation_cdrom.h index 9807561da2..0cd5d5fdda 100644 --- a/libretro-common/include/vfs/vfs_implementation_cdrom.h +++ b/libretro-common/include/vfs/vfs_implementation_cdrom.h @@ -27,6 +27,8 @@ RETRO_BEGIN_DECLS +typedef struct RFILE RFILE; + typedef struct { char *cue_buf; @@ -62,6 +64,8 @@ int retro_vfs_file_error_cdrom(libretro_vfs_implementation_file *stream); const cdrom_toc_t* retro_vfs_file_get_cdrom_toc(void); +const vfs_cdrom_t* retro_vfs_file_get_cdrom_position(const libretro_vfs_implementation_file *stream); + RETRO_END_DECLS #endif diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index 3d03fe3e53..aa22e0cdab 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -609,3 +609,8 @@ char *filestream_getline(RFILE *stream) newline[idx] = '\0'; return newline; } + +const libretro_vfs_implementation_file* filestream_get_vfs_handle(RFILE *stream) +{ + return (const libretro_vfs_implementation_file*)stream->hfile; +} diff --git a/libretro-common/vfs/vfs_implementation_cdrom.c b/libretro-common/vfs/vfs_implementation_cdrom.c index 23afdd2f46..8d36224523 100644 --- a/libretro-common/vfs/vfs_implementation_cdrom.c +++ b/libretro-common/vfs/vfs_implementation_cdrom.c @@ -440,3 +440,8 @@ int retro_vfs_file_error_cdrom(libretro_vfs_implementation_file *stream) { return 0; } + +const vfs_cdrom_t* retro_vfs_file_get_cdrom_position(const libretro_vfs_implementation_file *stream) +{ + return &stream->cdrom; +}