/// <summary> /// Creates and initializes a new <see cref="CriHcaEncoder"/>. The encoder /// will be ready to accept PCM audio via <see cref="Encode"/>. /// </summary> /// <param name="config">The configuration to be used when creating the HCA file.</param> public static CriHcaEncoder InitializeNew(CriHcaParameters config) { var encoder = new CriHcaEncoder(); encoder.Initialize(config); return(encoder); }
/// <summary> /// Initializes this <see cref="CriHcaEncoder"/>. Any preexisting state is reset, and the encoder /// will be ready to accept PCM audio via <see cref="Encode"/>. /// </summary> /// <param name="config">The configuration to be used when creating the HCA file.</param> public void Initialize(CriHcaParameters config) { if (config.ChannelCount > 8) { throw new ArgumentOutOfRangeException(nameof(config.ChannelCount), "HCA channel count must be 8 or below"); } CutoffFrequency = config.SampleRate / 2; Quality = config.Quality; PostSamples = 128; Hca = new HcaInfo { ChannelCount = config.ChannelCount, TrackCount = 1, SampleCount = config.SampleCount, SampleRate = config.SampleRate, MinResolution = 1, MaxResolution = 15, InsertedSamples = SamplesPerSubFrame }; Bitrate = CalculateBitrate(Hca, Quality, config.Bitrate, config.LimitBitrate); CalculateBandCounts(Hca, Bitrate, CutoffFrequency); Hca.CalculateHfrValues(); SetChannelConfiguration(Hca); int inputSampleCount = Hca.SampleCount; if (config.Looping) { Hca.Looping = true; Hca.SampleCount = Math.Min(config.LoopEnd, config.SampleCount); Hca.InsertedSamples += GetNextMultiple(config.LoopStart, SamplesPerFrame) - config.LoopStart; CalculateLoopInfo(Hca, config.LoopStart, config.LoopEnd); inputSampleCount = Math.Min(GetNextMultiple(Hca.SampleCount, SamplesPerSubFrame), config.SampleCount); inputSampleCount += SamplesPerSubFrame * 2; PostSamples = inputSampleCount - Hca.SampleCount; } CalculateHeaderSize(Hca); int totalSamples = inputSampleCount + Hca.InsertedSamples; Hca.FrameCount = totalSamples.DivideByRoundUp(SamplesPerFrame); Hca.AppendedSamples = Hca.FrameCount * SamplesPerFrame - Hca.InsertedSamples - inputSampleCount; Frame = new CriHcaFrame(Hca); Channels = Frame.Channels; PcmBuffer = CreateJaggedArray <short[][]>(Hca.ChannelCount, SamplesPerFrame); PostAudio = CreateJaggedArray <short[][]>(Hca.ChannelCount, PostSamples); HcaOutputBuffer = new Queue <byte[]>(); BufferPreSamples = Hca.InsertedSamples - 128; }
public static short[][] Decode(HcaInfo hca, byte[][] audio, CriHcaParameters config = null) { config?.Progress?.SetTotal(hca.FrameCount); var pcmOut = Helpers.CreateJaggedArray <short[][]>(hca.ChannelCount, hca.SampleCount); var pcmBuffer = Helpers.CreateJaggedArray <short[][]>(hca.ChannelCount, SamplesPerFrame); var frame = new CriHcaFrame(hca); for (int i = 0; i < hca.FrameCount; i++) { DecodeFrame(audio[i], frame, pcmBuffer); CopyPcmToOutput(pcmBuffer, pcmOut, hca, i); //CopyBuffer(pcmBuffer, pcmOut, hca.InsertedSamples, i); config?.Progress?.ReportAdd(1); } return(pcmOut); }