mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-26 15:45:42 +00:00
System: Fix sync to host refresh audio stretching
This commit is contained in:
parent
e01efaa681
commit
14ba3b7312
|
@ -453,6 +453,7 @@ void SPU::CreateOutputStream()
|
||||||
}
|
}
|
||||||
|
|
||||||
s_audio_stream->SetOutputVolume(System::GetAudioOutputVolume());
|
s_audio_stream->SetOutputVolume(System::GetAudioOutputVolume());
|
||||||
|
s_audio_stream->SetNominalRate(System::GetAudioNominalRate());
|
||||||
s_audio_stream->SetPaused(System::IsPaused());
|
s_audio_stream->SetPaused(System::IsPaused());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2681,6 +2681,11 @@ float System::GetTargetSpeed()
|
||||||
return s_target_speed;
|
return s_target_speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float System::GetAudioNominalRate()
|
||||||
|
{
|
||||||
|
return s_throttler_enabled ? s_target_speed : 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
void System::UpdatePerformanceCounters()
|
void System::UpdatePerformanceCounters()
|
||||||
{
|
{
|
||||||
const float frame_time = static_cast<float>(s_frame_timer.GetTimeMillisecondsAndReset());
|
const float frame_time = static_cast<float>(s_frame_timer.GetTimeMillisecondsAndReset());
|
||||||
|
@ -2869,15 +2874,7 @@ void System::UpdateSpeedLimiterState()
|
||||||
// Update audio output.
|
// Update audio output.
|
||||||
AudioStream* stream = SPU::GetOutputStream();
|
AudioStream* stream = SPU::GetOutputStream();
|
||||||
stream->SetOutputVolume(GetAudioOutputVolume());
|
stream->SetOutputVolume(GetAudioOutputVolume());
|
||||||
|
stream->SetNominalRate(GetAudioNominalRate());
|
||||||
// Adjust nominal rate when resampling, or syncing to host.
|
|
||||||
const bool rate_adjust =
|
|
||||||
(s_syncing_to_host || g_settings.audio_stream_parameters.stretch_mode == AudioStretchMode::Resample) &&
|
|
||||||
s_target_speed > 0.0f;
|
|
||||||
stream->SetNominalRate(rate_adjust ? s_target_speed : 1.0f);
|
|
||||||
|
|
||||||
if (old_target_speed < s_target_speed)
|
|
||||||
stream->UpdateTargetTempo(s_target_speed);
|
|
||||||
|
|
||||||
UpdateThrottlePeriod();
|
UpdateThrottlePeriod();
|
||||||
ResetThrottler();
|
ResetThrottler();
|
||||||
|
|
|
@ -285,6 +285,7 @@ void SingleStepCPU();
|
||||||
|
|
||||||
/// Sets target emulation speed.
|
/// Sets target emulation speed.
|
||||||
float GetTargetSpeed();
|
float GetTargetSpeed();
|
||||||
|
float GetAudioNominalRate();
|
||||||
|
|
||||||
/// Adjusts the throttle frequency, i.e. how many times we should sleep per second.
|
/// Adjusts the throttle frequency, i.e. how many times we should sleep per second.
|
||||||
void SetThrottleFrequency(float frequency);
|
void SetThrottleFrequency(float frequency);
|
||||||
|
|
|
@ -541,25 +541,8 @@ void AudioStream::SetNominalRate(float tempo)
|
||||||
m_nominal_rate = tempo;
|
m_nominal_rate = tempo;
|
||||||
if (m_parameters.stretch_mode == AudioStretchMode::Resample)
|
if (m_parameters.stretch_mode == AudioStretchMode::Resample)
|
||||||
m_soundtouch->setRate(tempo);
|
m_soundtouch->setRate(tempo);
|
||||||
}
|
else if (m_parameters.stretch_mode == AudioStretchMode::TimeStretch && m_stretch_inactive)
|
||||||
|
|
||||||
void AudioStream::UpdateTargetTempo(float tempo)
|
|
||||||
{
|
|
||||||
if (m_parameters.stretch_mode != AudioStretchMode::TimeStretch)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// undo sqrt()
|
|
||||||
if (tempo)
|
|
||||||
tempo *= tempo;
|
|
||||||
|
|
||||||
m_average_position = AVERAGING_WINDOW;
|
|
||||||
m_average_available = AVERAGING_WINDOW;
|
|
||||||
std::fill_n(m_average_fullness.data(), AVERAGING_WINDOW, tempo);
|
|
||||||
m_soundtouch->setTempo(tempo);
|
m_soundtouch->setTempo(tempo);
|
||||||
m_stretch_reset = 0;
|
|
||||||
m_stretch_inactive = false;
|
|
||||||
m_stretch_ok_count = 0;
|
|
||||||
m_dynamic_target_usage = static_cast<float>(m_target_buffer_size) * m_nominal_rate;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioStream::SetStretchMode(AudioStretchMode mode)
|
void AudioStream::SetStretchMode(AudioStretchMode mode)
|
||||||
|
|
|
@ -190,7 +190,6 @@ public:
|
||||||
/// Nominal rate is used for both resampling and timestretching, input samples are assumed to be this amount faster
|
/// Nominal rate is used for both resampling and timestretching, input samples are assumed to be this amount faster
|
||||||
/// than the sample rate.
|
/// than the sample rate.
|
||||||
void SetNominalRate(float tempo);
|
void SetNominalRate(float tempo);
|
||||||
void UpdateTargetTempo(float tempo);
|
|
||||||
|
|
||||||
void SetStretchMode(AudioStretchMode mode);
|
void SetStretchMode(AudioStretchMode mode);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue