Support audio effect output status (#890)

* Support audio effect output status

* Remove extra line
This commit is contained in:
gdkchan 2020-01-17 06:07:27 -03:00 committed by Thog
parent a5e20a8fd1
commit 595e7716d8
5 changed files with 61 additions and 4 deletions

View File

@ -0,0 +1,7 @@
namespace Ryujinx.HLE.HOS.Services.Audio.AudioRendererManager
{
class EffectContext
{
public EffectOut OutStatus;
}
}

View File

@ -34,6 +34,8 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRendererManager
private VoiceContext[] _voices; private VoiceContext[] _voices;
private EffectContext[] _effects;
private int _track; private int _track;
private PlayState _playState; private PlayState _playState;
@ -42,22 +44,24 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRendererManager
Horizon system, Horizon system,
MemoryManager memory, MemoryManager memory,
IAalOutput audioOut, IAalOutput audioOut,
AudioRendererParameter Params) AudioRendererParameter rendererParams)
{ {
_updateEvent = new KEvent(system); _updateEvent = new KEvent(system);
_memory = memory; _memory = memory;
_audioOut = audioOut; _audioOut = audioOut;
_params = Params; _params = rendererParams;
_track = audioOut.OpenTrack( _track = audioOut.OpenTrack(
AudioRendererConsts.HostSampleRate, AudioRendererConsts.HostSampleRate,
AudioRendererConsts.HostChannelsCount, AudioRendererConsts.HostChannelsCount,
AudioCallback); AudioCallback);
_memoryPools = CreateArray<MemoryPoolContext>(Params.EffectCount + Params.VoiceCount * 4); _memoryPools = CreateArray<MemoryPoolContext>(rendererParams.EffectCount + rendererParams.VoiceCount * 4);
_voices = CreateArray<VoiceContext>(Params.VoiceCount); _voices = CreateArray<VoiceContext>(rendererParams.VoiceCount);
_effects = CreateArray<EffectContext>(rendererParams.EffectCount);
InitializeAudioOut(); InitializeAudioOut();
@ -205,6 +209,16 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRendererManager
voiceCtx.PlayState = voice.PlayState; voiceCtx.PlayState = voice.PlayState;
} }
EffectIn[] effectsIn = reader.Read<EffectIn>(inputHeader.EffectSize);
for (int index = 0; index < effectsIn.Length; index++)
{
if (effectsIn[index].IsNew != 0)
{
_effects[index].OutStatus.State = EffectState.New;
}
}
UpdateAudio(); UpdateAudio();
UpdateDataHeader outputHeader = new UpdateDataHeader(); UpdateDataHeader outputHeader = new UpdateDataHeader();
@ -245,6 +259,11 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRendererManager
writer.Write(voice.OutStatus); writer.Write(voice.OutStatus);
} }
foreach (EffectContext effect in _effects)
{
writer.Write(effect.OutStatus);
}
return ResultCode.Success; return ResultCode.Success;
} }

View File

@ -0,0 +1,12 @@
using System.Runtime.InteropServices;
namespace Ryujinx.HLE.HOS.Services.Audio.AudioRendererManager
{
[StructLayout(LayoutKind.Sequential, Size = 0xc0, Pack = 1)]
unsafe struct EffectIn
{
public byte Unknown0x0;
public byte IsNew;
public fixed byte Unknown[0xbe];
}
}

View File

@ -0,0 +1,11 @@
using System.Runtime.InteropServices;
namespace Ryujinx.HLE.HOS.Services.Audio.AudioRendererManager
{
[StructLayout(LayoutKind.Sequential, Size = 0x10, Pack = 1)]
unsafe struct EffectOut
{
public EffectState State;
public fixed byte Reserved[15];
}
}

View File

@ -0,0 +1,8 @@
namespace Ryujinx.HLE.HOS.Services.Audio.AudioRendererManager
{
enum EffectState : byte
{
None = 0,
New = 1
}
}