Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Eliminate most allocations #10

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions WaveFormRendererLib/AveragePeakProvider.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
using System;
using System.Linq;

namespace NAudio.WaveFormRenderer
{
public class AveragePeakProvider : PeakProvider
public sealed class AveragePeakProvider : PeakProvider
{
private readonly float scale;

Expand All @@ -15,8 +14,8 @@ public AveragePeakProvider(float scale)
public override PeakInfo GetNextPeak()
{
var samplesRead = Provider.Read(ReadBuffer, 0, ReadBuffer.Length);
var sum = (samplesRead == 0) ? 0 : ReadBuffer.Take(samplesRead).Select(s => Math.Abs(s)).Sum();
var average = sum/samplesRead;
var sum = (samplesRead == 0) ? 0 : ReadBuffer.AsSpan(0, samplesRead).SumOfAbsoluteValues();
var average = sum / samplesRead;

return new PeakInfo(average * (0 - scale), average * scale);
}
Expand Down
2 changes: 1 addition & 1 deletion WaveFormRendererLib/DecibelPeakProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace NAudio.WaveFormRenderer
{
class DecibelPeakProvider : IPeakProvider
sealed class DecibelPeakProvider : IPeakProvider
{
private readonly IPeakProvider sourceProvider;
private readonly double dynamicRange;
Expand Down
49 changes: 49 additions & 0 deletions WaveFormRendererLib/MathHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System;

namespace NAudio.WaveFormRenderer
{
internal static class MathHelper
{
public static float SumOfAbsoluteValues(this Span<float> samples)
{
float result = 0;

for (int i = 0; i < samples.Length; i++)
{
result += Math.Abs(samples[i]);
}

return result;
}

public static float Min(this Span<float> samples)
{
float result = samples[0];

for (int i = 1; i < samples.Length; i++)
{
if (samples[i] < result)
{
result = samples[i];
}
}

return result;
}

public static float Max(this Span<float> samples)
{
float result = samples[0];

for (int i = 1; i < samples.Length; i++)
{
if (samples[i] > result)
{
result = samples[i];
}
}

return result;
}
}
}
8 changes: 4 additions & 4 deletions WaveFormRendererLib/MaxPeakProvider.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
using System.Linq;
using System;

namespace NAudio.WaveFormRenderer
{
public class MaxPeakProvider : PeakProvider
public sealed class MaxPeakProvider : PeakProvider
{
public override PeakInfo GetNextPeak()
{
var samplesRead = Provider.Read(ReadBuffer,0,ReadBuffer.Length);
var max = (samplesRead == 0) ? 0 : ReadBuffer.Take(samplesRead).Max();
var min = (samplesRead == 0) ? 0 : ReadBuffer.Take(samplesRead).Min();
var max = (samplesRead == 0) ? 0 : ReadBuffer.AsSpan(0, samplesRead).Max();
var min = (samplesRead == 0) ? 0 : ReadBuffer.AsSpan(0, samplesRead).Min();
return new PeakInfo(min, max);
}
}
Expand Down
7 changes: 4 additions & 3 deletions WaveFormRendererLib/PeakInfo.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
namespace NAudio.WaveFormRenderer
{
public class PeakInfo
public readonly struct PeakInfo
{
public PeakInfo(float min, float max)
{
Max = max;
Min = min;
}

public float Min { get; private set; }
public float Max { get; private set; }
public float Min { get; }

public float Max { get; }
}
}
4 changes: 2 additions & 2 deletions WaveFormRendererLib/RmsPeakProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace NAudio.WaveFormRenderer
{
public class RmsPeakProvider : PeakProvider
public sealed class RmsPeakProvider : PeakProvider
{
private readonly int blockSize;

Expand All @@ -28,7 +28,7 @@ public override PeakInfo GetNextPeak()
max = Math.Max(max, rms);
}

return new PeakInfo(0 -max, max);
return new PeakInfo(0 - max, max);
}
}
}
2 changes: 1 addition & 1 deletion WaveFormRendererLib/SamplingPeakProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace NAudio.WaveFormRenderer
{
public class SamplingPeakProvider : PeakProvider
public sealed class SamplingPeakProvider : PeakProvider
{
private readonly int sampleInterval;

Expand Down
7 changes: 4 additions & 3 deletions WaveFormRendererLib/WaveFormRendererLib.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Version>1.0.0</Version>
<Version>2.0.0</Version>
<Authors>Mark Heath</Authors>
<Description>WaveForm rendering component</Description>
<PackageProjectUrl>https://github.com/naudio/NAudio.WaveFormRenderer</PackageProjectUrl>
Expand All @@ -13,11 +13,12 @@
<AssemblyName>NAudio.WaveFormRenderer</AssemblyName>
<GenerateDocumentationFile Condition=" '$(Configuration)' == 'Release' ">true</GenerateDocumentationFile>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<LangVersion>8.0</LangVersion>
<LangVersion>9</LangVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="NAudio" Version="2.0.0" />
<PackageReference Include="System.Drawing.Common" Version="5.0.1" />
<PackageReference Include="System.Drawing.Common" Version="5.0.2" />
<PackageReference Include="System.Memory" Version="4.5.4" />
</ItemGroup>
</Project>