//#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)
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;
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);
//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) {
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;
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
#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"
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)
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) {
acdrom_dbg("%s\n", __func__);
cdra_stop_thread();
if (g_cd_handle)
- rcdrom_close();
+ rcdrom_close(g_cd_handle);
else
ISOclose();
}
{
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]);
{
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]);
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)
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;
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;
}
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);