diff --git a/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectContext.cs b/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectContext.cs new file mode 100644 index 0000000000..9edea20652 --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectContext.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Ryujinx.HLE.HOS.Services.Aud.AudioRenderer +{ + class EffectContext + { + public EffectOut OutStatus; + + public EffectContext() + { + OutStatus.State = EffectState.None; + } + } +} diff --git a/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectIn.cs b/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectIn.cs new file mode 100644 index 0000000000..36dea86b2f --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectIn.cs @@ -0,0 +1,25 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.HLE.HOS.Services.Aud.AudioRenderer +{ + [StructLayout(LayoutKind.Sequential, Size = 0xc0, Pack = 4)] + unsafe struct EffectIn + { + public EffectType Type; + + public byte FirstUpdate; + public byte Enabled; + + public byte Unknown11; + + public uint MixID; + + public ulong BufferBase; + public ulong BufferSZ; + + public int Priority; + + public uint Unknown24; + public fixed byte Padding[0xa0]; + } +} diff --git a/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectOut.cs b/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectOut.cs new file mode 100644 index 0000000000..e94aa5f39e --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectOut.cs @@ -0,0 +1,14 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.HLE.HOS.Services.Aud.AudioRenderer +{ + [StructLayout(LayoutKind.Sequential, Size = 0x13, Pack = 4)] + struct EffectOut + { + public EffectState State; + public int Unknown14; + public long Unknown18; + public short Unknown12; + public byte Unknown11; + } +} diff --git a/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectState.cs b/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectState.cs new file mode 100644 index 0000000000..a368e4a4cc --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectState.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Ryujinx.HLE.HOS.Services.Aud.AudioRenderer +{ + enum EffectState + { + None = 0, + New = 1 + } +} diff --git a/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectType.cs b/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectType.cs new file mode 100644 index 0000000000..16ea96e9e7 --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/EffectType.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Ryujinx.HLE.HOS.Services.Aud.AudioRenderer +{ + enum EffectType + { + None = 0, + Aux = 2 + } +} diff --git a/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/IAudioRenderer.cs b/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/IAudioRenderer.cs index 0ad193ca92..8fa8df00f6 100644 --- a/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/IAudioRenderer.cs +++ b/Ryujinx.HLE/HOS/Services/Aud/AudioRenderer/IAudioRenderer.cs @@ -38,6 +38,8 @@ namespace Ryujinx.HLE.HOS.Services.Aud.AudioRenderer private VoiceContext[] _voices; + private EffectContext[] _effects; + private int _track; private PlayState _playState; @@ -75,6 +77,8 @@ namespace Ryujinx.HLE.HOS.Services.Aud.AudioRenderer _voices = CreateArray(Params.VoiceCount); + _effects = CreateArray(Params.EffectCount); + InitializeAudioOut(); _playState = PlayState.Stopped; @@ -210,6 +214,18 @@ namespace Ryujinx.HLE.HOS.Services.Aud.AudioRenderer voiceCtx.PlayState = voice.PlayState; } + EffectIn[] effectsIn = reader.Read(inputHeader.EffectSize); + + for (int index = 0; index < effectsIn.Length; index++) + { + EffectIn effect = effectsIn[index]; + + if (effect.FirstUpdate != 0) + { + _effects[index].OutStatus.State = EffectState.New; + } + } + UpdateAudio(); UpdateDataHeader outputHeader = new UpdateDataHeader(); @@ -243,6 +259,11 @@ namespace Ryujinx.HLE.HOS.Services.Aud.AudioRenderer writer.Write(voice.OutStatus); } + foreach (EffectContext effect in _effects) + { + writer.Write(effect.OutStatus); + } + return 0; }