소스 검색

Implement GetReleasedAudioOutBufferAuto properly (#206)

* Implement GetReleasedAudioOutBufferAuto properly

* Also implement AppendAudioOutBufferAuto properly
Lordmau5 7 년 전
부모
커밋
e913d56fdc
1개의 변경된 파일52개의 추가작업 그리고 42개의 파일을 삭제
  1. 52 42
      Ryujinx.HLE/OsHle/Services/Aud/IAudioOut.cs

+ 52 - 42
Ryujinx.HLE/OsHle/Services/Aud/IAudioOut.cs

@@ -24,15 +24,15 @@ namespace Ryujinx.HLE.OsHle.Services.Aud
         {
             m_Commands = new Dictionary<int, ServiceProcessRequest>()
             {
-                { 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<AudioOutData>(
                 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);