Jelajahi Sumber

Do not block execution on audout append buffer

gdkchan 8 tahun lalu
induk
melakukan
ee9df32e3e
1 mengubah file dengan 31 tambahan dan 11 penghapusan
  1. 31 11
      Ryujinx.Core/OsHle/Services/Aud/IAudioOut.cs

+ 31 - 11
Ryujinx.Core/OsHle/Services/Aud/IAudioOut.cs

@@ -9,7 +9,7 @@ using System.IO;
 
 namespace Ryujinx.Core.OsHle.IpcServices.Aud
 {
-    class IAudioOut : IIpcService
+    class IAudioOut : IIpcService, IDisposable
     {
         private Dictionary<int, ServiceProcessRequest> m_Commands;
 
@@ -121,6 +121,8 @@ namespace Ryujinx.Core.OsHle.IpcServices.Aud
                     {
                         if (AudioCtx == null) //Needed to call the instance of AudioContext()
                             return 0;
+                        
+                        EnsureAudioFinalized();
 
                         Source = AL.GenSource();
                         Buffer = AL.GenBuffer();
@@ -128,16 +130,6 @@ namespace Ryujinx.Core.OsHle.IpcServices.Aud
                         AL.BufferData(Buffer, ALFormat.Stereo16, AudioSampleBuffer, AudioSampleBuffer.Length, 48000);
                         AL.SourceQueueBuffer(Source, Buffer);
                         AL.SourcePlay(Source);
-
-                        int State;
-
-                        do AL.GetSource(Source, ALGetSourcei.SourceState, out State);
-                        while ((ALSourceState)State == ALSourceState.Playing);
-
-                        AL.SourceStop(Source);
-                        AL.SourceUnqueueBuffer(Buffer);
-                        AL.DeleteSource(Source);
-                        AL.DeleteBuffers(1, ref Buffer);
                     }
                 }
             }
@@ -186,5 +178,33 @@ namespace Ryujinx.Core.OsHle.IpcServices.Aud
         {
             return 0;
         }
+
+        private void EnsureAudioFinalized()
+        {
+            if (Source != 0 ||
+                Buffer != 0)
+            {
+                AL.SourceStop(Source);
+                AL.SourceUnqueueBuffer(Buffer);
+                AL.DeleteSource(Source);
+                AL.DeleteBuffers(1, ref Buffer);
+
+                Source = 0;
+                Buffer = 0;
+            }
+        }
+
+        public void Dispose()
+        {
+            Dispose(true);
+        }
+
+        protected virtual void Dispose(bool disposing)
+        {
+            if (disposing)
+            {
+                EnsureAudioFinalized();
+            }
+        }
     }
 }