aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Ryujinx.Core/OsHle/Services/Aud/IAudioOut.cs42
1 files changed, 31 insertions, 11 deletions
diff --git a/Ryujinx.Core/OsHle/Services/Aud/IAudioOut.cs b/Ryujinx.Core/OsHle/Services/Aud/IAudioOut.cs
index 0562d4b9..c58d9e80 100644
--- a/Ryujinx.Core/OsHle/Services/Aud/IAudioOut.cs
+++ b/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();
+ }
+ }
}
}