From c593247ecad0f829f338df3106b8f7f77a3efe56 Mon Sep 17 00:00:00 2001 From: Paul Cercueil Date: Mon, 14 Apr 2025 21:26:29 +0200 Subject: [PATCH] cdrom: Update real-CDROM API Rename cdrom_read_sector() to rcdrom_readSector(), and cdrom_is_media_inserted() to rcdrom_isMediaInserted() to match the rest of the "rcdrom" API. Update rcdrom_open() to return a handle, which will then be passed around to every other rcdrom API call. Signed-off-by: Paul Cercueil --- frontend/libretro-cdrom.c | 31 +++++++++++++------------- libpcsxcore/cdrom-async.c | 46 +++++++++++++++++++-------------------- libpcsxcore/cdrom-async.h | 15 ++++++------- 3 files changed, 44 insertions(+), 48 deletions(-) diff --git a/frontend/libretro-cdrom.c b/frontend/libretro-cdrom.c index bc10a2d5..91528d70 100644 --- a/frontend/libretro-cdrom.c +++ b/frontend/libretro-cdrom.c @@ -10,8 +10,6 @@ //#include "vfs/vfs_implementation.h" #include "vfs/vfs_implementation_cdrom.h" -void *g_cd_handle; - 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) @@ -63,8 +61,7 @@ int cdrom_set_read_speed_x(libretro_vfs_implementation_file *stream, unsigned sp return ret; } -int cdrom_read_sector(libretro_vfs_implementation_file *stream, - unsigned int lba, void *b) +int rcdrom_readSector(void *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; @@ -74,13 +71,13 @@ int cdrom_read_sector(libretro_vfs_implementation_file *stream, return cdrom_send_command_once(stream, DIRECTION_IN, b, 2352, cmd, sizeof(cmd)); } -int rcdrom_open(const char *name, u32 *total_lba) +void *rcdrom_open(const char *name, u32 *total_lba) { - g_cd_handle = retro_vfs_file_open_impl(name, RETRO_VFS_FILE_ACCESS_READ, + void *g_cd_handle = retro_vfs_file_open_impl(name, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE); if (!g_cd_handle) { SysPrintf("retro_vfs_file_open failed for '%s'\n", name); - return -1; + return NULL; } else { int ret = cdrom_set_read_speed_x(g_cd_handle, 4); @@ -93,19 +90,16 @@ int rcdrom_open(const char *name, u32 *total_lba) //cdrom_get_current_config_multiread(acdrom.h); //cdrom_get_current_config_cdread(acdrom.h); //cdrom_get_current_config_profiles(acdrom.h); - return 0; + return g_cd_handle; } } -void rcdrom_close(void) +void rcdrom_close(void *stream) { - if (g_cd_handle) { - retro_vfs_file_close_impl(g_cd_handle); - g_cd_handle = NULL; - } + retro_vfs_file_close_impl(stream); } -int rcdrom_getTN(u8 *tn) +int rcdrom_getTN(void *stream, u8 *tn) { const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc(); if (toc) { @@ -116,7 +110,7 @@ int rcdrom_getTN(u8 *tn) return -1; } -int rcdrom_getTD(u32 total_lba, u8 track, u8 *rt) +int rcdrom_getTD(void *stream, u32 total_lba, u8 track, u8 *rt) { const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc(); rt[0] = 0, rt[1] = 2, rt[2] = 0; @@ -132,11 +126,16 @@ int rcdrom_getTD(u32 total_lba, u8 track, u8 *rt) return 0; } -int rcdrom_getStatus(struct CdrStat *stat) +int rcdrom_getStatus(void *stream, struct CdrStat *stat) { const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc(); stat->Type = toc->track[0].audio ? 2 : 1; return 0; } +int rcdrom_isMediaInserted(void *stream) +{ + return cdrom_is_media_inserted(stream); +} + // vim:sw=3:ts=3:expandtab diff --git a/libpcsxcore/cdrom-async.c b/libpcsxcore/cdrom-async.c index 494b4174..a694c2a8 100644 --- a/libpcsxcore/cdrom-async.c +++ b/libpcsxcore/cdrom-async.c @@ -24,27 +24,22 @@ #define acdrom_dbg(...) #endif -#ifdef HAVE_CDROM - -extern void *g_cd_handle; - -#elif defined(USE_ASYNC_CDROM) +#ifdef USE_ASYNC_CDROM -#define g_cd_handle 0 +static void *g_cd_handle; -static int rcdrom_open(const char *name, u32 *total_lba) { return -1; } -static void rcdrom_close(void) {} -static int rcdrom_getTN(u8 *tn) { return -1; } -static int rcdrom_getTD(u32 total_lba, u8 track, u8 *rt) { return -1; } -static int rcdrom_getStatus(struct CdrStat *stat) { return -1; } +#ifndef HAVE_CDROM -static int cdrom_read_sector(void *stream, unsigned int lba, void *b) { return -1; } -static int cdrom_is_media_inserted(void *stream) { return 0; } +static void *rcdrom_open(const char *name, u32 *total_lba) { return NULL; } +static void rcdrom_close(void *stream) {} +static int rcdrom_getTN(void *stream, u8 *tn) { return -1; } +static int rcdrom_getTD(void *stream, u32 total_lba, u8 track, u8 *rt) { return -1; } +static int rcdrom_getStatus(void *stream, struct CdrStat *stat) { return -1; } +static int rcdrom_readSector(void *stream, unsigned int lba, void *b) { return -1; } +static int rcdrom_isMediaInserted(void *stream) { return 0; } #endif -#ifdef USE_ASYNC_CDROM - #include "../frontend/libretro-rthreads.h" #include "retro_timers.h" @@ -74,7 +69,7 @@ static void lbacache_do(u32 lba) lba2msf(lba + 150, &msf[0], &msf[1], &msf[2]); slock_lock(acdrom.read_lock); if (g_cd_handle) - ret = cdrom_read_sector(g_cd_handle, lba, buf); + ret = rcdrom_readSector(g_cd_handle, lba, buf); else ret = ISOreadTrack(msf, buf); if (acdrom.have_subchannel) @@ -231,8 +226,11 @@ int cdra_open(void) acdrom_dbg("%s %s\n", __func__, name); acdrom.have_subchannel = 0; - if (!strncmp(name, "cdrom:", 6)) - ret = rcdrom_open(name, &acdrom.total_lba); + if (!strncmp(name, "cdrom:", 6)) { + g_cd_handle = rcdrom_open(name, &acdrom.total_lba); + if (!!g_cd_handle) + ret = 0; + } // try ISO even if it's cdrom:// as it might work through libretro vfs if (ret < 0) { @@ -256,7 +254,7 @@ void cdra_close(void) acdrom_dbg("%s\n", __func__); cdra_stop_thread(); if (g_cd_handle) - rcdrom_close(); + rcdrom_close(g_cd_handle); else ISOclose(); } @@ -265,7 +263,7 @@ int cdra_getTN(unsigned char *tn) { int ret; if (g_cd_handle) - ret = rcdrom_getTN(tn); + ret = rcdrom_getTN(g_cd_handle, tn); else ret = ISOgetTN(tn); acdrom_dbg("%s -> %d %d\n", __func__, tn[0], tn[1]); @@ -276,7 +274,7 @@ int cdra_getTD(int track, unsigned char *rt) { int ret; if (g_cd_handle) - ret = rcdrom_getTD(acdrom.total_lba, track, rt); + ret = rcdrom_getTD(g_cd_handle, acdrom.total_lba, track, rt); else ret = ISOgetTD(track, rt); //acdrom_dbg("%s %d -> %d:%02d:%02d\n", __func__, track, rt[2], rt[1], rt[0]); @@ -327,7 +325,7 @@ static int cdra_do_read(const unsigned char *time, int cdda, if (!buf) buf = acdrom.buf_local; if (g_cd_handle) - ret = cdrom_read_sector(g_cd_handle, lba, buf); + ret = rcdrom_readSector(g_cd_handle, lba, buf); else if (buf_sub) ret = ISOreadSub(time, buf_sub); else if (cdda) @@ -388,7 +386,7 @@ int cdra_getStatus(struct CdrStat *stat) int ret; CDR__getStatus(stat); if (g_cd_handle) - ret = rcdrom_getStatus(stat); + ret = rcdrom_getStatus(g_cd_handle, stat); else ret = ISOgetStatus(stat); return ret; @@ -404,7 +402,7 @@ int cdra_check_eject(int *inserted) if (!g_cd_handle || acdrom.do_prefetch || acdrom.check_eject_delay-- > 0) return 0; acdrom.check_eject_delay = 100; - *inserted = cdrom_is_media_inserted(g_cd_handle); // 1-2ms + *inserted = rcdrom_isMediaInserted(g_cd_handle); // 1-2ms return 1; } diff --git a/libpcsxcore/cdrom-async.h b/libpcsxcore/cdrom-async.h index 969c9f9d..0dc632a8 100644 --- a/libpcsxcore/cdrom-async.h +++ b/libpcsxcore/cdrom-async.h @@ -7,14 +7,13 @@ extern "C" { struct CdrStat; #ifdef HAVE_CDROM -int rcdrom_open(const char *name, u32 *total_lba); -void rcdrom_close(void); -int rcdrom_getTN(u8 *tn); -int rcdrom_getTD(u32 total_lba, u8 track, u8 *rt); -int rcdrom_getStatus(struct CdrStat *stat); - -int cdrom_read_sector(void *stream, unsigned int lba, void *b); -int cdrom_is_media_inserted(void *stream); +void *rcdrom_open(const char *name, u32 *total_lba); +void rcdrom_close(void *stream); +int rcdrom_getTN(void *stream, u8 *tn); +int rcdrom_getTD(void *stream, u32 total_lba, u8 track, u8 *rt); +int rcdrom_getStatus(void *stream, struct CdrStat *stat); +int rcdrom_readSector(void *stream, unsigned int lba, void *b); +int rcdrom_isMediaInserted(void *stream); #endif int cdra_init(void); -- 2.39.5