Workaround for recent audren regression

This commit is contained in:
gdkchan 2018-06-23 03:17:07 -03:00
parent c26ddd6259
commit 69697957e6
3 changed files with 29 additions and 25 deletions

View file

@ -36,6 +36,9 @@ namespace Ryujinx.HLE.OsHle.Services.Aud
public long RequestUpdateAudioRenderer(ServiceCtx Context) public long RequestUpdateAudioRenderer(ServiceCtx Context)
{ {
long OutputPosition = Context.Request.ReceiveBuff[0].Position; long OutputPosition = Context.Request.ReceiveBuff[0].Position;
long OutputSize = Context.Request.ReceiveBuff[0].Size;
AMemoryHelper.FillWithZeros(Context.Memory, OutputPosition, (int)OutputSize);
long InputPosition = Context.Request.SendBuff[0].Position; long InputPosition = Context.Request.SendBuff[0].Position;
@ -52,26 +55,28 @@ namespace Ryujinx.HLE.OsHle.Services.Aud
OutputDataHeader.EffectsSize = Params.EffectCount * 0x10; OutputDataHeader.EffectsSize = Params.EffectCount * 0x10;
OutputDataHeader.SinksSize = Params.SinkCount * 0x20; OutputDataHeader.SinksSize = Params.SinkCount * 0x20;
OutputDataHeader.PerformanceManagerSize = 0x10; OutputDataHeader.PerformanceManagerSize = 0x10;
OutputDataHeader.TotalSize = Marshal.SizeOf(OutputDataHeader) + OutputDataHeader.BehaviorSize + OutputDataHeader.MemoryPoolsSize + OutputDataHeader.TotalSize = Marshal.SizeOf(OutputDataHeader) +
OutputDataHeader.VoicesSize + OutputDataHeader.EffectsSize + OutputDataHeader.SinksSize + OutputDataHeader.PerformanceManagerSize; OutputDataHeader.BehaviorSize +
OutputDataHeader.MemoryPoolsSize +
OutputDataHeader.VoicesSize +
OutputDataHeader.EffectsSize +
OutputDataHeader.SinksSize +
OutputDataHeader.PerformanceManagerSize;
AMemoryHelper.Write(Context.Memory, OutputPosition, OutputDataHeader); AMemoryHelper.Write(Context.Memory, OutputPosition, OutputDataHeader);
for (int Offset = 0x40; Offset < 0x40 + OutputDataHeader.MemoryPoolsSize; Offset += 0x10, MemoryPoolOffset += 0x20) for (int Offset = 0x40; Offset < 0x40 + OutputDataHeader.MemoryPoolsSize; Offset += 0x10, MemoryPoolOffset += 0x20)
{ {
MemoryPoolStates PoolState = (MemoryPoolStates) Context.Memory.ReadInt32(InputPosition + MemoryPoolOffset + 0x10); MemoryPoolState PoolState = (MemoryPoolState)Context.Memory.ReadInt32(InputPosition + MemoryPoolOffset + 0x10);
if (PoolState == MemoryPoolStates.RequestAttach) //TODO: Figure out what the other values does.
if (PoolState == MemoryPoolState.RequestAttach)
{ {
Context.Memory.WriteInt32(OutputPosition + Offset, (int)MemoryPoolStates.Attached); Context.Memory.WriteInt32(OutputPosition + Offset, (int)MemoryPoolState.Attached);
} }
else if (PoolState == MemoryPoolStates.RequestDetach) else if (PoolState == MemoryPoolState.RequestDetach)
{ {
Context.Memory.WriteInt32(OutputPosition + Offset, (int)MemoryPoolStates.Detached); Context.Memory.WriteInt32(OutputPosition + Offset, (int)MemoryPoolState.Detached);
}
else
{
Context.Memory.WriteInt32(OutputPosition + Offset, (int)PoolState);
} }
} }
@ -118,4 +123,3 @@ namespace Ryujinx.HLE.OsHle.Services.Aud
} }
} }
} }

View file

@ -0,0 +1,13 @@
namespace Ryujinx.HLE.OsHle.Services.Aud
{
enum MemoryPoolState : int
{
Invalid = 0,
Unknown = 1,
RequestDetach = 2,
Detached = 3,
RequestAttach = 4,
Attached = 5,
Released = 6
}
}

View file

@ -1,13 +0,0 @@
namespace Ryujinx.HLE.OsHle.Services.Aud
{
enum MemoryPoolStates : int
{
Invalid = 0x0,
Unknown = 0x1,
RequestDetach = 0x2,
Detached = 0x3,
RequestAttach = 0x4,
Attached = 0x5,
Released = 0x6,
}
}