Ejemplo n.º 1
0
        public void Submit(SampleBuffer samples)
        {
            if (samples.Frames == 0)
            {
                return;
            }

#if NETSTANDARD2_0
            var dataSize = samples.Channels * samples.Frames * _bytesPerSample;

            var buffer = ArrayPool <byte> .Shared.Rent(dataSize);

            try
            {
                samples.CopyToInterleaved(buffer, _bitsPerSample);
                // ReSharper disable once PossibleNullReferenceException
                _writer.Write(buffer, 0, dataSize);
            }
            finally
            {
                ArrayPool <byte> .Shared.Return(buffer);
            }
#else
            Span <byte> buffer = stackalloc byte[samples.Channels * samples.Frames * _bytesPerSample];
            samples.CopyToInterleaved(buffer, _bitsPerSample);
            // ReSharper disable once PossibleNullReferenceException
            _writer.Write(buffer);
#endif
        }
Ejemplo n.º 2
0
        public void Submit(SampleBuffer samples)
        {
            if (samples.Frames == 0)
            {
                return;
            }

            if (_replayGainExport != null)
            {
                samples = _replayGainExport.Value.Process(samples);
            }

            if (samples.IsInterleaved)
            {
                Span <float> interleavedSamples = stackalloc float[samples.Frames * samples.Channels];
                samples.CopyToInterleaved(interleavedSamples);
                _encoder !.EncodeInterleaved(interleavedSamples, samples.Frames);
            }
            else if (samples.Channels == 1)
            {
                Span <float> monoSamples = stackalloc float[samples.Frames];
                samples.CopyTo(monoSamples);
                _encoder !.Encode(monoSamples, null);
            }
            else
            {
                Span <float> leftSamples  = stackalloc float[samples.Frames];
                Span <float> rightSamples = stackalloc float[samples.Frames];
                samples.CopyTo(leftSamples, rightSamples);
                _encoder !.Encode(leftSamples, rightSamples);
            }
        }
Ejemplo n.º 3
0
        public unsafe void Submit(SampleBuffer samples)
        {
            if (samples.Frames == 0)
            {
                return;
            }

            if (_replayGainExport != null)
            {
                samples = _replayGainExport.Value.Process(samples);
            }

            Span <float> buffer = stackalloc float[samples.Frames * samples.Channels];

            samples.CopyToInterleaved(buffer);

            var bufferList = new AudioBufferList
            {
                NumberBuffers = 1,
                Buffers       = new AudioBuffer[1]
            };

            bufferList.Buffers[0].NumberChannels = (uint)samples.Channels;
            bufferList.Buffers[0].DataByteSize   = (uint)(buffer.Length * Marshal.SizeOf <float>());
            bufferList.Buffers[0].Data           = new IntPtr(Unsafe.AsPointer(ref MemoryMarshal.GetReference(buffer)));

            // ReSharper disable once PossibleNullReferenceException
            var status = _audioFile.Write(bufferList, (uint)samples.Frames);

            if (status != ExtendedAudioFileStatus.Ok)
            {
                throw new AudioEncodingException($"Apple AAC encoder encountered error '{status}'.");
            }
        }
Ejemplo n.º 4
0
        public unsafe void Submit(SampleBuffer samples)
        {
            if (samples.Frames == 0)
            {
                return;
            }

            Span <int> buffer = stackalloc int[samples.Frames * samples.Channels];

            samples.CopyToInterleaved(buffer, _bitsPerSample);

            var bufferList = new AudioBufferList
            {
                NumberBuffers = 1,
                Buffers       = new AudioBuffer[1]
            };

            bufferList.Buffers[0].NumberChannels = (uint)samples.Channels;
            bufferList.Buffers[0].DataByteSize   = (uint)(buffer.Length * sizeof(int));
            bufferList.Buffers[0].Data           = new(Unsafe.AsPointer(ref MemoryMarshal.GetReference(buffer)));

            var status = _audioFile !.Write(bufferList, (uint)samples.Frames);

            if (status != ExtendedAudioFileStatus.Ok)
            {
                throw new AudioEncodingException($"Apple Lossless encoder encountered error '{status}'.");
            }
        }
