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); }
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); }