From 112a88688d711b591bfa6743214055fc40e1e459 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Wed, 3 Jul 2019 17:18:28 -0400 Subject: [PATCH] cdrom: add windows implementation for list of available drives --- libretro-common/cdrom/cdrom.c | 101 ++++++++++++++++++++++++++-------- 1 file changed, 78 insertions(+), 23 deletions(-) diff --git a/libretro-common/cdrom/cdrom.c b/libretro-common/cdrom/cdrom.c index db60157b6d..e7036062b5 100644 --- a/libretro-common/cdrom/cdrom.c +++ b/libretro-common/cdrom/cdrom.c @@ -47,6 +47,7 @@ #endif #if defined(_WIN32) && !defined(_XBOX) +#include #include #include #endif @@ -228,35 +229,39 @@ retry: (void)sense_key_text; (void)i; - switch (sense[2] & 0xF) + /* INQUIRY should never fail, don't retry */ + if (cmd[0] != 0x12) { - case 0: - case 2: - case 3: - case 4: - case 6: - if (retries_left) - { + switch (sense[2] & 0xF) + { + case 0: + case 2: + case 3: + case 4: + case 6: + if (retries_left) + { #ifdef CDROM_DEBUG - printf("CDROM Read Retry...\n"); - fflush(stdout); + printf("CDROM Read Retry...\n"); + fflush(stdout); #endif - retries_left--; - usleep(1000 * 1000); - goto retry; - } - else - { - rv = 1; + retries_left--; + usleep(1000 * 1000); + goto retry; + } + else + { + rv = 1; #ifdef CDROM_DEBUG - printf("CDROM Read Retries failed, giving up.\n"); - fflush(stdout); + printf("CDROM Read Retries failed, giving up.\n"); + fflush(stdout); #endif - } + } - break; - default: - break; + break; + default: + break; + } } #ifdef CDROM_DEBUG @@ -805,6 +810,56 @@ struct string_list* cdrom_get_available_drives(void) string_list_free(dir_list); #endif #if defined(_WIN32) && !defined(_XBOX) + DWORD drive_mask = GetLogicalDrives(); + int i; + int drive_index = 0; + + for (i = 0; i < sizeof(DWORD) * 8; i++) + { + char path[] = {"a:\\"}; + char cdrom_path[] = {"cdrom://a:/drive-track01.bin"}; + + path[0] += i; + cdrom_path[8] += i; + + /* this drive letter doesn't exist */ + if (!(drive_mask & (1 << i))) + continue; + + if (GetDriveType(path) != DRIVE_CDROM) + continue; + else + { + char drive_model[32] = {0}; + char drive_string[64] = {0}; + union string_list_elem_attr attr = {0}; + RFILE *file = filestream_open(cdrom_path, RETRO_VFS_FILE_ACCESS_READ, 0); + const libretro_vfs_implementation_file *stream; + bool is_cdrom = false; + + if (!file) + continue; + + stream = filestream_get_vfs_handle(file); + cdrom_get_inquiry(stream, drive_model, sizeof(drive_model), &is_cdrom); + filestream_close(file); + + if (!is_cdrom) + continue; + + attr.i = path[0]; + + snprintf(drive_string, sizeof(drive_string), "Drive %d: ", drive_index + 1); + + if (!string_is_empty(drive_model)) + strlcat(drive_string, drive_model, sizeof(drive_string)); + else + strlcat(drive_string, "Unknown Drive", sizeof(drive_string)); + + string_list_append(list, drive_string, attr); + drive_index++; + } + } #endif return list; }