Ejemplo n.º 1
0
        public override SoundInput TryOpen(IBinaryStream file)
        {
            var header = new byte[Math.Min(0xE1F, file.Length)];

            if (0x10 != file.Read(header, 0, 0x10))
            {
                return(null);
            }
            var signature = LittleEndian.ToUInt32(header, 0);

            byte[] key;
            if (!KnownKeys.TryGetValue(signature, out key))
            {
                signature = LittleEndian.ToUInt32(header, 0xC);
                if (!KnownKeys.TryGetValue(signature, out key))
                {
                    return(null);
                }
                file.Read(header, 4, 0xC);
            }
            header[0] = (byte)'O';
            header[1] = (byte)'g';
            header[2] = (byte)'g';
            header[3] = (byte)'S';
            file.Read(header, 0x10, header.Length - 0x10);
            int k = 0;

            for (int i = 4; i < header.Length; ++i)
            {
                header[i] ^= key[k++];
                if (k >= key.Length)
                {
                    k = 1;
                }
            }
            Stream input;

            if (header.Length >= file.Length)
            {
                input = new MemoryStream(header);
            }
            else
            {
                input = new PrefixStream(header, new StreamRegion(file.AsStream, file.Position));
            }
            var sound = new OggInput(input);

            if (header.Length >= file.Length)
            {
                file.Dispose();
            }
            return(sound);
        }
Ejemplo n.º 2
0
        public override SoundInput TryOpen(IBinaryStream file)
        {
            int length = (int)file.Length;

            if (length < 4)
            {
                return(null);
            }
            uint signature = file.ReadUInt8();

            switch (signature & 0x42)
            {
            case 0x42:
                length -= 3;
                break;

            case 0x02:
            case 0x40:
                length -= 1;
                break;

            default:
                return(null);
            }
            uint key    = (signature & 0xBD) ^ 0x6A8CD4E7u;
            var  header = file.ReadBytes(4);

            file.Position = 1;
            Decrypt(header, key);

            SoundInput sound = null;

            if (header.AsciiEqual("RIFF"))
            {
                sound = new WaveInput(DecryptedStream(file, length, key));
            }
            else if (header.AsciiEqual("OggS"))
            {
                sound = new OggInput(DecryptedStream(file, length, key));
            }
            if (sound != null)
            {
                file.Dispose();
            }
            return(sound);
        }