CD-ROM: Optimize Windows IOCTL disc change checking.
This commit is contained in:
@@ -46,6 +46,7 @@
|
|||||||
cdrom_t cdrom[CDROM_NUM] = { 0 };
|
cdrom_t cdrom[CDROM_NUM] = { 0 };
|
||||||
|
|
||||||
int cdrom_interface_current;
|
int cdrom_interface_current;
|
||||||
|
int cdrom_assigned_letters = 0;
|
||||||
|
|
||||||
#ifdef ENABLE_CDROM_LOG
|
#ifdef ENABLE_CDROM_LOG
|
||||||
int cdrom_do_log = ENABLE_CDROM_LOG;
|
int cdrom_do_log = ENABLE_CDROM_LOG;
|
||||||
@@ -2795,6 +2796,8 @@ cdrom_global_init(void)
|
|||||||
void
|
void
|
||||||
cdrom_hard_reset(void)
|
cdrom_hard_reset(void)
|
||||||
{
|
{
|
||||||
|
cdrom_assigned_letters = 0;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < CDROM_NUM; i++) {
|
for (uint8_t i = 0; i < CDROM_NUM; i++) {
|
||||||
cdrom_t *dev = &cdrom[i];
|
cdrom_t *dev = &cdrom[i];
|
||||||
|
|
||||||
@@ -2825,6 +2828,7 @@ cdrom_hard_reset(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dev->cd_status = CD_STATUS_EMPTY;
|
dev->cd_status = CD_STATUS_EMPTY;
|
||||||
|
dev->host_letter = 0xff;
|
||||||
|
|
||||||
if (strlen(dev->image_path) > 0) {
|
if (strlen(dev->image_path) > 0) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|||||||
@@ -335,6 +335,8 @@ typedef struct cdrom {
|
|||||||
uint8_t subch_buffer[96];
|
uint8_t subch_buffer[96];
|
||||||
|
|
||||||
int cdrom_sector_size;
|
int cdrom_sector_size;
|
||||||
|
/* Only used on Windows hosts for disc change notifications. */
|
||||||
|
uint8_t host_letter;
|
||||||
|
|
||||||
/* Needs some extra breathing space in case of overflows. */
|
/* Needs some extra breathing space in case of overflows. */
|
||||||
uint8_t raw_buffer[4096];
|
uint8_t raw_buffer[4096];
|
||||||
@@ -437,6 +439,8 @@ extern int cdrom_is_empty(const uint8_t id);
|
|||||||
extern void cdrom_eject(const uint8_t id);
|
extern void cdrom_eject(const uint8_t id);
|
||||||
extern void cdrom_reload(const uint8_t id);
|
extern void cdrom_reload(const uint8_t id);
|
||||||
|
|
||||||
|
extern int cdrom_assigned_letters;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -157,27 +157,16 @@ WindowsRawInputFilter::~WindowsRawInputFilter()
|
|||||||
static void
|
static void
|
||||||
notify_drives(ULONG unitmask, int empty)
|
notify_drives(ULONG unitmask, int empty)
|
||||||
{
|
{
|
||||||
char p[1024] = { 0 };
|
if (unitmask & cdrom_assigned_letters) for (int i = 0; i < CDROM_NUM; i++) {
|
||||||
|
cdrom_t *dev = &(cdrom[i]);
|
||||||
|
|
||||||
for (int i = 0; i < 26; ++i) {
|
if ((dev->host_letter != 0xff) &&
|
||||||
if (unitmask & (1 << i)) {
|
(unitmask & (1 << dev->host_letter))) {
|
||||||
cdrom_t *dev = NULL;
|
if (empty)
|
||||||
|
cdrom_set_empty(dev);
|
||||||
sprintf(p, "ioctl://\\\\.\\%c:", 'A' + i);
|
else
|
||||||
|
cdrom_update_status(dev);
|
||||||
for (int i = 0; i < CDROM_NUM; i++)
|
|
||||||
if (!stricmp(cdrom[i].image_path, p)) {
|
|
||||||
dev = &(cdrom[i]);
|
|
||||||
if (empty)
|
|
||||||
cdrom_set_empty(dev);
|
|
||||||
else
|
|
||||||
cdrom_update_status(dev);
|
|
||||||
// pclog("CD-ROM %i : Drive notified of media %s\n",
|
|
||||||
// dev->id, empty ? "removal" : "change");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unitmask = unitmask >> 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -748,6 +748,11 @@ ioctl_close(void *local)
|
|||||||
|
|
||||||
log_close(ioctl->log);
|
log_close(ioctl->log);
|
||||||
ioctl->log = NULL;
|
ioctl->log = NULL;
|
||||||
|
|
||||||
|
cdrom_assigned_letters &= ~(1 << ioctl->dev->host_letter);
|
||||||
|
ioctl->dev->host_letter = 0xff;
|
||||||
|
|
||||||
|
free(ioctl);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -788,19 +793,22 @@ ioctl_open(cdrom_t *dev, const char *drv)
|
|||||||
ioctl_t *ioctl = (ioctl_t *) calloc(1, sizeof(ioctl_t));
|
ioctl_t *ioctl = (ioctl_t *) calloc(1, sizeof(ioctl_t));
|
||||||
|
|
||||||
if (ioctl != NULL) {
|
if (ioctl != NULL) {
|
||||||
char n[1024] = { 0 };
|
char n[1024] = { 0 };
|
||||||
|
|
||||||
sprintf(n, "CD-ROM %i IOCtl", dev->id + 1);
|
sprintf(n, "CD-ROM %i IOCtl", dev->id + 1);
|
||||||
ioctl->log = log_open(n);
|
ioctl->log = log_open(n);
|
||||||
|
|
||||||
memset(ioctl->path, 0x00, sizeof(ioctl->path));
|
memset(ioctl->path, 0x00, sizeof(ioctl->path));
|
||||||
|
|
||||||
wsprintf(ioctl->path, L"%S", &(drv[8]));
|
wsprintf(ioctl->path, L"%S", &(drv[8]));
|
||||||
ioctl_log(ioctl->log, "Path is %S\n", ioctl->path);
|
ioctl_log(ioctl->log, "Path is %S\n", ioctl->path);
|
||||||
|
|
||||||
ioctl->dev = dev;
|
ioctl->dev = dev;
|
||||||
|
|
||||||
dev->ops = &ioctl_ops;
|
dev->ops = &ioctl_ops;
|
||||||
|
|
||||||
|
dev->host_letter = (drv[12] & 0xdf) - 0x41;
|
||||||
|
cdrom_assigned_letters |= (1 << dev->host_letter);
|
||||||
|
|
||||||
ioctl_load(ioctl);
|
ioctl_load(ioctl);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user