Ejemplo n.º 1
0
            protected override void Init(DataPacket packet)
            {
                var submapCount = 1;
                if (packet.ReadBit()) submapCount += (int)packet.ReadBits(4);

                // square polar mapping
                var couplingSteps = 0;
                if (packet.ReadBit())
                {
                    couplingSteps = (int)packet.ReadBits(8) + 1;
                }

                var couplingBits = Utils.ilog(_vorbis._channels - 1);
                CouplingSteps = new CouplingStep[couplingSteps];
                for (int j = 0; j < couplingSteps; j++)
                {
                    var magnitude = (int)packet.ReadBits(couplingBits);
                    var angle = (int)packet.ReadBits(couplingBits);
                    if (magnitude == angle || magnitude > _vorbis._channels - 1 || angle > _vorbis._channels - 1)
                        throw new Exception();
                    CouplingSteps[j] = new CouplingStep { Angle = angle, Magnitude = magnitude };
                }

                // reserved bits
                if (packet.ReadBits(2) != 0UL) throw new Exception();

                // channel multiplex
                var mux = new int[_vorbis._channels];
                if (submapCount > 1)
                {
                    for (int c = 0; c < ChannelSubmap.Length; c++)
                    {
                        mux[c] = (int)packet.ReadBits(4);
                        if (mux[c] >= submapCount) throw new Exception();
                    }
                }

                // submaps
                Submaps = new Submap[submapCount];
                for (int j = 0; j < submapCount; j++)
                {
                    packet.ReadBits(8); // unused placeholder
                    var floorNum = (int)packet.ReadBits(8);
                    if (floorNum >= _vorbis.Floors.Length) throw new Exception();
                    var residueNum = (int)packet.ReadBits(8);
                    if (residueNum >= _vorbis.Residues.Length) throw new Exception();

                    Submaps[j] = new Submap
                    {
                        Floor = _vorbis.Floors[floorNum],
                        Residue = _vorbis.Residues[floorNum]
                    };
                }

                ChannelSubmap = new Submap[_vorbis._channels];
                for (int c = 0; c < ChannelSubmap.Length; c++)
                {
                    ChannelSubmap[c] = Submaps[mux[c]];
                }
            }
Ejemplo n.º 2
0
            protected override void Init(DataPacket packet)
            {
                var submapCount = 1;

                if (packet.ReadBit())
                {
                    submapCount += (int)packet.ReadBits(4);
                }

                // square polar mapping
                var couplingSteps = 0;

                if (packet.ReadBit())
                {
                    couplingSteps = (int)packet.ReadBits(8) + 1;
                }

                var couplingBits = Utils.ilog(_vorbis._channels - 1);

                CouplingSteps = new CouplingStep[couplingSteps];
                for (int j = 0; j < couplingSteps; j++)
                {
                    var magnitude = (int)packet.ReadBits(couplingBits);
                    var angle     = (int)packet.ReadBits(couplingBits);
                    if (magnitude == angle || magnitude > _vorbis._channels - 1 || angle > _vorbis._channels - 1)
                    {
                        throw new InvalidDataException();
                    }
                    CouplingSteps[j] = new CouplingStep {
                        Angle = angle, Magnitude = magnitude
                    };
                }

                // reserved bits
                if (packet.ReadBits(2) != 0UL)
                {
                    throw new InvalidDataException();
                }

                // channel multiplex
                var mux = new int[_vorbis._channels];

                if (submapCount > 1)
                {
                    for (int c = 0; c < ChannelSubmap.Length; c++)
                    {
                        mux[c] = (int)packet.ReadBits(4);
                        if (mux[c] >= submapCount)
                        {
                            throw new InvalidDataException();
                        }
                    }
                }

                // submaps
                Submaps = new Submap[submapCount];
                for (int j = 0; j < submapCount; j++)
                {
                    packet.ReadBits(8); // unused placeholder
                    var floorNum = (int)packet.ReadBits(8);
                    if (floorNum >= _vorbis.Floors.Length)
                    {
                        throw new InvalidDataException();
                    }
                    var residueNum = (int)packet.ReadBits(8);
                    if (residueNum >= _vorbis.Residues.Length)
                    {
                        throw new InvalidDataException();
                    }

                    Submaps[j] = new Submap
                    {
                        Floor   = _vorbis.Floors[floorNum],
                        Residue = _vorbis.Residues[floorNum]
                    };
                }

                ChannelSubmap = new Submap[_vorbis._channels];
                for (int c = 0; c < ChannelSubmap.Length; c++)
                {
                    ChannelSubmap[c] = Submaps[mux[c]];
                }
            }
Ejemplo n.º 3
0
            public override void Init(DataPacket packet)
            {
                int num = 1;

                if (packet.ReadBit())
                {
                    num += (int)packet.ReadBits(4);
                }
                int num2 = 0;

                if (packet.ReadBit())
                {
                    num2 = (int)packet.ReadBits(8) + 1;
                }
                int count = Utils.ilog(_vorbis._channels - 1);

                CouplingSteps = new CouplingStep[num2];
                for (int i = 0; i < num2; i++)
                {
                    int num3 = (int)packet.ReadBits(count);
                    int num4 = (int)packet.ReadBits(count);
                    if (num3 == num4 || num3 > _vorbis._channels - 1 || num4 > _vorbis._channels - 1)
                    {
                        throw new InvalidDataException();
                    }
                    CouplingSteps[i] = new CouplingStep
                    {
                        Angle     = num4,
                        Magnitude = num3
                    };
                }
                if (packet.ReadBits(2) != 0L)
                {
                    throw new InvalidDataException();
                }
                int[] array = new int[_vorbis._channels];
                if (num > 1)
                {
                    for (int j = 0; j < ChannelSubmap.Length; j++)
                    {
                        array[j] = (int)packet.ReadBits(4);
                        if (array[j] >= num)
                        {
                            throw new InvalidDataException();
                        }
                    }
                }
                Submaps = new Submap[num];
                for (int k = 0; k < num; k++)
                {
                    packet.ReadBits(8);
                    int num5 = (int)packet.ReadBits(8);
                    if (num5 >= _vorbis.Floors.Length)
                    {
                        throw new InvalidDataException();
                    }
                    if ((int)packet.ReadBits(8) >= _vorbis.Residues.Length)
                    {
                        throw new InvalidDataException();
                    }
                    Submaps[k] = new Submap
                    {
                        Floor   = _vorbis.Floors[num5],
                        Residue = _vorbis.Residues[num5]
                    };
                }
                ChannelSubmap = new Submap[_vorbis._channels];
                for (int l = 0; l < ChannelSubmap.Length; l++)
                {
                    ChannelSubmap[l] = Submaps[array[l]];
                }
            }