mirror of
https://github.com/libretro/RetroArch
synced 2025-04-09 21:45:45 +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
|
#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)
|
const char* path, uint32_t track)
|
||||||
{
|
{
|
||||||
cdfs_track_t* cdfs_track;
|
cdfs_track_t* cdfs_track;
|
||||||
@ -1299,7 +1299,7 @@ static void* rc_hash_handle_cd_open_track(
|
|||||||
return NULL;
|
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* track_handle, uint32_t sector,
|
||||||
void* buffer, size_t requested_bytes)
|
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);
|
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;
|
cdfs_file_t* file = (cdfs_file_t*)track_handle;
|
||||||
if (file)
|
if (file)
|
||||||
@ -1319,8 +1319,49 @@ static void rc_hash_handle_cd_close_track(void* track_handle)
|
|||||||
CHEEVOS_FREE(file);
|
CHEEVOS_FREE(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#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 */
|
/* end hooks */
|
||||||
|
|
||||||
void rcheevos_show_mastery_placard()
|
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);
|
rc_hash_init_verbose_message_callback(rcheevos_handle_log_message);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string_is_equal_noncase(path_get_extension(info->path), "chd"))
|
rc_hash_reset_cdreader_hooks();
|
||||||
{
|
|
||||||
#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();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fetch the first hash */
|
/* fetch the first hash */
|
||||||
rc_hash_initialize_iterator(&iterator,
|
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;
|
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_default_cdreader(void);
|
||||||
void rc_hash_init_custom_cdreader(struct rc_hash_cdreader* reader);
|
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;
|
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()
|
void rc_hash_init_default_cdreader()
|
||||||
{
|
{
|
||||||
struct rc_hash_cdreader cdreader;
|
struct rc_hash_cdreader cdreader;
|
||||||
|
rc_hash_get_default_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_init_custom_cdreader(&cdreader);
|
rc_hash_init_custom_cdreader(&cdreader);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user