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); }
// find the last frame number public int GetCurrentFrameNumber() { int currentFrames = 0; currentFrames = Frames.Count > 0 ? Frames.Max(x => x.Key) : 0; return(currentFrames); }
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; }