From e913d56fdc2eaf0081efefbaa4bc7e736e05a397 Mon Sep 17 00:00:00 2001 From: Lordmau5 Date: Sat, 30 Jun 2018 17:53:04 +0200 Subject: Implement GetReleasedAudioOutBufferAuto properly (#206) * Implement GetReleasedAudioOutBufferAuto properly * Also implement AppendAudioOutBufferAuto properly --- Ryujinx.HLE/OsHle/Services/Aud/IAudioOut.cs | 94 ++++++++++++++++------------- 1 file changed, 52 insertions(+), 42 deletions(-) diff --git a/Ryujinx.HLE/OsHle/Services/Aud/IAudioOut.cs b/Ryujinx.HLE/OsHle/Services/Aud/IAudioOut.cs index ef8bd89b..49c87a56 100644 --- a/Ryujinx.HLE/OsHle/Services/Aud/IAudioOut.cs +++ b/Ryujinx.HLE/OsHle/Services/Aud/IAudioOut.cs @@ -24,15 +24,15 @@ namespace Ryujinx.HLE.OsHle.Services.Aud { m_Commands = new Dictionary() { - { 0, GetAudioOutState }, - { 1, StartAudioOut }, - { 2, StopAudioOut }, - { 3, AppendAudioOutBuffer }, - { 4, RegisterBufferEvent }, - { 5, GetReleasedAudioOutBuffer }, - { 6, ContainsAudioOutBuffer }, - { 7, AppendAudioOutBufferEx }, - { 8, GetReleasedAudioOutBufferEx } + { 0, GetAudioOutState }, + { 1, StartAudioOut }, + { 2, StopAudioOut }, + { 3, AppendAudioOutBuffer }, + { 4, RegisterBufferEvent }, + { 5, GetReleasedAudioOutBuffer }, + { 6, ContainsAudioOutBuffer }, + { 7, AppendAudioOutBufferAuto }, + { 8, GetReleasedAudioOutBufferAuto } }; this.AudioOut = AudioOut; @@ -62,12 +62,50 @@ namespace Ryujinx.HLE.OsHle.Services.Aud } public long AppendAudioOutBuffer(ServiceCtx Context) + { + return AppendAudioOutBufferImpl(Context, Context.Request.SendBuff[0].Position); + } + + public long RegisterBufferEvent(ServiceCtx Context) + { + int Handle = Context.Process.HandleTable.OpenHandle(ReleaseEvent); + + Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Handle); + + return 0; + } + + public long GetReleasedAudioOutBuffer(ServiceCtx Context) + { + long Position = Context.Request.ReceiveBuff[0].Position; + long Size = Context.Request.ReceiveBuff[0].Size; + + return GetReleasedAudioOutBufferImpl(Context, Position, Size); + } + + public long ContainsAudioOutBuffer(ServiceCtx Context) + { + long Tag = Context.RequestData.ReadInt64(); + + Context.ResponseData.Write(AudioOut.ContainsBuffer(Track, Tag) ? 1 : 0); + + return 0; + } + + public long AppendAudioOutBufferAuto(ServiceCtx Context) + { + (long Position, long Size) = Context.Request.GetBufferType0x21(); + + return AppendAudioOutBufferImpl(Context, Position); + } + + public long AppendAudioOutBufferImpl(ServiceCtx Context, long Position) { long Tag = Context.RequestData.ReadInt64(); AudioOutData Data = AMemoryHelper.Read( Context.Memory, - Context.Request.SendBuff[0].Position); + Position); byte[] Buffer = Context.Memory.ReadBytes( Data.SampleBufferPtr, @@ -78,20 +116,15 @@ namespace Ryujinx.HLE.OsHle.Services.Aud return 0; } - public long RegisterBufferEvent(ServiceCtx Context) + public long GetReleasedAudioOutBufferAuto(ServiceCtx Context) { - int Handle = Context.Process.HandleTable.OpenHandle(ReleaseEvent); + (long Position, long Size) = Context.Request.GetBufferType0x22(); - Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Handle); - - return 0; + return GetReleasedAudioOutBufferImpl(Context, Position, Size); } - public long GetReleasedAudioOutBuffer(ServiceCtx Context) + public long GetReleasedAudioOutBufferImpl(ServiceCtx Context, long Position, long Size) { - long Position = Context.Request.ReceiveBuff[0].Position; - long Size = Context.Request.ReceiveBuff[0].Size; - uint Count = (uint)((ulong)Size >> 3); long[] ReleasedBuffers = AudioOut.GetReleasedBuffers(Track, (int)Count); @@ -113,29 +146,6 @@ namespace Ryujinx.HLE.OsHle.Services.Aud return 0; } - public long ContainsAudioOutBuffer(ServiceCtx Context) - { - long Tag = Context.RequestData.ReadInt64(); - - Context.ResponseData.Write(AudioOut.ContainsBuffer(Track, Tag) ? 1 : 0); - - return 0; - } - - public long AppendAudioOutBufferEx(ServiceCtx Context) - { - Context.Ns.Log.PrintStub(LogClass.ServiceAudio, "Stubbed."); - - return 0; - } - - public long GetReleasedAudioOutBufferEx(ServiceCtx Context) - { - Context.Ns.Log.PrintStub(LogClass.ServiceAudio, "Stubbed."); - - return 0; - } - public void Dispose() { Dispose(true); -- cgit v1.2.3