From fe9d5a1981cfe43c4535b7473064c9858addb3b5 Mon Sep 17 00:00:00 2001
From: mpnico <mpnico@gmail.com>
Date: Sat, 18 Sep 2021 14:31:44 +0200
Subject: [PATCH] Fix problems added by Pause (#2645)

* Disable Pause/Resume menu instead of trying to hide them

* Fix Resume menu being active before renderer starts

* Fix emulator not being able to close properly
---
 .../Renderer/Server/AudioRenderSystem.cs      |  8 ++++++++
 .../Renderer/Server/AudioRendererManager.cs   | 18 ++++++++++++++++--
 Ryujinx.HLE/HOS/Horizon.cs                    | 10 +++++++---
 Ryujinx/Ui/MainWindow.cs                      | 19 ++++++++++---------
 Ryujinx/Ui/MainWindow.glade                   |  2 +-
 5 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs b/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs
index 6aed3c5d59..afbe56a69b 100644
--- a/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs
+++ b/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs
@@ -395,6 +395,14 @@ namespace Ryujinx.Audio.Renderer.Server
             Logger.Info?.Print(LogClass.AudioRenderer, $"Stopped renderer id {_sessionId}");
         }
 
+        public void Disable()
+        {
+            lock (_lock)
+            {
+                _isActive = false;
+            }
+        }
+
         public ResultCode Update(Memory<byte> output, Memory<byte> performanceOutput, ReadOnlyMemory<byte> input)
         {
             lock (_lock)
diff --git a/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs b/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
index f471a2e713..7518c447f0 100644
--- a/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
+++ b/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
@@ -219,7 +219,21 @@ namespace Ryujinx.Audio.Renderer.Server
         /// </summary>
         public void StopSendingCommands()
         {
-            _isRunning = false;
+            lock (_sessionLock)
+            {
+                foreach (AudioRenderSystem renderer in _sessions)
+                {
+                    renderer?.Disable();
+                }
+            }
+
+            lock (_audioProcessorLock)
+            {
+                if (_isRunning)
+                {
+                    StopLocked();
+                }
+            }
         }
 
         /// <summary>
@@ -234,7 +248,7 @@ namespace Ryujinx.Audio.Renderer.Server
             {
                 lock (_sessionLock)
                 {
-                    foreach(AudioRenderSystem renderer in _sessions)
+                    foreach (AudioRenderSystem renderer in _sessions)
                     {
                         renderer?.SendCommands();
                     }
diff --git a/Ryujinx.HLE/HOS/Horizon.cs b/Ryujinx.HLE/HOS/Horizon.cs
index 76ab1bc443..877bb3899f 100644
--- a/Ryujinx.HLE/HOS/Horizon.cs
+++ b/Ryujinx.HLE/HOS/Horizon.cs
@@ -386,10 +386,14 @@ namespace Ryujinx.HLE.HOS
                 _isDisposed = true;
 
                 // "Soft" stops AudioRenderer and AudioManager to avoid some sound between resume and stop.
-                AudioRendererManager.StopSendingCommands();
-                AudioManager.StopUpdates();
+                if (IsPaused)
+                {
+                    AudioManager.StopUpdates();
 
-                TogglePauseEmulation(false);
+                    TogglePauseEmulation(false);
+
+                    AudioRendererManager.StopSendingCommands();
+                }
 
                 KProcess terminationProcess = new KProcess(KernelContext);
                 KThread terminationThread = new KThread(KernelContext);
diff --git a/Ryujinx/Ui/MainWindow.cs b/Ryujinx/Ui/MainWindow.cs
index bd3dff950c..519e02873b 100644
--- a/Ryujinx/Ui/MainWindow.cs
+++ b/Ryujinx/Ui/MainWindow.cs
@@ -214,6 +214,7 @@ namespace Ryujinx.Ui
 
             _actionMenu.Sensitive = false;
             _pauseEmulation.Sensitive = false;
+            _resumeEmulation.Sensitive = false;
 
             if (ConfigurationState.Instance.Ui.GuiColumns.FavColumn)        _favToggle.Active        = true;
             if (ConfigurationState.Instance.Ui.GuiColumns.IconColumn)       _iconToggle.Active       = true;
@@ -1289,36 +1290,36 @@ namespace Ryujinx.Ui
                 UpdateGameMetadata(_emulationContext.Application.TitleIdText);
             }
 
-            _pauseEmulation.Visible = true;
             _pauseEmulation.Sensitive = false;
-            _resumeEmulation.Visible = false;
+            _resumeEmulation.Sensitive = false;
             RendererWidget?.Exit();
         }
 
         private void PauseEmulation_Pressed(object sender, EventArgs args)
         {
-            _pauseEmulation.Visible = false;
-            _resumeEmulation.Visible = true;
+            _pauseEmulation.Sensitive = false;
+            _resumeEmulation.Sensitive = true;
             _emulationContext.System.TogglePauseEmulation(true);
         }
 
         private void ResumeEmulation_Pressed(object sender, EventArgs args)
         {
-            _pauseEmulation.Visible = true;
-            _resumeEmulation.Visible = false;
+            _pauseEmulation.Sensitive = true;
+            _resumeEmulation.Sensitive = false;
             _emulationContext.System.TogglePauseEmulation(false);
         }
 
         public void ActivatePauseMenu()
         {
             _pauseEmulation.Sensitive = true;
+            _resumeEmulation.Sensitive = false;
         }
 
         public void TogglePause()
         {
-            _pauseEmulation.Visible ^= true;
-            _resumeEmulation.Visible ^= true;
-            _emulationContext.System.TogglePauseEmulation(_resumeEmulation.Visible);
+            _pauseEmulation.Sensitive ^= true;
+            _resumeEmulation.Sensitive ^= true;
+            _emulationContext.System.TogglePauseEmulation(_resumeEmulation.Sensitive);
         }
 
         private void Installer_File_Pressed(object o, EventArgs args)
diff --git a/Ryujinx/Ui/MainWindow.glade b/Ryujinx/Ui/MainWindow.glade
index 2fa00688dc..66b307fb87 100644
--- a/Ryujinx/Ui/MainWindow.glade
+++ b/Ryujinx/Ui/MainWindow.glade
@@ -305,7 +305,7 @@
 					</child>
 					  <child>
 						  <object class="GtkMenuItem" id="_resumeEmulation">
-							  <property name="visible">False</property>
+							  <property name="visible">True</property>
 							  <property name="can_focus">False</property>
 							  <property name="tooltip_text" translatable="yes">Resume emulation</property>
 							  <property name="label" translatable="yes">Resume Emulation</property>