cellGame: Enable disc insert/eject based on disc mount state

This commit is contained in:
Megamouse 2024-04-04 23:23:06 +02:00
parent 67853b464c
commit 9e7b759236
2 changed files with 13 additions and 4 deletions

View File

@ -239,8 +239,15 @@ error_code disc_change_manager::register_callbacks(vm::ptr<CellGameDiscEjectCall
eject_callback = func_eject; eject_callback = func_eject;
insert_callback = func_insert; insert_callback = func_insert;
Emu.GetCallbacks().enable_disc_eject(!!func_eject); const bool is_disc_mounted = fs::is_dir(vfs::get("/dev_bdvd/PS3_GAME"));
Emu.GetCallbacks().enable_disc_insert(false);
if (state == eject_state::unknown)
{
state = is_disc_mounted ? eject_state::inserted : eject_state::ejected;
}
Emu.GetCallbacks().enable_disc_eject(!!func_eject && is_disc_mounted);
Emu.GetCallbacks().enable_disc_insert(!!func_insert && !is_disc_mounted);
return CELL_OK; return CELL_OK;
} }
@ -300,7 +307,8 @@ void disc_change_manager::eject_disc()
ensure(vfs::unmount("/dev_ps2disc")); ensure(vfs::unmount("/dev_ps2disc"));
dcm.state = eject_state::ejected; dcm.state = eject_state::ejected;
Emu.GetCallbacks().enable_disc_insert(true); // Re-enable disc insertion only if the callback is still registered
Emu.GetCallbacks().enable_disc_insert(!!dcm.insert_callback);
return CELL_OK; return CELL_OK;
}); });

View File

@ -338,11 +338,12 @@ struct disc_change_manager
enum class eject_state enum class eject_state
{ {
unknown,
inserted, inserted,
ejected, ejected,
busy busy
}; };
atomic_t<eject_state> state = eject_state::inserted; atomic_t<eject_state> state = eject_state::unknown;
error_code register_callbacks(vm::ptr<CellGameDiscEjectCallback> func_eject, vm::ptr<CellGameDiscInsertCallback> func_insert); error_code register_callbacks(vm::ptr<CellGameDiscEjectCallback> func_eject, vm::ptr<CellGameDiscInsertCallback> func_insert);
error_code unregister_callbacks(); error_code unregister_callbacks();