Do not block execution on audout append buffer

This commit is contained in:
gdkchan 2018-03-04 01:41:35 -03:00
parent 479443564c
commit ee9df32e3e

View file

@ -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();
}
}
}
}