mirror of
https://github.com/libretro/RetroArch
synced 2025-03-29 22:20:21 +00:00
support chd inside m3u (#13586)
This commit is contained in:
parent
f8c3c76e18
commit
cdc5e33953
@ -1262,7 +1262,7 @@ static void rc_hash_handle_file_close(void* file_handle)
|
||||
}
|
||||
|
||||
#ifdef HAVE_CHD
|
||||
static void* rc_hash_handle_cd_open_track(
|
||||
static void* rc_hash_handle_chd_open_track(
|
||||
const char* path, uint32_t track)
|
||||
{
|
||||
cdfs_track_t* cdfs_track;
|
||||
@ -1299,7 +1299,7 @@ static void* rc_hash_handle_cd_open_track(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static size_t rc_hash_handle_cd_read_sector(
|
||||
static size_t rc_hash_handle_chd_read_sector(
|
||||
void* track_handle, uint32_t sector,
|
||||
void* buffer, size_t requested_bytes)
|
||||
{
|
||||
@ -1309,7 +1309,7 @@ static size_t rc_hash_handle_cd_read_sector(
|
||||
return cdfs_read_file(file, buffer, requested_bytes);
|
||||
}
|
||||
|
||||
static void rc_hash_handle_cd_close_track(void* track_handle)
|
||||
static void rc_hash_handle_chd_close_track(void* track_handle)
|
||||
{
|
||||
cdfs_file_t* file = (cdfs_file_t*)track_handle;
|
||||
if (file)
|
||||
@ -1319,8 +1319,49 @@ static void rc_hash_handle_cd_close_track(void* track_handle)
|
||||
CHEEVOS_FREE(file);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void rc_hash_reset_cdreader_hooks(void);
|
||||
|
||||
static void* rc_hash_handle_cd_open_track(
|
||||
const char* path, uint32_t track)
|
||||
{
|
||||
struct rc_hash_cdreader cdreader;
|
||||
|
||||
if (string_is_equal_noncase(path_get_extension(path), "chd"))
|
||||
{
|
||||
#ifdef HAVE_CHD
|
||||
/* special handlers for CHD file */
|
||||
memset(&cdreader, 0, sizeof(cdreader));
|
||||
cdreader.open_track = rc_hash_handle_cd_open_track;
|
||||
cdreader.read_sector = rc_hash_handle_chd_read_sector;
|
||||
cdreader.close_track = rc_hash_handle_chd_close_track;
|
||||
rc_hash_init_custom_cdreader(&cdreader);
|
||||
|
||||
return rc_hash_handle_chd_open_track(path, track);
|
||||
#else
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Cannot generate hash from CHD without HAVE_CHD compile flag\n");
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/* not a CHD file, use the default handlers */
|
||||
rc_hash_get_default_cdreader(&cdreader);
|
||||
rc_hash_reset_cdreader_hooks();
|
||||
return cdreader.open_track(path, track);
|
||||
}
|
||||
}
|
||||
|
||||
static void rc_hash_reset_cdreader_hooks()
|
||||
{
|
||||
struct rc_hash_cdreader cdreader;
|
||||
rc_hash_get_default_cdreader(&cdreader);
|
||||
cdreader.open_track = rc_hash_handle_cd_open_track;
|
||||
rc_hash_init_custom_cdreader(&cdreader);
|
||||
}
|
||||
|
||||
/* end hooks */
|
||||
|
||||
void rcheevos_show_mastery_placard()
|
||||
@ -1703,25 +1744,7 @@ static bool rcheevos_identify_game(const struct retro_game_info* info)
|
||||
rc_hash_init_verbose_message_callback(rcheevos_handle_log_message);
|
||||
}
|
||||
|
||||
if (string_is_equal_noncase(path_get_extension(info->path), "chd"))
|
||||
{
|
||||
#ifdef HAVE_CHD
|
||||
struct rc_hash_cdreader cdreader;
|
||||
memset(&cdreader, 0, sizeof(cdreader));
|
||||
cdreader.open_track = rc_hash_handle_cd_open_track;
|
||||
cdreader.read_sector = rc_hash_handle_cd_read_sector;
|
||||
cdreader.close_track = rc_hash_handle_cd_close_track;
|
||||
rc_hash_init_custom_cdreader(&cdreader);
|
||||
#else
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Cannot generate hash from CHD without HAVE_CHD compile flag\n");
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/* cdfs_ functions don't support gdi files or first track sector calculations */
|
||||
rc_hash_init_default_cdreader();
|
||||
}
|
||||
rc_hash_reset_cdreader_hooks();
|
||||
|
||||
/* fetch the first hash */
|
||||
rc_hash_initialize_iterator(&iterator,
|
||||
|
1
deps/rcheevos/include/rc_hash.h
vendored
1
deps/rcheevos/include/rc_hash.h
vendored
@ -120,6 +120,7 @@ extern "C" {
|
||||
rc_hash_cdreader_first_track_sector_handler first_track_sector;
|
||||
};
|
||||
|
||||
void rc_hash_get_default_cdreader(struct rc_hash_cdreader* cdreader);
|
||||
void rc_hash_init_default_cdreader(void);
|
||||
void rc_hash_init_custom_cdreader(struct rc_hash_cdreader* reader);
|
||||
|
||||
|
15
deps/rcheevos/src/rhash/cdreader.c
vendored
15
deps/rcheevos/src/rhash/cdreader.c
vendored
@ -836,14 +836,17 @@ static uint32_t cdreader_first_track_sector(void* track_handle)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rc_hash_get_default_cdreader(struct rc_hash_cdreader* cdreader)
|
||||
{
|
||||
cdreader->open_track = cdreader_open_track;
|
||||
cdreader->read_sector = cdreader_read_sector;
|
||||
cdreader->close_track = cdreader_close_track;
|
||||
cdreader->first_track_sector = cdreader_first_track_sector;
|
||||
}
|
||||
|
||||
void rc_hash_init_default_cdreader()
|
||||
{
|
||||
struct rc_hash_cdreader cdreader;
|
||||
|
||||
cdreader.open_track = cdreader_open_track;
|
||||
cdreader.read_sector = cdreader_read_sector;
|
||||
cdreader.close_track = cdreader_close_track;
|
||||
cdreader.first_track_sector = cdreader_first_track_sector;
|
||||
|
||||
rc_hash_get_default_cdreader(&cdreader);
|
||||
rc_hash_init_custom_cdreader(&cdreader);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user