Ejemplo n.º 5
0
        public void CopyToInterleavedIntReturnsExpectedResultsForStereo()
        {
            var outSamples = new int[4];

            using (var samples = new SampleBuffer(new[] { 1, 1 }, new[] { 2, 2 }, 16))
                samples.CopyToInterleaved(outSamples, 16);

            Assert.Equal(new[] { 1, 2, 1, 2 }, outSamples);
        }
Ejemplo n.º 6
0
        public void IntegersDoNotOverflow()
        {
            var inSamples  = new[] { int.MaxValue, int.MinValue };
            var outSamples = new int[inSamples.Length];

            using (var samples = new SampleBuffer(inSamples, 32))
                samples.CopyToInterleaved(outSamples, 32);

            Assert.True(true);
        }
Ejemplo n.º 7
0
        public void CopyToInterleavedPackedReturnsExpectedResultsForInterleaved()
        {
            var inSamples  = new byte[] { 1, 2, 1, 2 };
            var outSamples = new byte[4];

            using (var samples = new SampleBuffer(inSamples, 2, 16))
                samples.CopyToInterleaved(outSamples, 16);

            Assert.Equal(inSamples, outSamples);
        }
Ejemplo n.º 8
0
        public void CopyToInterleavedPackedThrowsExceptionWhenDisposed()
        {
            var samples    = new SampleBuffer(new float[2], 2);
            var outSamples = new byte[4];

            samples.Dispose();

            Assert.Throws <ObjectDisposedException>(() =>
                                                    samples.CopyToInterleaved(outSamples, 16));
        }
Ejemplo n.º 9
0
        public void CopyToInterleavedFloatReturnsExpectedResultsForInterleaved()
        {
            var inSamples  = new[] { 1f, 2f, 1f, 2f };
            var outSamples = new float[4];

            using (var samples = new SampleBuffer(inSamples, 2))
                samples.CopyToInterleaved(outSamples);

            Assert.Equal(inSamples, outSamples);
        }
Ejemplo n.º 10
0
        public void Submit(SampleBuffer samples)
        {
            if (samples.Frames == 0)
            {
                return;
            }

            Span <float> buffer = stackalloc float[samples.Frames * samples.Channels];

            samples.CopyToInterleaved(buffer);
            // ReSharper disable once PossibleNullReferenceException
            _analyzer.AddFrames(buffer, (uint)samples.Frames);
        }
Ejemplo n.º 11
0
        public void IntegersArePreservedExactly(int bitsPerSample, int minValue, int maxValue)
        {
            var inSamples = new int[4096];

            for (int i = 1, j = minValue, k = maxValue; i < inSamples.Length; i += 2, j++, k--)
            {
                inSamples[i - 1] = Math.Min(j, maxValue);
                inSamples[i]     = Math.Max(k, minValue);
            }
            var outSamples = new int[inSamples.Length];

            using (var samples = new SampleBuffer(inSamples, 2, bitsPerSample))
                samples.CopyToInterleaved(outSamples, bitsPerSample);

            Assert.Equal(inSamples, outSamples);
        }
Ejemplo n.º 12
0
        public SampleBuffer Process(SampleBuffer samples)
        {
            if (Math.Abs(_scale - 1) < 0.001)
            {
                return(samples);
            }

            Span <float> buffer = stackalloc float[samples.Frames * samples.Channels];

            samples.CopyToInterleaved(buffer);
            samples.Dispose();

            // Optimization - Vectorized implementation is significantly faster with AVX2 (256-bit SIMD)
            if (Vector.IsHardwareAccelerated)
            {
                var sampleVectors = MemoryMarshal.Cast <float, Vector <float> >(buffer);
                for (var vectorIndex = 0; vectorIndex < sampleVectors.Length; vectorIndex++)
                {
                    sampleVectors[vectorIndex] *= _scale;
                }

                for (var sampleIndex = sampleVectors.Length * Vector <float> .Count;
                     sampleIndex < buffer.Length;
                     sampleIndex++)
                {
                    buffer[sampleIndex] *= _scale;
                }
            }
            else
            {
                for (var sampleIndex = 0; sampleIndex < buffer.Length; sampleIndex++)
                {
                    buffer[sampleIndex] *= _scale;
                }
            }

            return(new SampleBuffer(buffer, samples.Channels));
        }