From e0bb48740eb36639ed28db162c69bd3a7b3235b0 Mon Sep 17 00:00:00 2001 From: Paul Cercueil <paul@crapouillou.net> Date: Mon, 14 Apr 2025 21:21:51 +0200 Subject: [PATCH] cdrom: Move libretro specific stuff out of libpcsxcore This stuff doesn't belong here, and prevents other emulators using libpcsxcore from implementing the new async CDROM API properly. Signed-off-by: Paul Cercueil <paul@crapouillou.net> --- frontend/libretro-cdrom.c | 73 +++++++++++++++++++++++++++++++++++++++ libpcsxcore/cdrom-async.c | 71 +------------------------------------ libpcsxcore/cdrom-async.h | 12 +++++++ 3 files changed, 86 insertions(+), 70 deletions(-) diff --git a/frontend/libretro-cdrom.c b/frontend/libretro-cdrom.c index 1c71f8a2..bc10a2d5 100644 --- a/frontend/libretro-cdrom.c +++ b/frontend/libretro-cdrom.c @@ -4,6 +4,14 @@ //#include <linux/cdrom.h> #endif +#include "../libpcsxcore/psxcommon.h" +#include "../libpcsxcore/cdrom.h" + +//#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) @@ -66,4 +74,69 @@ 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) +{ + 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; + } + else { + int ret = cdrom_set_read_speed_x(g_cd_handle, 4); + if (ret) SysPrintf("CD speed set failed\n"); + const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc(); + const cdrom_track_t *last = &toc->track[toc->num_tracks - 1]; + unsigned int lba = MSF2SECT(last->min, last->sec, last->frame); + *total_lba = lba + last->track_size; + //cdrom_get_current_config_random_readable(acdrom.h); + //cdrom_get_current_config_multiread(acdrom.h); + //cdrom_get_current_config_cdread(acdrom.h); + //cdrom_get_current_config_profiles(acdrom.h); + return 0; + } +} + +void rcdrom_close(void) +{ + if (g_cd_handle) { + retro_vfs_file_close_impl(g_cd_handle); + g_cd_handle = NULL; + } +} + +int rcdrom_getTN(u8 *tn) +{ + const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc(); + if (toc) { + tn[0] = 1; + tn[1] = toc->num_tracks; + return 0; + } + return -1; +} + +int rcdrom_getTD(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; + if (track == 0) { + lba2msf(total_lba + 150, &rt[0], &rt[1], &rt[2]); + } + else if (track <= toc->num_tracks) { + int i = track - 1; + rt[0] = toc->track[i].min; + rt[1] = toc->track[i].sec; + rt[2] = toc->track[i].frame; + } + return 0; +} + +int rcdrom_getStatus(struct CdrStat *stat) +{ + const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc(); + stat->Type = toc->track[0].audio ? 2 : 1; + return 0; +} + // vim:sw=3:ts=3:expandtab diff --git a/libpcsxcore/cdrom-async.c b/libpcsxcore/cdrom-async.c index fadb774a..494b4174 100644 --- a/libpcsxcore/cdrom-async.c +++ b/libpcsxcore/cdrom-async.c @@ -26,76 +26,7 @@ #ifdef HAVE_CDROM -#include "vfs/vfs_implementation.h" -#include "vfs/vfs_implementation_cdrom.h" -#include "../frontend/libretro-cdrom.h" - -static libretro_vfs_implementation_file *g_cd_handle; - -static int rcdrom_open(const char *name, u32 *total_lba) -{ - 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; - } - else { - int ret = cdrom_set_read_speed_x(g_cd_handle, 4); - if (ret) SysPrintf("CD speed set failed\n"); - const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc(); - const cdrom_track_t *last = &toc->track[toc->num_tracks - 1]; - unsigned int lba = MSF2SECT(last->min, last->sec, last->frame); - *total_lba = lba + last->track_size; - //cdrom_get_current_config_random_readable(acdrom.h); - //cdrom_get_current_config_multiread(acdrom.h); - //cdrom_get_current_config_cdread(acdrom.h); - //cdrom_get_current_config_profiles(acdrom.h); - return 0; - } -} - -static void rcdrom_close(void) -{ - if (g_cd_handle) { - retro_vfs_file_close_impl(g_cd_handle); - g_cd_handle = NULL; - } -} - -static int rcdrom_getTN(u8 *tn) -{ - const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc(); - if (toc) { - tn[0] = 1; - tn[1] = toc->num_tracks; - return 0; - } - return -1; -} - -static int rcdrom_getTD(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; - if (track == 0) { - lba2msf(total_lba + 150, &rt[0], &rt[1], &rt[2]); - } - else if (track <= toc->num_tracks) { - int i = track - 1; - rt[0] = toc->track[i].min; - rt[1] = toc->track[i].sec; - rt[2] = toc->track[i].frame; - } - return 0; -} - -static int rcdrom_getStatus(struct CdrStat *stat) -{ - const cdrom_toc_t *toc = retro_vfs_file_get_cdrom_toc(); - stat->Type = toc->track[0].audio ? 2 : 1; - return 0; -} +extern void *g_cd_handle; #elif defined(USE_ASYNC_CDROM) diff --git a/libpcsxcore/cdrom-async.h b/libpcsxcore/cdrom-async.h index c72ca9c7..969c9f9d 100644 --- a/libpcsxcore/cdrom-async.h +++ b/libpcsxcore/cdrom-async.h @@ -1,3 +1,4 @@ +#include "psxcommon.h" #ifdef __cplusplus extern "C" { @@ -5,6 +6,17 @@ 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); +#endif + int cdra_init(void); void cdra_shutdown(void); int cdra_open(void); -- 2.39.5