support chd inside m3u (#13586)

This commit is contained in:
Jamiras 2022-02-01 02:29:44 -07:00 committed by GitHub
parent f8c3c76e18
commit cdc5e33953
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 28 deletions

View File

@ -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,

View File

@ -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);

View File

@ -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);
}