mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-26 23:55:40 +00:00
HostInterface: Support switching audio backends
This commit is contained in:
parent
6a0c15b649
commit
37d765e8d7
|
@ -65,6 +65,19 @@ HostInterface::~HostInterface()
|
||||||
Assert(!m_system && !m_audio_stream && !m_display);
|
Assert(!m_system && !m_audio_stream && !m_display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HostInterface::CreateAudioStream()
|
||||||
|
{
|
||||||
|
m_audio_stream = CreateAudioStream(m_settings.audio_backend);
|
||||||
|
|
||||||
|
if (m_audio_stream && m_audio_stream->Reconfigure(AUDIO_SAMPLE_RATE, AUDIO_CHANNELS, AUDIO_BUFFER_SIZE, 4))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ReportFormattedError("Failed to create or configure audio stream, falling back to null output.");
|
||||||
|
m_audio_stream.reset();
|
||||||
|
m_audio_stream = AudioStream::CreateNullAudioStream();
|
||||||
|
m_audio_stream->Reconfigure(AUDIO_SAMPLE_RATE, AUDIO_CHANNELS, AUDIO_BUFFER_SIZE, 4);
|
||||||
|
}
|
||||||
|
|
||||||
bool HostInterface::BootSystemFromFile(const char* filename)
|
bool HostInterface::BootSystemFromFile(const char* filename)
|
||||||
{
|
{
|
||||||
if (!AcquireHostDisplay())
|
if (!AcquireHostDisplay())
|
||||||
|
@ -77,14 +90,7 @@ bool HostInterface::BootSystemFromFile(const char* filename)
|
||||||
m_display->SetDisplayLinearFiltering(m_settings.display_linear_filtering);
|
m_display->SetDisplayLinearFiltering(m_settings.display_linear_filtering);
|
||||||
|
|
||||||
// create the audio stream. this will never fail, since we'll just fall back to null
|
// create the audio stream. this will never fail, since we'll just fall back to null
|
||||||
m_audio_stream = CreateAudioStream(m_settings.audio_backend);
|
CreateAudioStream();
|
||||||
if (!m_audio_stream || !m_audio_stream->Reconfigure(AUDIO_SAMPLE_RATE, AUDIO_CHANNELS, AUDIO_BUFFER_SIZE, 4))
|
|
||||||
{
|
|
||||||
ReportFormattedError("Failed to create or configure audio stream, falling back to null output.");
|
|
||||||
m_audio_stream.reset();
|
|
||||||
m_audio_stream = AudioStream::CreateNullAudioStream();
|
|
||||||
m_audio_stream->Reconfigure(AUDIO_SAMPLE_RATE, AUDIO_CHANNELS, AUDIO_BUFFER_SIZE, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_system = System::Create(this);
|
m_system = System::Create(this);
|
||||||
if (!m_system->Boot(filename))
|
if (!m_system->Boot(filename))
|
||||||
|
@ -710,6 +716,7 @@ void HostInterface::UpdateSettings(const std::function<void()>& apply_callback)
|
||||||
{
|
{
|
||||||
const float old_emulation_speed = m_settings.emulation_speed;
|
const float old_emulation_speed = m_settings.emulation_speed;
|
||||||
const CPUExecutionMode old_cpu_execution_mode = m_settings.cpu_execution_mode;
|
const CPUExecutionMode old_cpu_execution_mode = m_settings.cpu_execution_mode;
|
||||||
|
const AudioBackend old_audio_backend = m_settings.audio_backend;
|
||||||
const GPURenderer old_gpu_renderer = m_settings.gpu_renderer;
|
const GPURenderer old_gpu_renderer = m_settings.gpu_renderer;
|
||||||
const u32 old_gpu_resolution_scale = m_settings.gpu_resolution_scale;
|
const u32 old_gpu_resolution_scale = m_settings.gpu_resolution_scale;
|
||||||
const bool old_gpu_true_color = m_settings.gpu_true_color;
|
const bool old_gpu_true_color = m_settings.gpu_true_color;
|
||||||
|
@ -722,11 +729,22 @@ void HostInterface::UpdateSettings(const std::function<void()>& apply_callback)
|
||||||
|
|
||||||
apply_callback();
|
apply_callback();
|
||||||
|
|
||||||
if (m_settings.gpu_renderer != old_gpu_renderer)
|
|
||||||
RecreateSystem();
|
|
||||||
|
|
||||||
if (m_system)
|
if (m_system)
|
||||||
{
|
{
|
||||||
|
if (m_settings.gpu_renderer != old_gpu_renderer)
|
||||||
|
{
|
||||||
|
ReportFormattedMessage("Switching to %s GPU renderer.", Settings::GetRendererName(m_settings.gpu_renderer));
|
||||||
|
RecreateSystem();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_settings.audio_backend != old_audio_backend)
|
||||||
|
{
|
||||||
|
ReportFormattedMessage("Switching to %s audio backend.", Settings::GetAudioBackendName(m_settings.audio_backend));
|
||||||
|
DebugAssert(m_audio_stream);
|
||||||
|
m_audio_stream.reset();
|
||||||
|
CreateAudioStream();
|
||||||
|
}
|
||||||
|
|
||||||
if (m_settings.video_sync_enabled != old_vsync_enabled || m_settings.audio_sync_enabled != old_audio_sync_enabled ||
|
if (m_settings.video_sync_enabled != old_vsync_enabled || m_settings.audio_sync_enabled != old_audio_sync_enabled ||
|
||||||
m_settings.speed_limiter_enabled != old_speed_limiter_enabled)
|
m_settings.speed_limiter_enabled != old_speed_limiter_enabled)
|
||||||
{
|
{
|
||||||
|
@ -740,7 +758,11 @@ void HostInterface::UpdateSettings(const std::function<void()>& apply_callback)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_settings.cpu_execution_mode != old_cpu_execution_mode)
|
if (m_settings.cpu_execution_mode != old_cpu_execution_mode)
|
||||||
|
{
|
||||||
|
ReportFormattedMessage("Switching to %s CPU execution mode.",
|
||||||
|
Settings::GetCPUExecutionModeName(m_settings.cpu_execution_mode));
|
||||||
m_system->SetCPUExecutionMode(m_settings.cpu_execution_mode);
|
m_system->SetCPUExecutionMode(m_settings.cpu_execution_mode);
|
||||||
|
}
|
||||||
|
|
||||||
if (m_settings.gpu_resolution_scale != old_gpu_resolution_scale ||
|
if (m_settings.gpu_resolution_scale != old_gpu_resolution_scale ||
|
||||||
m_settings.gpu_true_color != old_gpu_true_color ||
|
m_settings.gpu_true_color != old_gpu_true_color ||
|
||||||
|
|
|
@ -176,4 +176,7 @@ protected:
|
||||||
|
|
||||||
std::deque<OSDMessage> m_osd_messages;
|
std::deque<OSDMessage> m_osd_messages;
|
||||||
std::mutex m_osd_messages_lock;
|
std::mutex m_osd_messages_lock;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void CreateAudioStream();
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue