Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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;
        }
Esempio n. 3
0
        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);
        }