mirror of
https://github.com/stenzek/duckstation.git
synced 2025-06-06 03:25:36 +00:00
CDROM: Remove hack for Fighting Force
Instead properly handle the one-sector-delay that occurs when autopause detects the start of a new track.
This commit is contained in:
parent
8c1f75ab8c
commit
162d742cc0
@ -444,6 +444,7 @@ struct CDROMState
|
|||||||
bool last_sector_header_valid = false; // TODO: Rename to "logical pause" or something.
|
bool last_sector_header_valid = false; // TODO: Rename to "logical pause" or something.
|
||||||
bool last_subq_needs_update = false;
|
bool last_subq_needs_update = false;
|
||||||
|
|
||||||
|
bool cdda_auto_pause_pending = false;
|
||||||
u8 cdda_report_start_delay = 0;
|
u8 cdda_report_start_delay = 0;
|
||||||
u8 last_cdda_report_frame_nibble = 0xFF;
|
u8 last_cdda_report_frame_nibble = 0xFF;
|
||||||
u8 play_track_number_bcd = 0xFF;
|
u8 play_track_number_bcd = 0xFF;
|
||||||
@ -638,6 +639,7 @@ TickCount CDROM::SoftReset(TickCount ticks_late)
|
|||||||
s_state.play_after_seek = false;
|
s_state.play_after_seek = false;
|
||||||
s_state.muted = false;
|
s_state.muted = false;
|
||||||
s_state.adpcm_muted = false;
|
s_state.adpcm_muted = false;
|
||||||
|
s_state.cdda_auto_pause_pending = false;
|
||||||
s_state.cdda_report_start_delay = 0;
|
s_state.cdda_report_start_delay = 0;
|
||||||
s_state.last_cdda_report_frame_nibble = 0xFF;
|
s_state.last_cdda_report_frame_nibble = 0xFF;
|
||||||
|
|
||||||
@ -746,6 +748,7 @@ bool CDROM::DoState(StateWrapper& sw)
|
|||||||
sw.DoBytes(&s_state.last_sector_subheader, sizeof(s_state.last_sector_subheader));
|
sw.DoBytes(&s_state.last_sector_subheader, sizeof(s_state.last_sector_subheader));
|
||||||
sw.Do(&s_state.last_sector_header_valid);
|
sw.Do(&s_state.last_sector_header_valid);
|
||||||
sw.DoBytes(&s_state.last_subq, sizeof(s_state.last_subq));
|
sw.DoBytes(&s_state.last_subq, sizeof(s_state.last_subq));
|
||||||
|
sw.DoEx(&s_state.cdda_auto_pause_pending, 81, false);
|
||||||
sw.DoEx(&s_state.cdda_report_start_delay, 72, static_cast<u8>(0));
|
sw.DoEx(&s_state.cdda_report_start_delay, 72, static_cast<u8>(0));
|
||||||
sw.Do(&s_state.last_cdda_report_frame_nibble);
|
sw.Do(&s_state.last_cdda_report_frame_nibble);
|
||||||
sw.Do(&s_state.play_track_number_bcd);
|
sw.Do(&s_state.play_track_number_bcd);
|
||||||
@ -3310,6 +3313,15 @@ void CDROM::DoSectorRead()
|
|||||||
}
|
}
|
||||||
else if (s_state.mode.auto_pause)
|
else if (s_state.mode.auto_pause)
|
||||||
{
|
{
|
||||||
|
if (s_state.cdda_auto_pause_pending)
|
||||||
|
{
|
||||||
|
DEV_COLOR_LOG(StrongRed, "Auto pause at the start of track {:02x} ({} LBA {})", subq.track_number_bcd,
|
||||||
|
LBAToMSFString(s_state.current_lba), s_state.current_lba);
|
||||||
|
s_state.cdda_auto_pause_pending = false;
|
||||||
|
StopReadingWithDataEnd();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Only update the tracked track-to-pause-after once auto pause is enabled. Pitball's menu music starts mid-second,
|
// Only update the tracked track-to-pause-after once auto pause is enabled. Pitball's menu music starts mid-second,
|
||||||
// and there's no pregap, so the first couple of reports are for the previous track. It doesn't enable autopause
|
// and there's no pregap, so the first couple of reports are for the previous track. It doesn't enable autopause
|
||||||
// until receiving a couple, and it's actually playing the track it wants.
|
// until receiving a couple, and it's actually playing the track it wants.
|
||||||
@ -3317,17 +3329,13 @@ void CDROM::DoSectorRead()
|
|||||||
{
|
{
|
||||||
// track number was not specified, but we've found the track now
|
// track number was not specified, but we've found the track now
|
||||||
s_state.play_track_number_bcd = subq.track_number_bcd;
|
s_state.play_track_number_bcd = subq.track_number_bcd;
|
||||||
DEBUG_LOG("Setting playing track number to {}", s_state.play_track_number_bcd);
|
DEV_LOG("Setting playing track number to {}", s_state.play_track_number_bcd);
|
||||||
}
|
}
|
||||||
else if (subq.track_number_bcd != s_state.play_track_number_bcd)
|
else if (s_state.play_track_number_bcd != subq.track_number_bcd)
|
||||||
{
|
{
|
||||||
// Fudge the hold position by 2 sectors to reduce the number of GetlocP's that will return a MSF in the old track.
|
DEV_LOG("Pending auto pause at the start of track {:02x} ({} LBA {})", subq.track_number_bcd,
|
||||||
// Works around the music hang in Fighting Force.
|
LBAToMSFString(s_state.current_lba), s_state.current_lba);
|
||||||
SetHoldPosition(std::min(s_state.current_lba + 2, s_reader.GetMedia()->GetLBACount() - 1),
|
s_state.cdda_auto_pause_pending = true;
|
||||||
s_state.current_subq_lba);
|
|
||||||
DEV_LOG("Auto pause at the start of track {:02x} (LBA {})", subq.track_number_bcd, s_state.current_lba);
|
|
||||||
StopReadingWithDataEnd();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3673,6 +3681,8 @@ void CDROM::ResetCurrentXAFile()
|
|||||||
|
|
||||||
void CDROM::ResetAudioDecoder()
|
void CDROM::ResetAudioDecoder()
|
||||||
{
|
{
|
||||||
|
s_state.cdda_auto_pause_pending = false;
|
||||||
|
|
||||||
ResetCurrentXAFile();
|
ResetCurrentXAFile();
|
||||||
|
|
||||||
s_state.xa_last_samples.fill(0);
|
s_state.xa_last_samples.fill(0);
|
||||||
@ -3865,7 +3875,7 @@ ALWAYS_INLINE_RELEASE void CDROM::ProcessCDDASector(const u8* raw_sector, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Apply volume when pushing sectors to SPU.
|
// Apply volume when pushing sectors to SPU.
|
||||||
if (s_state.muted || g_settings.cdrom_mute_cd_audio)
|
if (s_state.muted || s_state.cdda_auto_pause_pending || g_settings.cdrom_mute_cd_audio)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SPU::GeneratePendingSamples();
|
SPU::GeneratePendingSamples();
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include "common/types.h"
|
#include "common/types.h"
|
||||||
|
|
||||||
static constexpr u32 SAVE_STATE_MAGIC = 0x43435544;
|
static constexpr u32 SAVE_STATE_MAGIC = 0x43435544;
|
||||||
static constexpr u32 SAVE_STATE_VERSION = 80;
|
static constexpr u32 SAVE_STATE_VERSION = 81;
|
||||||
static constexpr u32 SAVE_STATE_MINIMUM_VERSION = 42;
|
static constexpr u32 SAVE_STATE_MINIMUM_VERSION = 42;
|
||||||
|
|
||||||
static_assert(SAVE_STATE_VERSION >= SAVE_STATE_MINIMUM_VERSION);
|
static_assert(SAVE_STATE_VERSION >= SAVE_STATE_MINIMUM_VERSION);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user