Skip to content

Commit a0be82b

Browse files
committed
Fix audio voice release leak
1 parent b539816 commit a0be82b

2 files changed

Lines changed: 14 additions & 1 deletion

File tree

src/SoundType.Audio/ActiveVoiceSampleProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public int Read(float[] buffer, int offset, int count)
2323
try
2424
{
2525
int read = _source.Read(buffer, offset, count);
26-
if (read == 0)
26+
if (read == 0 || (count > 0 && read < count))
2727
{
2828
Release();
2929
}

src/SoundType.Tests/BackendPerformanceTests.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,19 @@ public void ActiveVoiceSampleProvider_ReleasesLeaseWhenSourceFinishes()
106106
Assert.Equal(0, limiter.ActiveVoices);
107107
}
108108

109+
[Fact]
110+
public void ActiveVoiceSampleProvider_ReleasesLeaseOnFinalPartialRead()
111+
{
112+
VoiceLimiter limiter = new(maxVoices: 1);
113+
Assert.True(limiter.TryAcquire(out IDisposable lease));
114+
ActiveVoiceSampleProvider provider = new(new ArraySampleProvider([0.25f]), lease);
115+
float[] buffer = new float[2];
116+
117+
Assert.Equal(1, provider.Read(buffer, 0, buffer.Length));
118+
119+
Assert.Equal(0, limiter.ActiveVoices);
120+
}
121+
109122
[Fact]
110123
public void WaveformPeakCache_ReusesPeaksForSameLoadedSample()
111124
{

0 commit comments

Comments
 (0)