예제 #1
0
        private short[][] Decode(OpusParameters config)
        {
            var dec = new OpusDecoder(SampleRate, ChannelCount);

            int maxSampleCount = Frames.Max(x => x.SampleCount);

            var pcmOut    = Helpers.CreateJaggedArray <short[][]>(ChannelCount, SampleCount);
            var pcmBuffer = new short[ChannelCount * maxSampleCount];
            int outPos    = 0;
            int remaining = SampleCount + PreSkipCount;

            config.Progress?.SetTotal(Frames.Count);

            for (int i = 0; i < Frames.Count; i++)
            {
                int frameSamples = Math.Min(remaining, Frames[i].SampleCount);
                dec.Decode(Frames[i].Data, 0, Frames[i].Data.Length, pcmBuffer, 0, maxSampleCount);

                short[][] deinterleaved = pcmBuffer.DeInterleave(1, ChannelCount);

                CopyBuffer(deinterleaved, frameSamples, pcmOut, PreSkipCount, outPos);

                outPos    += frameSamples;
                remaining -= frameSamples;

                config.Progress?.ReportAdd(1);
            }

            config.Progress?.SetTotal(0);

            return(pcmOut);
        }
예제 #2
0
        // find the last frame number
        public int GetCurrentFrameNumber()
        {
            int currentFrames = 0;

            currentFrames = Frames.Count > 0 ? Frames.Max(x => x.Key) : 0;

            return(currentFrames);
        }
예제 #3
0
        public void EnsureHasFinalRange()
        {
            if (HasFinalRange)
            {
                return;
            }

            int maxSampleCount = Frames.Max(x => x.SampleCount);
            var dec            = new OpusDecoder(SampleRate, ChannelCount);
            var pcm            = new short[5760 * ChannelCount];

            foreach (OpusFrame frame in Frames)
            {
                dec.Decode(frame.Data, 0, frame.Data.Length, pcm, 0, maxSampleCount);
                frame.FinalRange = dec.FinalRange;
            }

            HasFinalRange = true;
        }