From 55dc51ae31fc300b3d2806abff2214b9c2534ab7 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Sat, 14 Jul 2018 23:55:34 -0300 Subject: [PATCH] Bump audren version to REV4, name a few things, increase sample buffer size --- .../Aud/AudioRenderer/IAudioRenderer.cs | 28 ++++----- .../Aud/AudioRenderer/UpdateDataHeader.cs | 10 ++-- .../Services/Aud/AudioRendererParameter.cs | 8 +-- .../Services/Aud/IAudioRendererManager.cs | 58 ++++++++++--------- 4 files changed, 55 insertions(+), 49 deletions(-) diff --git a/Ryujinx.HLE/OsHle/Services/Aud/AudioRenderer/IAudioRenderer.cs b/Ryujinx.HLE/OsHle/Services/Aud/AudioRenderer/IAudioRenderer.cs index 3c531ec313..f91a8da37e 100644 --- a/Ryujinx.HLE/OsHle/Services/Aud/AudioRenderer/IAudioRenderer.cs +++ b/Ryujinx.HLE/OsHle/Services/Aud/AudioRenderer/IAudioRenderer.cs @@ -18,7 +18,7 @@ namespace Ryujinx.HLE.OsHle.Services.Aud.AudioRenderer //this value shouldn't be neither too small (to avoid the player //starving due to running out of samples) or too large (to avoid //high latency). - private const int MixBufferSamplesCount = 770; + private const int MixBufferSamplesCount = 960; private Dictionary m_Commands; @@ -32,12 +32,12 @@ namespace Ryujinx.HLE.OsHle.Services.Aud.AudioRenderer private AudioRendererParameter Params; - private int Track; - private MemoryPoolContext[] MemoryPools; private VoiceContext[] Voices; + private int Track; + public IAudioRenderer(AMemory Memory, IAalOutput AudioOut, AudioRendererParameter Params) { m_Commands = new Dictionary() @@ -108,7 +108,7 @@ namespace Ryujinx.HLE.OsHle.Services.Aud.AudioRenderer Reader.Read(InputHeader.BehaviorSize); - MemoryPoolIn[] MemoryPoolsIn = Reader.Read(InputHeader.MemoryPoolsSize); + MemoryPoolIn[] MemoryPoolsIn = Reader.Read(InputHeader.MemoryPoolSize); for (int Index = 0; Index < MemoryPoolsIn.Length; Index++) { @@ -126,7 +126,7 @@ namespace Ryujinx.HLE.OsHle.Services.Aud.AudioRenderer Reader.Read(InputHeader.VoiceResourceSize); - VoiceIn[] VoicesIn = Reader.Read(InputHeader.VoicesSize); + VoiceIn[] VoicesIn = Reader.Read(InputHeader.VoiceSize); for (int Index = 0; Index < VoicesIn.Length; Index++) { @@ -168,19 +168,19 @@ namespace Ryujinx.HLE.OsHle.Services.Aud.AudioRenderer int UpdateHeaderSize = Marshal.SizeOf(); - OutputHeader.Revision = Params.Revision; + OutputHeader.Revision = IAudioRendererManager.RevMagic; OutputHeader.BehaviorSize = 0xb0; - OutputHeader.MemoryPoolsSize = (Params.EffectCount + Params.VoiceCount * 4) * 0x10; - OutputHeader.VoicesSize = Params.VoiceCount * 0x10; - OutputHeader.EffectsSize = Params.EffectCount * 0x10; - OutputHeader.SinksSize = Params.SinkCount * 0x20; + OutputHeader.MemoryPoolSize = (Params.EffectCount + Params.VoiceCount * 4) * 0x10; + OutputHeader.VoiceSize = Params.VoiceCount * 0x10; + OutputHeader.EffectSize = Params.EffectCount * 0x10; + OutputHeader.SinkSize = Params.SinkCount * 0x20; OutputHeader.PerformanceManagerSize = 0x10; OutputHeader.TotalSize = UpdateHeaderSize + OutputHeader.BehaviorSize + - OutputHeader.MemoryPoolsSize + - OutputHeader.VoicesSize + - OutputHeader.EffectsSize + - OutputHeader.SinksSize + + OutputHeader.MemoryPoolSize + + OutputHeader.VoiceSize + + OutputHeader.EffectSize + + OutputHeader.SinkSize + OutputHeader.PerformanceManagerSize; Writer.Write(OutputHeader); diff --git a/Ryujinx.HLE/OsHle/Services/Aud/AudioRenderer/UpdateDataHeader.cs b/Ryujinx.HLE/OsHle/Services/Aud/AudioRenderer/UpdateDataHeader.cs index 8442e99144..a6dfbc0bce 100644 --- a/Ryujinx.HLE/OsHle/Services/Aud/AudioRenderer/UpdateDataHeader.cs +++ b/Ryujinx.HLE/OsHle/Services/Aud/AudioRenderer/UpdateDataHeader.cs @@ -4,12 +4,12 @@ { public int Revision; public int BehaviorSize; - public int MemoryPoolsSize; - public int VoicesSize; + public int MemoryPoolSize; + public int VoiceSize; public int VoiceResourceSize; - public int EffectsSize; - public int MixesSize; - public int SinksSize; + public int EffectSize; + public int MixeSize; + public int SinkSize; public int PerformanceManagerSize; public int Unknown24; public int Unknown28; diff --git a/Ryujinx.HLE/OsHle/Services/Aud/AudioRendererParameter.cs b/Ryujinx.HLE/OsHle/Services/Aud/AudioRendererParameter.cs index 0a0792ec5b..d7e1df01ac 100644 --- a/Ryujinx.HLE/OsHle/Services/Aud/AudioRendererParameter.cs +++ b/Ryujinx.HLE/OsHle/Services/Aud/AudioRendererParameter.cs @@ -8,14 +8,14 @@ namespace Ryujinx.HLE.OsHle.Services.Aud public int SampleRate; public int SampleCount; public int Unknown8; - public int UnknownC; + public int MixCount; public int VoiceCount; public int SinkCount; public int EffectCount; - public int Unknown1C; - public int Unknown20; + public int PerformanceManagerCount; + public int VoiceDropEnable; public int SplitterCount; - public int Unknown28; + public int SplitterDestinationDataCount; public int Unknown2C; public int Revision; } diff --git a/Ryujinx.HLE/OsHle/Services/Aud/IAudioRendererManager.cs b/Ryujinx.HLE/OsHle/Services/Aud/IAudioRendererManager.cs index 543b0697a5..d6d9ba7388 100644 --- a/Ryujinx.HLE/OsHle/Services/Aud/IAudioRendererManager.cs +++ b/Ryujinx.HLE/OsHle/Services/Aud/IAudioRendererManager.cs @@ -11,11 +11,17 @@ namespace Ryujinx.HLE.OsHle.Services.Aud { class IAudioRendererManager : IpcService { + + private const int Rev0Magic = ('R' << 0) | ('E' << 8) | ('V' << 16) | ('0' << 24); + private const int Rev = 4; + + public const int RevMagic = Rev0Magic + Rev; + private Dictionary m_Commands; public override IReadOnlyDictionary Commands => m_Commands; @@ -47,33 +53,33 @@ namespace Ryujinx.HLE.OsHle.Services.Aud int Revision = (Params.Revision - Rev0Magic) >> 24; - if (Revision <= 3) //REV3 Max is supported + if (Revision <= Rev) //REV3 Max is supported { bool IsSplitterSupported = Revision >= 3; long Size; Size = IntUtils.AlignUp(Params.Unknown8 * 4, 64); - Size += Params.UnknownC * 0x400; - Size += (Params.UnknownC + 1) * 0x940; + Size += Params.MixCount * 0x400; + Size += (Params.MixCount + 1) * 0x940; Size += Params.VoiceCount * 0x3F0; - Size += IntUtils.AlignUp((Params.UnknownC + 1) * 8, 16); + Size += IntUtils.AlignUp((Params.MixCount + 1) * 8, 16); Size += IntUtils.AlignUp(Params.VoiceCount * 8, 16); Size += IntUtils.AlignUp( - ((Params.SinkCount + Params.UnknownC) * 0x3C0 + Params.SampleCount * 4) * + ((Params.SinkCount + Params.MixCount) * 0x3C0 + Params.SampleCount * 4) * (Params.Unknown8 + 6), 64); - Size += (Params.SinkCount + Params.UnknownC) * 0x2C0; + Size += (Params.SinkCount + Params.MixCount) * 0x2C0; Size += (Params.EffectCount + 4 * Params.VoiceCount) * 0x30 + 0x50; if (IsSplitterSupported) { Size += IntUtils.AlignUp(( - NodeStatesGetWorkBufferSize(Params.UnknownC + 1) + - EdgeMatrixGetWorkBufferSize(Params.UnknownC + 1)), 16); + NodeStatesGetWorkBufferSize(Params.MixCount + 1) + + EdgeMatrixGetWorkBufferSize(Params.MixCount + 1)), 16); - Size += Params.Unknown28 * 0xE0; + Size += Params.SplitterDestinationDataCount * 0xE0; Size += Params.SplitterCount * 0x20; - Size += IntUtils.AlignUp(Params.Unknown28 * 4, 16); + Size += IntUtils.AlignUp(Params.SplitterDestinationDataCount * 4, 16); } Size = Params.EffectCount * 0x4C0 + @@ -81,13 +87,13 @@ namespace Ryujinx.HLE.OsHle.Services.Aud Params.VoiceCount * 0x100 + IntUtils.AlignUp(Size, 64) + 0x40; - if (Params.Unknown1C >= 1) + if (Params.PerformanceManagerCount >= 1) { Size += (((Params.EffectCount + Params.SinkCount + Params.VoiceCount + - Params.UnknownC + 1) * 16 + 0x658) * - (Params.Unknown1C + 1) + 0x13F) & ~0x3FL; + Params.MixCount + 1) * 16 + 0x658) * + (Params.PerformanceManagerCount + 1) + 0x13F) & ~0x3FL; } Size = (Size + 0x1907D) & ~0xFFFL; @@ -112,19 +118,19 @@ namespace Ryujinx.HLE.OsHle.Services.Aud { AudioRendererParameter Params = new AudioRendererParameter(); - Params.SampleRate = Context.RequestData.ReadInt32(); - Params.SampleCount = Context.RequestData.ReadInt32(); - Params.Unknown8 = Context.RequestData.ReadInt32(); - Params.UnknownC = Context.RequestData.ReadInt32(); - Params.VoiceCount = Context.RequestData.ReadInt32(); - Params.SinkCount = Context.RequestData.ReadInt32(); - Params.EffectCount = Context.RequestData.ReadInt32(); - Params.Unknown1C = Context.RequestData.ReadInt32(); - Params.Unknown20 = Context.RequestData.ReadInt32(); - Params.SplitterCount = Context.RequestData.ReadInt32(); - Params.Unknown28 = Context.RequestData.ReadInt32(); - Params.Unknown2C = Context.RequestData.ReadInt32(); - Params.Revision = Context.RequestData.ReadInt32(); + Params.SampleRate = Context.RequestData.ReadInt32(); + Params.SampleCount = Context.RequestData.ReadInt32(); + Params.Unknown8 = Context.RequestData.ReadInt32(); + Params.MixCount = Context.RequestData.ReadInt32(); + Params.VoiceCount = Context.RequestData.ReadInt32(); + Params.SinkCount = Context.RequestData.ReadInt32(); + Params.EffectCount = Context.RequestData.ReadInt32(); + Params.PerformanceManagerCount = Context.RequestData.ReadInt32(); + Params.VoiceDropEnable = Context.RequestData.ReadInt32(); + Params.SplitterCount = Context.RequestData.ReadInt32(); + Params.SplitterDestinationDataCount = Context.RequestData.ReadInt32(); + Params.Unknown2C = Context.RequestData.ReadInt32(); + Params.Revision = Context.RequestData.ReadInt32(); return Params; }