mirror of
https://github.com/stenzek/duckstation.git
synced 2025-06-06 03:25:36 +00:00
CDROM: Add "Switch to Next Disc on Stop" option.
NOTE: THIS WILL NOT WORK FOR ALL GAMES. Plenty of games don't stop the CD-ROM drive when they're expecting a disc change, leaving us with no way of knowing when it's needed.
This commit is contained in:
parent
24cd6fa11b
commit
6b811df6d0
@ -2590,10 +2590,18 @@ void CDROM::ExecuteCommandSecondResponse(void*, TickCount ticks, TickCount ticks
|
|||||||
case Command::ReadTOC:
|
case Command::ReadTOC:
|
||||||
case Command::Pause:
|
case Command::Pause:
|
||||||
case Command::MotorOn:
|
case Command::MotorOn:
|
||||||
case Command::Stop:
|
|
||||||
DoStatSecondResponse();
|
DoStatSecondResponse();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Command::Stop:
|
||||||
|
{
|
||||||
|
DoStatSecondResponse();
|
||||||
|
|
||||||
|
if (g_settings.cdrom_auto_disc_change)
|
||||||
|
Host::RunOnCPUThread([]() { System::SwitchToNextDisc(false); });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4539,6 +4539,10 @@ void FullscreenUI::DrawConsoleSettingsPage()
|
|||||||
bsi, FSUI_ICONVSTR(ICON_FA_VEST_PATCHES, "Apply Image Patches"),
|
bsi, FSUI_ICONVSTR(ICON_FA_VEST_PATCHES, "Apply Image Patches"),
|
||||||
FSUI_VSTR("Automatically applies patches to disc images when they are present, currently only PPF is supported."),
|
FSUI_VSTR("Automatically applies patches to disc images when they are present, currently only PPF is supported."),
|
||||||
"CDROM", "LoadImagePatches", false);
|
"CDROM", "LoadImagePatches", false);
|
||||||
|
DrawToggleSetting(bsi, FSUI_ICONVSTR(ICON_FA_LIST_OL, "Switch to Next Disc on Stop"),
|
||||||
|
FSUI_VSTR("Automatically switches to the next disc in the game when the game stops the CD-ROM "
|
||||||
|
"motor. Does not work for all games."),
|
||||||
|
"CDROM", "AutoDiscChange", false);
|
||||||
|
|
||||||
EndMenuButtons();
|
EndMenuButtons();
|
||||||
}
|
}
|
||||||
@ -9166,6 +9170,7 @@ TRANSLATE_NOOP("FullscreenUI", "Automatically applies patches to disc images whe
|
|||||||
TRANSLATE_NOOP("FullscreenUI", "Automatically resizes the window to match the internal resolution.");
|
TRANSLATE_NOOP("FullscreenUI", "Automatically resizes the window to match the internal resolution.");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "Automatically saves the emulator state when powering down or exiting. You can then resume directly from where you left off next time.");
|
TRANSLATE_NOOP("FullscreenUI", "Automatically saves the emulator state when powering down or exiting. You can then resume directly from where you left off next time.");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "Automatically switches to fullscreen mode when the program is started.");
|
TRANSLATE_NOOP("FullscreenUI", "Automatically switches to fullscreen mode when the program is started.");
|
||||||
|
TRANSLATE_NOOP("FullscreenUI", "Automatically switches to the next disc in the game when the game stops the CD-ROM motor. Does not work for all games.");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "Avoids calls to C++ code, significantly speeding up the recompiler.");
|
TRANSLATE_NOOP("FullscreenUI", "Avoids calls to C++ code, significantly speeding up the recompiler.");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "BIOS Directory");
|
TRANSLATE_NOOP("FullscreenUI", "BIOS Directory");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "BIOS Selection");
|
TRANSLATE_NOOP("FullscreenUI", "BIOS Selection");
|
||||||
@ -9728,6 +9733,7 @@ TRANSLATE_NOOP("FullscreenUI", "Stores the current settings to a controller pres
|
|||||||
TRANSLATE_NOOP("FullscreenUI", "Stretch Mode");
|
TRANSLATE_NOOP("FullscreenUI", "Stretch Mode");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "Summary");
|
TRANSLATE_NOOP("FullscreenUI", "Summary");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "Support for controllers that use the XInput protocol. XInput should only be used if you are using a XInput wrapper library.");
|
TRANSLATE_NOOP("FullscreenUI", "Support for controllers that use the XInput protocol. XInput should only be used if you are using a XInput wrapper library.");
|
||||||
|
TRANSLATE_NOOP("FullscreenUI", "Switch to Next Disc on Stop");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "Switches back to 4:3 display aspect ratio when displaying 24-bit content, usually FMVs.");
|
TRANSLATE_NOOP("FullscreenUI", "Switches back to 4:3 display aspect ratio when displaying 24-bit content, usually FMVs.");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "Switches between full screen and windowed when the window is double-clicked.");
|
TRANSLATE_NOOP("FullscreenUI", "Switches between full screen and windowed when the window is double-clicked.");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "Sync To Host Refresh Rate");
|
TRANSLATE_NOOP("FullscreenUI", "Sync To Host Refresh Rate");
|
||||||
|
@ -362,6 +362,7 @@ void Settings::Load(const SettingsInterface& si, const SettingsInterface& contro
|
|||||||
cdrom_load_image_to_ram = si.GetBoolValue("CDROM", "LoadImageToRAM", false);
|
cdrom_load_image_to_ram = si.GetBoolValue("CDROM", "LoadImageToRAM", false);
|
||||||
cdrom_load_image_patches = si.GetBoolValue("CDROM", "LoadImagePatches", false);
|
cdrom_load_image_patches = si.GetBoolValue("CDROM", "LoadImagePatches", false);
|
||||||
cdrom_mute_cd_audio = si.GetBoolValue("CDROM", "MuteCDAudio", false);
|
cdrom_mute_cd_audio = si.GetBoolValue("CDROM", "MuteCDAudio", false);
|
||||||
|
cdrom_auto_disc_change = si.GetBoolValue("CDROM", "AutoDiscChange", false);
|
||||||
cdrom_read_speedup =
|
cdrom_read_speedup =
|
||||||
Truncate8(std::min<u32>(si.GetUIntValue("CDROM", "ReadSpeedup", 1u), std::numeric_limits<u8>::max()));
|
Truncate8(std::min<u32>(si.GetUIntValue("CDROM", "ReadSpeedup", 1u), std::numeric_limits<u8>::max()));
|
||||||
cdrom_seek_speedup =
|
cdrom_seek_speedup =
|
||||||
@ -679,6 +680,7 @@ void Settings::Save(SettingsInterface& si, bool ignore_base) const
|
|||||||
si.SetBoolValue("CDROM", "LoadImageToRAM", cdrom_load_image_to_ram);
|
si.SetBoolValue("CDROM", "LoadImageToRAM", cdrom_load_image_to_ram);
|
||||||
si.SetBoolValue("CDROM", "LoadImagePatches", cdrom_load_image_patches);
|
si.SetBoolValue("CDROM", "LoadImagePatches", cdrom_load_image_patches);
|
||||||
si.SetBoolValue("CDROM", "MuteCDAudio", cdrom_mute_cd_audio);
|
si.SetBoolValue("CDROM", "MuteCDAudio", cdrom_mute_cd_audio);
|
||||||
|
si.SetBoolValue("CDROM", "AutoDiscChange", cdrom_auto_disc_change);
|
||||||
si.SetUIntValue("CDROM", "ReadSpeedup", cdrom_read_speedup);
|
si.SetUIntValue("CDROM", "ReadSpeedup", cdrom_read_speedup);
|
||||||
si.SetUIntValue("CDROM", "SeekSpeedup", cdrom_seek_speedup);
|
si.SetUIntValue("CDROM", "SeekSpeedup", cdrom_seek_speedup);
|
||||||
si.SetUIntValue("CDROM", "MaxReadSpeedupCycles", cdrom_max_seek_speedup_cycles);
|
si.SetUIntValue("CDROM", "MaxReadSpeedupCycles", cdrom_max_seek_speedup_cycles);
|
||||||
|
@ -308,6 +308,7 @@ struct Settings : public GPUSettings
|
|||||||
bool cdrom_load_image_to_ram : 1 = false;
|
bool cdrom_load_image_to_ram : 1 = false;
|
||||||
bool cdrom_load_image_patches : 1 = false;
|
bool cdrom_load_image_patches : 1 = false;
|
||||||
bool cdrom_mute_cd_audio : 1 = false;
|
bool cdrom_mute_cd_audio : 1 = false;
|
||||||
|
bool cdrom_auto_disc_change : 1 = false;
|
||||||
|
|
||||||
u16 rewind_save_slots = 10;
|
u16 rewind_save_slots = 10;
|
||||||
u8 runahead_frames = 0;
|
u8 runahead_frames = 0;
|
||||||
|
@ -65,6 +65,7 @@ ConsoleSettingsWidget::ConsoleSettingsWidget(SettingsWindow* dialog, QWidget* pa
|
|||||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.recompilerICache, "CPU", "RecompilerICache", false);
|
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.recompilerICache, "CPU", "RecompilerICache", false);
|
||||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.cdromLoadImageToRAM, "CDROM", "LoadImageToRAM", false);
|
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.cdromLoadImageToRAM, "CDROM", "LoadImageToRAM", false);
|
||||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.cdromLoadImagePatches, "CDROM", "LoadImagePatches", false);
|
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.cdromLoadImagePatches, "CDROM", "LoadImagePatches", false);
|
||||||
|
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.cdromAutoDiscChange, "CDROM", "AutoDiscChange", false);
|
||||||
|
|
||||||
if (!m_dialog->isPerGameSettings())
|
if (!m_dialog->isPerGameSettings())
|
||||||
{
|
{
|
||||||
@ -73,6 +74,7 @@ ConsoleSettingsWidget::ConsoleSettingsWidget(SettingsWindow* dialog, QWidget* pa
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
m_ui.cdromIgnoreDriveSubcode->setEnabled(false);
|
m_ui.cdromIgnoreDriveSubcode->setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,6 +133,10 @@ ConsoleSettingsWidget::ConsoleSettingsWidget(SettingsWindow* dialog, QWidget* pa
|
|||||||
dialog->registerWidgetHelp(m_ui.cdromLoadImagePatches, tr("Apply Image Patches"), tr("Unchecked"),
|
dialog->registerWidgetHelp(m_ui.cdromLoadImagePatches, tr("Apply Image Patches"), tr("Unchecked"),
|
||||||
tr("Automatically applies patches to disc images when they are present in the same "
|
tr("Automatically applies patches to disc images when they are present in the same "
|
||||||
"directory. Currently only PPF patches are supported with this option."));
|
"directory. Currently only PPF patches are supported with this option."));
|
||||||
|
dialog->registerWidgetHelp(
|
||||||
|
m_ui.cdromAutoDiscChange, tr("Switch to Next Disc on Stop"), tr("Unchecked"),
|
||||||
|
tr("Automatically switches to the next disc in the game when the game stops the CD-ROM motor. No switch will occur "
|
||||||
|
"if the last disc in the game is already selected. <strong>Does not work for all games.</strong>"));
|
||||||
dialog->registerWidgetHelp(
|
dialog->registerWidgetHelp(
|
||||||
m_ui.cdromIgnoreDriveSubcode, tr("Ignore Drive Subcode"), tr("Unchecked"),
|
m_ui.cdromIgnoreDriveSubcode, tr("Ignore Drive Subcode"), tr("Unchecked"),
|
||||||
tr("Ignores the subchannel provided by the drive when using physical discs, instead always generating subchannel "
|
tr("Ignores the subchannel provided by the drive when using physical discs, instead always generating subchannel "
|
||||||
|
@ -167,11 +167,11 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox_4">
|
<widget class="QGroupBox" name="cdromGroup">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>CD-ROM Emulation</string>
|
<string>CD-ROM Emulation</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_5" columnstretch="0,1">
|
<layout class="QGridLayout" name="cdromLayout" columnstretch="0,1">
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@ -323,13 +323,20 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="1">
|
||||||
<widget class="QCheckBox" name="cdromIgnoreDriveSubcode">
|
<widget class="QCheckBox" name="cdromIgnoreDriveSubcode">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Ignore Drive Subcode</string>
|
<string>Ignore Drive Subcode</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QCheckBox" name="cdromAutoDiscChange">
|
||||||
|
<property name="text">
|
||||||
|
<string>Switch to Next Disc on Stop</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user