aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Audio/Renderer/Server/CommandGenerator.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Audio/Renderer/Server/CommandGenerator.cs')
-rw-r--r--Ryujinx.Audio/Renderer/Server/CommandGenerator.cs87
1 files changed, 74 insertions, 13 deletions
diff --git a/Ryujinx.Audio/Renderer/Server/CommandGenerator.cs b/Ryujinx.Audio/Renderer/Server/CommandGenerator.cs
index 01e7c927..8e4ecd25 100644
--- a/Ryujinx.Audio/Renderer/Server/CommandGenerator.cs
+++ b/Ryujinx.Audio/Renderer/Server/CommandGenerator.cs
@@ -151,23 +151,35 @@ namespace Ryujinx.Audio.Renderer.Server
private void GenerateBiquadFilterForVoice(ref VoiceState voiceState, Memory<VoiceUpdateState> state, int baseIndex, int bufferOffset, int nodeId)
{
- for (int i = 0; i < voiceState.BiquadFilters.Length; i++)
+ bool supportsOptimizedPath = _rendererContext.BehaviourContext.IsBiquadFilterGroupedOptimizationSupported();
+
+ if (supportsOptimizedPath && voiceState.BiquadFilters[0].Enable && voiceState.BiquadFilters[1].Enable)
{
- ref BiquadFilterParameter filter = ref voiceState.BiquadFilters[i];
+ Memory<byte> biquadStateRawMemory = SpanMemoryManager<byte>.Cast(state).Slice(VoiceUpdateState.BiquadStateOffset, VoiceUpdateState.BiquadStateSize * Constants.VoiceBiquadFilterCount);
+ Memory<BiquadFilterState> stateMemory = SpanMemoryManager<BiquadFilterState>.Cast(biquadStateRawMemory);
- if (filter.Enable)
+ _commandBuffer.GenerateGroupedBiquadFilter(baseIndex, voiceState.BiquadFilters.ToSpan(), stateMemory, bufferOffset, bufferOffset, voiceState.BiquadFilterNeedInitialization, nodeId);
+ }
+ else
+ {
+ for (int i = 0; i < voiceState.BiquadFilters.Length; i++)
{
- Memory<byte> biquadStateRawMemory = SpanMemoryManager<byte>.Cast(state).Slice(VoiceUpdateState.BiquadStateOffset, VoiceUpdateState.BiquadStateSize * Constants.VoiceBiquadFilterCount);
+ ref BiquadFilterParameter filter = ref voiceState.BiquadFilters[i];
- Memory<BiquadFilterState> stateMemory = SpanMemoryManager<BiquadFilterState>.Cast(biquadStateRawMemory);
+ if (filter.Enable)
+ {
+ Memory<byte> biquadStateRawMemory = SpanMemoryManager<byte>.Cast(state).Slice(VoiceUpdateState.BiquadStateOffset, VoiceUpdateState.BiquadStateSize * Constants.VoiceBiquadFilterCount);
- _commandBuffer.GenerateBiquadFilter(baseIndex,
- ref filter,
- stateMemory.Slice(i, 1),
- bufferOffset,
- bufferOffset,
- !voiceState.BiquadFilterNeedInitialization[i],
- nodeId);
+ Memory<BiquadFilterState> stateMemory = SpanMemoryManager<BiquadFilterState>.Cast(biquadStateRawMemory);
+
+ _commandBuffer.GenerateBiquadFilter(baseIndex,
+ ref filter,
+ stateMemory.Slice(i, 1),
+ bufferOffset,
+ bufferOffset,
+ !voiceState.BiquadFilterNeedInitialization[i],
+ nodeId);
+ }
}
}
}
@@ -443,7 +455,7 @@ namespace Ryujinx.Audio.Renderer.Server
uint updateCount;
- if ((channelIndex - 1) != 0)
+ if (channelIndex != 1)
{
updateCount = 0;
}
@@ -556,6 +568,52 @@ namespace Ryujinx.Audio.Renderer.Server
}
}
+ private void GenerateCaptureEffect(uint bufferOffset, CaptureBufferEffect effect, int nodeId)
+ {
+ Debug.Assert(effect.Type == EffectType.CaptureBuffer);
+
+ if (effect.IsEnabled)
+ {
+ effect.GetWorkBuffer(0);
+ }
+
+ if (effect.State.SendBufferInfoBase != 0)
+ {
+ int i = 0;
+ uint writeOffset = 0;
+
+ for (uint channelIndex = effect.Parameter.ChannelCount; channelIndex != 0; channelIndex--)
+ {
+ uint newUpdateCount = writeOffset + _commandBuffer.CommandList.SampleCount;
+
+ uint updateCount;
+
+ if (channelIndex != 1)
+ {
+ updateCount = 0;
+ }
+ else
+ {
+ updateCount = newUpdateCount;
+ }
+
+ _commandBuffer.GenerateCaptureEffect(bufferOffset,
+ effect.Parameter.Input[i],
+ effect.State.SendBufferInfo,
+ effect.IsEnabled,
+ effect.Parameter.BufferStorageSize,
+ effect.State.SendBufferInfoBase,
+ updateCount,
+ writeOffset,
+ nodeId);
+
+ writeOffset = newUpdateCount;
+
+ i++;
+ }
+ }
+ }
+
private void GenerateEffect(ref MixState mix, int effectId, BaseEffect effect)
{
int nodeId = mix.NodeId;
@@ -597,6 +655,9 @@ namespace Ryujinx.Audio.Renderer.Server
case EffectType.Limiter:
GenerateLimiterEffect(mix.BufferOffset, (LimiterEffect)effect, nodeId, effectId);
break;
+ case EffectType.CaptureBuffer:
+ GenerateCaptureEffect(mix.BufferOffset, (CaptureBufferEffect)effect, nodeId);
+ break;
default:
throw new NotImplementedException($"Unsupported effect type {effect.Type}");
}