Пример #1
0
        private void ReadSubframe()
        {
            uint zeroPadding = bitReader.ReadBits(1);

            if (zeroPadding != 0)
            {
                throw new FlacException("Subframe zero padding is not zero");
            }
            int subframeType = (int)bitReader.ReadBits(6);

            SubframeType type;
            int          order = 0;

            if (subframeType == FlacCommons.ConstantSubframeType)
            {
                type = SubframeType.SubframeConstant;
            }
            else if (subframeType == FlacCommons.VerbatimSubframeType)
            {
                type = SubframeType.SubframeVerbatim;
            }
            else if (FlacCommons.FixedSubframeTypeStart <= subframeType &&
                     subframeType <= FlacCommons.FixedSubframeTypeEnd)
            {
                type  = SubframeType.SubframeFixed;
                order = subframeType - FlacCommons.FixedSubframeTypeStart;
            }
            else if (subframeType >= FlacCommons.LpcSubframeTypeStart)
            {
                type  = SubframeType.SubframeLpc;
                order = subframeType - FlacCommons.LpcSubframeTypeStart + 1;
            }
            else
            {
                throw new FlacException("Subframe type is set to reserved");
            }

            uint wastedBitsPerSampleFlag = bitReader.ReadBits(1);

            if (wastedBitsPerSampleFlag > 0)
            {
                this.wastedBitsPerSample = 1 + (int)bitReader.ReadUnary();
            }
            else
            {
                this.wastedBitsPerSample = 0;
            }

            this.subframeType = type;

            int subframeBitsPerSample = FrameBitsPerSample;

            if (ChannelAssignment[subframeIndex] == SoundChannelAssignment.Difference)
            {
                subframeBitsPerSample++; // undocumented
            }

            switch (type)
            {
            case SubframeType.SubframeConstant:
                PrepareConstantSubframe(subframeBitsPerSample);
                break;

            case SubframeType.SubframeVerbatim:
                PrepareVerbatimSubframe(subframeBitsPerSample);
                break;

            case SubframeType.SubframeLpc:
                PrepareLpcSubframe(order, subframeBitsPerSample);
                break;

            case SubframeType.SubframeFixed:
                PrepareFixedSubframe(order, subframeBitsPerSample);
                break;
            }

            this.recordType = FlacRecordType.Subframe;
            this.dataRead   = false;
        }