示例#1
0
        public FlacStream(string file, StreamMode mode, StreamAccessMode accessMode)
        {
            FileMode fileMode;
            FileAccess fileAccessMode;

            switch (mode)
            {
                case StreamMode.CreateNew:
                {
                    fileMode = FileMode.Create;
                    break;
                }
                case StreamMode.OpenExisting:
                {
                    fileMode = FileMode.Open;
                    break;
                }
                default:
                {
                    throw new FlacDebugException();
                }
            }

            switch (accessMode)
            {
                case StreamAccessMode.Read:
                case StreamAccessMode.Write:
                case StreamAccessMode.Both:
                {
                    fileAccessMode = (FileAccess)accessMode;
                    break;
                }
                default:
                {
                    throw new FlacDebugException();
                }
            }
            fileStream_ = new FileStream(file, fileMode, fileAccessMode, FileShare.Read);

            if ((accessMode & StreamAccessMode.Read) == StreamAccessMode.Read)
            {
                reader_ = new FlacStreamReader(fileStream_);
            }
            if ((accessMode & StreamAccessMode.Write) == StreamAccessMode.Write)
            {
                writer_ = new FlacStreamWriter(fileStream_);
            }
        }
示例#2
0
        public static byte[] ReadUtf8ULong(FlacStreamReader reader, out UInt64 decodedValue)
        {
            const int MAX_BITS_IN_STREAM = 7;
            byte[] retVal = new byte[MAX_BITS_IN_STREAM];

            UInt64 v = 0;
            UInt32 x;
            uint i;

            x = reader.ReadByte();
            retVal[0] = (byte)x;

            if ((x & 0x80) == 0)
            { /* 0xxxxxxx */
                v = x;
                i = 0;
            }
            else if ((x & 0xC0) != 0 && (x & 0x20) == 0)
            { /* 110xxxxx */
                v = x & 0x1F;
                i = 1;
            }
            else if ((x & 0xE0) != 0 && (x & 0x10) == 0)
            { /* 1110xxxx */
                v = x & 0x0F;
                i = 2;
            }
            else if ((x & 0xF0) != 0 && (x & 0x08) == 0)
            { /* 11110xxx */
                v = x & 0x07;
                i = 3;
            }
            else if ((x & 0xF8) != 0 && (x & 0x04) == 0)
            { /* 111110xx */
                v = x & 0x03;
                i = 4;
            }
            else if ((x & 0xFC) != 0 && (x & 0x02) == 0)
            { /* 1111110x */
                v = x & 0x01;
                i = 5;
            }
            else if ((x & 0xFE) != 0 && (x & 0x01) == 0)
            { /* 11111110 */
                v = 0;
                i = 6;
            }
            else
            {
                decodedValue = 0xffffffffffffffff;
                goto exit;
            }

            for (; i > 0; i--)
            {
                x = reader.ReadByte();
                retVal[MAX_BITS_IN_STREAM - i] = (byte)x;

                if ((x & 0x80) == 0 || (x & 0x40) != 0)
                { /* 10xxxxxx */
                    decodedValue = 0xffffffffffffffff;
                    goto exit;
                }
                v <<= 6;
                v |= (x & 0x3F);
            }
            decodedValue = v;

            exit:
            return retVal;
        }