mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-06-16 11:15:47 -04:00
CDROM: Add seek speedup enhancement
This commit is contained in:
@ -684,24 +684,30 @@ TickCount CDROM::GetTicksForRead()
|
||||
|
||||
TickCount CDROM::GetTicksForSeek(CDImage::LBA new_lba)
|
||||
{
|
||||
static constexpr TickCount MIN_TICKS = 20000;
|
||||
|
||||
if (g_settings.cdrom_seek_speedup == 0)
|
||||
return MIN_TICKS;
|
||||
|
||||
const TickCount tps = System::GetTicksPerSecond();
|
||||
const CDImage::LBA current_lba = m_secondary_status.motor_on ? m_current_lba : 0;
|
||||
const u32 lba_diff = static_cast<u32>((new_lba > current_lba) ? (new_lba - current_lba) : (current_lba - new_lba));
|
||||
|
||||
// Formula from Mednafen.
|
||||
TickCount ticks = std::max<TickCount>(
|
||||
// Original formula based on Mednafen. Still not accurate, doesn't consider the varying number of sectors per track.
|
||||
// TODO: Replace with algorithm based on mechacon behavior.
|
||||
u32 ticks = std::max<u32>(
|
||||
20000, static_cast<u32>(
|
||||
((static_cast<u64>(lba_diff) * static_cast<u64>(tps) * static_cast<u64>(1000)) / (72 * 60 * 75)) / 1000));
|
||||
if (!m_secondary_status.motor_on)
|
||||
ticks += tps;
|
||||
if (lba_diff >= 2550)
|
||||
ticks += static_cast<TickCount>((u64(tps) * 300) / 1000);
|
||||
ticks += static_cast<u32>((u64(tps) * 300) / 1000);
|
||||
else
|
||||
{
|
||||
// When paused, the CDC seems to keep reading the disc until it hits the position it's set to, then skip 10-15
|
||||
// sectors back (depending on how far into the disc it is). We'll be generous and use 4 sectors, since on average
|
||||
// it's probably closer.
|
||||
ticks += GetTicksForRead() * 4u;
|
||||
ticks += static_cast<u32>(GetTicksForRead()) * 4u;
|
||||
}
|
||||
|
||||
if (m_mode.double_speed != m_current_double_speed)
|
||||
@ -714,8 +720,11 @@ TickCount CDROM::GetTicksForSeek(CDImage::LBA new_lba)
|
||||
ticks += static_cast<u32>(static_cast<double>(tps) * 0.1);
|
||||
}
|
||||
|
||||
Log_DevPrintf("Seek time for %u LBAs: %d", lba_diff, ticks);
|
||||
return ticks;
|
||||
if (g_settings.cdrom_seek_speedup > 1)
|
||||
ticks = std::min<u32>(ticks / g_settings.cdrom_seek_speedup, MIN_TICKS);
|
||||
|
||||
Log_DevPrintf("Seek time for %u LBAs: %u", lba_diff, ticks);
|
||||
return static_cast<u32>(ticks);
|
||||
}
|
||||
|
||||
TickCount CDROM::GetTicksForStop(bool motor_was_on)
|
||||
|
@ -558,6 +558,7 @@ void HostInterface::SetDefaultSettings(SettingsInterface& si)
|
||||
si.SetBoolValue("CDROM", "LoadImageToRAM", false);
|
||||
si.SetBoolValue("CDROM", "MuteCDAudio", false);
|
||||
si.SetIntValue("CDROM", "ReadSpeedup", 1);
|
||||
si.SetIntValue("CDROM", "SeekSpeedup", 1);
|
||||
|
||||
si.SetStringValue("Audio", "Backend", Settings::GetAudioBackendName(Settings::DEFAULT_AUDIO_BACKEND));
|
||||
si.SetIntValue("Audio", "OutputVolume", 100);
|
||||
@ -638,7 +639,8 @@ void HostInterface::FixIncompatibleSettings(bool display_osd_messages)
|
||||
g_settings.gpu_widescreen_hack = false;
|
||||
g_settings.gpu_pgxp_enable = false;
|
||||
g_settings.gpu_24bit_chroma_smoothing = false;
|
||||
g_settings.cdrom_read_speedup = false;
|
||||
g_settings.cdrom_read_speedup = 1;
|
||||
g_settings.cdrom_seek_speedup = 1;
|
||||
g_settings.cdrom_mute_cd_audio = false;
|
||||
g_settings.texture_replacements.enable_vram_write_replacements = false;
|
||||
g_settings.bios_patch_fast_boot = false;
|
||||
|
@ -255,6 +255,7 @@ void Settings::Load(SettingsInterface& si)
|
||||
cdrom_load_image_to_ram = si.GetBoolValue("CDROM", "LoadImageToRAM", false);
|
||||
cdrom_mute_cd_audio = si.GetBoolValue("CDROM", "MuteCDAudio", false);
|
||||
cdrom_read_speedup = si.GetIntValue("CDROM", "ReadSpeedup", 1);
|
||||
cdrom_seek_speedup = si.GetIntValue("CDROM", "SeekSpeedup", 1);
|
||||
|
||||
audio_backend =
|
||||
ParseAudioBackend(si.GetStringValue("Audio", "Backend", GetAudioBackendName(DEFAULT_AUDIO_BACKEND)).c_str())
|
||||
@ -430,6 +431,7 @@ void Settings::Save(SettingsInterface& si) const
|
||||
si.SetBoolValue("CDROM", "LoadImageToRAM", cdrom_load_image_to_ram);
|
||||
si.SetBoolValue("CDROM", "MuteCDAudio", cdrom_mute_cd_audio);
|
||||
si.SetIntValue("CDROM", "ReadSpeedup", cdrom_read_speedup);
|
||||
si.SetIntValue("CDROM", "SeekSpeedup", cdrom_seek_speedup);
|
||||
|
||||
si.SetStringValue("Audio", "Backend", GetAudioBackendName(audio_backend));
|
||||
si.SetIntValue("Audio", "OutputVolume", audio_output_volume);
|
||||
|
@ -156,6 +156,7 @@ struct Settings
|
||||
bool cdrom_load_image_to_ram = false;
|
||||
bool cdrom_mute_cd_audio = false;
|
||||
u32 cdrom_read_speedup = 1;
|
||||
u32 cdrom_seek_speedup = 1;
|
||||
|
||||
AudioBackend audio_backend = AudioBackend::Cubeb;
|
||||
s32 audio_output_volume = 100;
|
||||
|
@ -885,10 +885,12 @@ bool Initialize(bool force_software_renderer)
|
||||
g_mdec.Initialize();
|
||||
g_sio.Initialize();
|
||||
|
||||
static constexpr float WARNING_DURATION = 15.0f;
|
||||
|
||||
if (g_settings.cpu_overclock_active)
|
||||
{
|
||||
g_host_interface->AddFormattedOSDMessage(
|
||||
10.0f,
|
||||
WARNING_DURATION,
|
||||
g_host_interface->TranslateString("OSDMessage",
|
||||
"CPU clock speed is set to %u%% (%u / %u). This may result in instability."),
|
||||
g_settings.GetCPUOverclockPercent(), g_settings.cpu_overclock_numerator, g_settings.cpu_overclock_denominator);
|
||||
@ -896,11 +898,29 @@ bool Initialize(bool force_software_renderer)
|
||||
if (g_settings.cdrom_read_speedup > 1)
|
||||
{
|
||||
g_host_interface->AddFormattedOSDMessage(
|
||||
10.0f,
|
||||
WARNING_DURATION,
|
||||
g_host_interface->TranslateString(
|
||||
"OSDMessage", "CD-ROM read speedup set to %ux (effective speed %ux). This may result in instability."),
|
||||
g_settings.cdrom_read_speedup, g_settings.cdrom_read_speedup * 2);
|
||||
}
|
||||
if (g_settings.cdrom_seek_speedup != 1)
|
||||
{
|
||||
if (g_settings.cdrom_seek_speedup == 0)
|
||||
{
|
||||
g_host_interface->AddOSDMessage(
|
||||
g_host_interface->TranslateStdString("OSDMessage",
|
||||
"CD-ROM seek speedup set to instant. This may result in instability."),
|
||||
WARNING_DURATION);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_host_interface->AddFormattedOSDMessage(
|
||||
WARNING_DURATION,
|
||||
g_host_interface->TranslateString("OSDMessage",
|
||||
"CD-ROM seek speedup set to %ux. This may result in instability."),
|
||||
g_settings.cdrom_seek_speedup);
|
||||
}
|
||||
}
|
||||
|
||||
UpdateThrottlePeriod();
|
||||
UpdateMemorySaveStateSettings();
|
||||
|
Reference in New Issue
Block a user