From 0eab6435fe5e45cd92fb39e3643d8f03ca630f1c Mon Sep 17 00:00:00 2001
From: Connor McLaughlin <stenzek@gmail.com>
Date: Mon, 23 Dec 2019 17:02:49 +1000
Subject: [PATCH] Frontend: Use configured audio backend when creating stream

---
 src/duckstation/sdl_host_interface.cpp | 48 +++++++++++++++++++-------
 src/duckstation/sdl_host_interface.h   |  3 +-
 2 files changed, 37 insertions(+), 14 deletions(-)

diff --git a/src/duckstation/sdl_host_interface.cpp b/src/duckstation/sdl_host_interface.cpp
index 5426da49a..9cc773628 100644
--- a/src/duckstation/sdl_host_interface.cpp
+++ b/src/duckstation/sdl_host_interface.cpp
@@ -3,6 +3,7 @@
 #include "YBaseLib/ByteStream.h"
 #include "YBaseLib/Error.h"
 #include "YBaseLib/Log.h"
+#include "common/null_audio_stream.h"
 #include "core/cdrom.h"
 #include "core/dma.h"
 #include "core/gpu.h"
@@ -12,11 +13,6 @@
 #include "core/spu.h"
 #include "core/system.h"
 #include "core/timers.h"
-#ifdef Y_PLATFORM_WINDOWS
-#include "YBaseLib/Windows/WindowsHeaders.h"
-#include "d3d11_host_display.h"
-#include <mmsystem.h>
-#endif
 #include "icon.h"
 #include "imgui_styles.h"
 #include "opengl_host_display.h"
@@ -28,6 +24,12 @@
 #include <nfd.h>
 Log_SetChannel(SDLHostInterface);
 
+#ifdef Y_PLATFORM_WINDOWS
+#include "YBaseLib/Windows/WindowsHeaders.h"
+#include "d3d11_host_display.h"
+#include <mmsystem.h>
+#endif
+
 SDLHostInterface::SDLHostInterface() : m_settings_filename("settings.ini")
 {
   // Increase timer/sleep resolution since we use it for throttling.
@@ -123,10 +125,28 @@ void SDLHostInterface::CreateImGuiContext()
   ImGui::AddRobotoRegularFont();
 }
 
-bool SDLHostInterface::CreateAudioStream()
+void SDLHostInterface::CreateAudioStream()
 {
-  m_audio_stream = std::make_unique<SDLAudioStream>();
-  return m_audio_stream->Reconfigure(44100, 2);
+  switch (m_settings.audio_backend)
+  {
+    case AudioBackend::Null:
+      m_audio_stream = std::make_unique<NullAudioStream>();
+      break;
+
+    case AudioBackend::Default:
+    default:
+      m_audio_stream = std::make_unique<SDLAudioStream>();
+      break;
+  }
+
+  if (!m_audio_stream->Reconfigure(44100, 2))
+  {
+    ReportError("Failed to recreate audio stream, falling back to null");
+    m_audio_stream.reset();
+    m_audio_stream = std::make_unique<NullAudioStream>();
+    if (!m_audio_stream->Reconfigure(44100, 2))
+      Panic("Failed to reconfigure null audio stream");
+  }
 }
 
 void SDLHostInterface::SaveSettings()
@@ -181,6 +201,12 @@ void SDLHostInterface::SwitchGPURenderer()
   ClearImGuiFocus();
 }
 
+void SDLHostInterface::SwitchAudioRenderer()
+{
+  m_audio_stream.reset();
+  CreateAudioStream();
+}
+
 void SDLHostInterface::UpdateFullscreen()
 {
   SDL_SetWindowFullscreen(m_window, m_settings.display_fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
@@ -218,11 +244,7 @@ std::unique_ptr<SDLHostInterface> SDLHostInterface::Create(const char* filename
     return nullptr;
   }
 
-  if (!intf->CreateAudioStream())
-  {
-    Log_ErrorPrintf("Failed to create host audio stream");
-    return nullptr;
-  }
+  intf->CreateAudioStream();
 
   ImGui::NewFrame();
 
diff --git a/src/duckstation/sdl_host_interface.h b/src/duckstation/sdl_host_interface.h
index 01b8cdb18..b0eb8a420 100644
--- a/src/duckstation/sdl_host_interface.h
+++ b/src/duckstation/sdl_host_interface.h
@@ -79,12 +79,13 @@ private:
   bool CreateDisplay();
   void DestroyDisplay();
   void CreateImGuiContext();
-  bool CreateAudioStream();
+  void CreateAudioStream();
 
   void SaveSettings();
 
   void QueueSwitchGPURenderer();
   void SwitchGPURenderer();
+  void SwitchAudioRenderer();
   void UpdateFullscreen();
   void UpdateControllerMapping();