/// <summary> /// Generate a new <see cref="LimiterCommandVersion2"/>. /// </summary> /// <param name="bufferOffset">The target buffer offset.</param> /// <param name="parameter">The limiter parameter.</param> /// <param name="state">The limiter state.</param> /// <param name="effectResultState">The DSP effect result state.</param> /// <param name="isEnabled">Set to true if the effect should be active.</param> /// <param name="workBuffer">The work buffer to use for processing.</param> /// <param name="nodeId">The node id associated to this command.</param> public void GenerateLimiterEffectVersion2(uint bufferOffset, LimiterParameter parameter, Memory <LimiterState> state, Memory <EffectResultState> effectResultState, bool isEnabled, ulong workBuffer, int nodeId) { if (parameter.IsChannelCountValid()) { LimiterCommandVersion2 command = new LimiterCommandVersion2(bufferOffset, parameter, state, effectResultState, isEnabled, workBuffer, nodeId); command.EstimatedProcessingTime = _commandProcessingTimeEstimator.Estimate(command); AddCommand(command); } }
public LimiterState(ref LimiterParameter parameter, ulong workBuffer) { DectectorAverage = new float[parameter.ChannelCount]; CompressionGain = new float[parameter.ChannelCount]; DelayedSampleBuffer = new float[parameter.ChannelCount * parameter.DelayBufferSampleCountMax]; DelayedSampleBufferPosition = new int[parameter.ChannelCount]; DectectorAverage.AsSpan().Fill(0.0f); CompressionGain.AsSpan().Fill(1.0f); DelayedSampleBufferPosition.AsSpan().Fill(0); UpdateParameter(ref parameter); }
public LimiterCommandVersion1(uint bufferOffset, LimiterParameter parameter, Memory <LimiterState> state, bool isEnabled, ulong workBuffer, int nodeId) { Enabled = true; NodeId = nodeId; _parameter = parameter; State = state; WorkBuffer = workBuffer; IsEffectEnabled = isEnabled; InputBufferIndices = new ushort[Constants.VoiceChannelCountMax]; OutputBufferIndices = new ushort[Constants.VoiceChannelCountMax]; for (int i = 0; i < Parameter.ChannelCount; i++) { InputBufferIndices[i] = (ushort)(bufferOffset + Parameter.Input[i]); OutputBufferIndices[i] = (ushort)(bufferOffset + Parameter.Output[i]); } }
public void UpdateParameter(ref LimiterParameter parameter) { }
private uint EstimateLimiterCommandCommon(LimiterParameter parameter, bool enabled) { Debug.Assert(_sampleCount == 160 || _sampleCount == 240); if (_sampleCount == 160) { if (enabled) { switch (parameter.ChannelCount) { case 1: return((uint)21392.0f); case 2: return((uint)26829.0f); case 4: return((uint)32405.0f); case 6: return((uint)52219.0f); default: throw new NotImplementedException($"{parameter.ChannelCount}"); } } else { switch (parameter.ChannelCount) { case 1: return((uint)897.0f); case 2: return((uint)931.55f); case 4: return((uint)975.39f); case 6: return((uint)1016.8f); default: throw new NotImplementedException($"{parameter.ChannelCount}"); } } } if (enabled) { switch (parameter.ChannelCount) { case 1: return((uint)30556.0f); case 2: return((uint)39011.0f); case 4: return((uint)48270.0f); case 6: return((uint)76712.0f); default: throw new NotImplementedException($"{parameter.ChannelCount}"); } } else { switch (parameter.ChannelCount) { case 1: return((uint)874.43f); case 2: return((uint)921.55f); case 4: return((uint)945.26f); case 6: return((uint)992.26f); default: throw new NotImplementedException($"{parameter.ChannelCount}"); } } }