Do not block execution on audout append buffer
This commit is contained in:
parent
479443564c
commit
ee9df32e3e
1 changed files with 31 additions and 11 deletions
|
@ -9,7 +9,7 @@ using System.IO;
|
||||||
|
|
||||||
namespace Ryujinx.Core.OsHle.IpcServices.Aud
|
namespace Ryujinx.Core.OsHle.IpcServices.Aud
|
||||||
{
|
{
|
||||||
class IAudioOut : IIpcService
|
class IAudioOut : IIpcService, IDisposable
|
||||||
{
|
{
|
||||||
private Dictionary<int, ServiceProcessRequest> m_Commands;
|
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()
|
if (AudioCtx == null) //Needed to call the instance of AudioContext()
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
EnsureAudioFinalized();
|
||||||
|
|
||||||
Source = AL.GenSource();
|
Source = AL.GenSource();
|
||||||
Buffer = AL.GenBuffer();
|
Buffer = AL.GenBuffer();
|
||||||
|
@ -128,16 +130,6 @@ namespace Ryujinx.Core.OsHle.IpcServices.Aud
|
||||||
AL.BufferData(Buffer, ALFormat.Stereo16, AudioSampleBuffer, AudioSampleBuffer.Length, 48000);
|
AL.BufferData(Buffer, ALFormat.Stereo16, AudioSampleBuffer, AudioSampleBuffer.Length, 48000);
|
||||||
AL.SourceQueueBuffer(Source, Buffer);
|
AL.SourceQueueBuffer(Source, Buffer);
|
||||||
AL.SourcePlay(Source);
|
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;
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue