From e913d56fdc2eaf0081efefbaa4bc7e736e05a397 Mon Sep 17 00:00:00 2001 From: Lordmau5 Date: Sat, 30 Jun 2018 17:53:04 +0200 Subject: [PATCH] Implement GetReleasedAudioOutBufferAuto properly (#206) * Implement GetReleasedAudioOutBufferAuto properly * Also implement AppendAudioOutBufferAuto properly --- Ryujinx.HLE/OsHle/Services/Aud/IAudioOut.cs | 100 +++++++++++--------- 1 file changed, 55 insertions(+), 45 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; @@ -63,19 +63,7 @@ namespace Ryujinx.HLE.OsHle.Services.Aud public long AppendAudioOutBuffer(ServiceCtx Context) { - long Tag = Context.RequestData.ReadInt64(); - - AudioOutData Data = AMemoryHelper.Read( - Context.Memory, - Context.Request.SendBuff[0].Position); - - byte[] Buffer = Context.Memory.ReadBytes( - Data.SampleBufferPtr, - Data.SampleBufferSize); - - AudioOut.AppendBuffer(Track, Tag, Buffer); - - return 0; + return AppendAudioOutBufferImpl(Context, Context.Request.SendBuff[0].Position); } public long RegisterBufferEvent(ServiceCtx Context) @@ -92,6 +80,51 @@ namespace Ryujinx.HLE.OsHle.Services.Aud 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, + Position); + + byte[] Buffer = Context.Memory.ReadBytes( + Data.SampleBufferPtr, + Data.SampleBufferSize); + + AudioOut.AppendBuffer(Track, Tag, Buffer); + + return 0; + } + + public long GetReleasedAudioOutBufferAuto(ServiceCtx Context) + { + (long Position, long Size) = Context.Request.GetBufferType0x22(); + + return GetReleasedAudioOutBufferImpl(Context, Position, Size); + } + + public long GetReleasedAudioOutBufferImpl(ServiceCtx Context, long Position, long 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);