cdrom: Update real-CDROM API
authorPaul Cercueil <paul@crapouillou.net>
Mon, 14 Apr 2025 19:26:29 +0000 (21:26 +0200)
committernotaz <notasas@gmail.com>
Tue, 22 Apr 2025 22:07:51 +0000 (01:07 +0300)
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 <paul@crapouillou.net>
frontend/libretro-cdrom.c
libpcsxcore/cdrom-async.c
libpcsxcore/cdrom-async.h

index bc10a2d..91528d7 100644 (file)
@@ -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
index 494b417..a694c2a 100644 (file)
 #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;
 }
 
index 969c9f9..0dc632a 100644 (file)
@@ -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);