diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index ac8a4d4754..31186c439f 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -9017,3 +9017,5 @@ MSG_HASH(MSG_DISC_DUMP_FAILED_TO_READ_FROM_DRIVE, "ドライブからの読み込みに失敗しました。ダンプが中止されました。") MSG_HASH(MSG_DISC_DUMP_FAILED_TO_WRITE_TO_DISK, "ディスクに書き込みに失敗しました。ダンプが中止されました。") +MSG_HASH(MSG_NO_DISC_INSERTED, + "ドライブにディスクが挿入されていません。") diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 4b9c940597..d42cb9d00e 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -8949,3 +8949,5 @@ MSG_HASH(MSG_DISC_DUMP_FAILED_TO_READ_FROM_DRIVE, "Failed to read from drive. Dump aborted.") MSG_HASH(MSG_DISC_DUMP_FAILED_TO_WRITE_TO_DISK, "Failed to write to disk. Dump aborted.") +MSG_HASH(MSG_NO_DISC_INSERTED, + "No disc is inserted in the drive.") diff --git a/libretro-common/cdrom/cdrom.c b/libretro-common/cdrom/cdrom.c index 001508f0d4..a5d091a8d4 100644 --- a/libretro-common/cdrom/cdrom.c +++ b/libretro-common/cdrom/cdrom.c @@ -1377,6 +1377,32 @@ bool cdrom_is_media_inserted(const libretro_vfs_implementation_file *stream) return true; } +bool cdrom_drive_has_media(const char drive) +{ + RFILE *file; + char cdrom_path_bin[256]; + + cdrom_path_bin[0] = '\0'; + + cdrom_device_fillpath(cdrom_path_bin, sizeof(cdrom_path_bin), drive, 1, false); + + file = filestream_open(cdrom_path_bin, RETRO_VFS_FILE_ACCESS_READ, 0); + + if (file) + { + const libretro_vfs_implementation_file *stream = filestream_get_vfs_handle(file); + bool has_media = false; + + has_media = cdrom_is_media_inserted(stream); + + filestream_close(file); + + return has_media; + } + + return false; +} + bool cdrom_set_read_cache(const libretro_vfs_implementation_file *stream, bool enabled) { /* MMC Command: MODE SENSE (10) and MODE SELECT (10) */ diff --git a/libretro-common/include/cdrom/cdrom.h b/libretro-common/include/cdrom/cdrom.h index cc25db7623..0cf7f804a2 100644 --- a/libretro-common/include/cdrom/cdrom.h +++ b/libretro-common/include/cdrom/cdrom.h @@ -100,6 +100,8 @@ struct string_list* cdrom_get_available_drives(void); bool cdrom_is_media_inserted(const libretro_vfs_implementation_file *stream); +bool cdrom_drive_has_media(const char drive); + void cdrom_get_current_config_core(const libretro_vfs_implementation_file *stream); void cdrom_get_current_config_profiles(const libretro_vfs_implementation_file *stream); diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index ef2f32261d..234c19b2c6 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -2135,7 +2135,19 @@ static int action_ok_load_cdrom(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { #ifdef HAVE_CDROM - struct retro_system_info *system = runloop_get_libretro_system_info(); + struct retro_system_info *system; + + if (!cdrom_drive_has_media(label[0])) + { + runloop_msg_queue_push( + msg_hash_to_str(MSG_NO_DISC_INSERTED), + 1, 100, true, + NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + + return -1; + } + + system = runloop_get_libretro_system_info(); if (system && !string_is_empty(system->library_name)) { @@ -2173,6 +2185,8 @@ static int action_ok_load_cdrom(const char *path, msg_hash_to_str(MSG_LOAD_CORE_FIRST), 1, 100, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + + return -1; } #endif return 0; @@ -2184,6 +2198,16 @@ static int action_ok_dump_cdrom(const char *path, if (string_is_empty(label)) return -1; #ifdef HAVE_CDROM + if (!cdrom_drive_has_media(label[0])) + { + runloop_msg_queue_push( + msg_hash_to_str(MSG_NO_DISC_INSERTED), + 1, 100, true, + NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + + return -1; + } + task_push_cdrom_dump(label); #endif return 0; diff --git a/msg_hash.h b/msg_hash.h index ff85ea2a99..d3d60a2711 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -2440,6 +2440,7 @@ enum msg_hash_enums MSG_LOAD_CORE_FIRST, MSG_DISC_DUMP_FAILED_TO_READ_FROM_DRIVE, MSG_DISC_DUMP_FAILED_TO_WRITE_TO_DISK, + MSG_NO_DISC_INSERTED, MSG_LAST };