using VoiceCat.Codec; using VoiceCat.Dsp; namespace VoiceCat.Tests; public sealed class MediaAllocationTests { [Fact] public void SteadyStateCodecAndDspDoNotAllocateManagedMemory() { using var encoder = new OpusEncoder(); using var decoder = new OpusDecoder(); using var denoiser = new RnnoiseProcessor(); var vad = new EnergyVadProcessor(); short[] pcm = new short[960]; short[] decoded = new short[960]; byte[] packet = new byte[4000]; CodecTests.FillTone(pcm, 960, 1, 48000, 0); for (int i = 0; i < 100; i++) Cycle(encoder, decoder, denoiser, vad, pcm, decoded, packet); long before = GC.GetAllocatedBytesForCurrentThread(); for (int i = 0; i < 1000; i++) Cycle(encoder, decoder, denoiser, vad, pcm, decoded, packet); long allocated = GC.GetAllocatedBytesForCurrentThread() - before; Assert.Equal(0, allocated); } private static void Cycle(OpusEncoder encoder, OpusDecoder decoder, RnnoiseProcessor denoiser, EnergyVadProcessor vad, short[] pcm, short[] decoded, byte[] packet) { int bytes = encoder.Encode(pcm, packet); decoder.Decode(packet.AsSpan(0, bytes), decoded, 960); denoiser.Process(decoded); vad.Process(decoded); } }