Beispiel #1
0
 public void Pack(string file, WaveCompression compression, WaveEncryption encryption)
 {
     using (var stream = new FileStream(file, FileMode.Create))
     {
         Pack(stream, compression, encryption);
     }
 }
Beispiel #2
0
        private static Stream CreateEncryptionStream(Stream stream, WaveEncryption type, CryptoStreamMode mode)
        {
            switch (type)
            {
            case WaveEncryption.Unencrypted:
                return(stream);

            case WaveEncryption.AES:
                return(new CryptoStream(stream, mode == CryptoStreamMode.Write ? CreateAes().CreateEncryptor() : CreateAes().CreateDecryptor(), mode));

            default:
                throw new CustomException("This encryption method is not supported.");
            }
        }
Beispiel #3
0
 public void Pack(Stream output, WaveCompression compression, WaveEncryption encryption)
 {
     Pack(new BinaryWriter(output), compression, encryption);
 }
Beispiel #4
0
        public void Pack(BinaryWriter writer, WaveCompression compression, WaveEncryption encryption)
        {
            byte[] cdata;
            using (var buffer = new MemoryStream())
            {
                var enc = CreateEncryptionStream(buffer, encryption, CryptoStreamMode.Write);
                if (compression == WaveCompression.LZMA)                //needs buffer
                {
                    using (var compbuffer = new MemoryStream())
                    {
                        using (var comp = CreateCompressionStream(compbuffer, compression, CompressionMode.Compress))
                        {
                            comp.Write(RawData, 0, RawData.Length);
                        }
                        compbuffer.Position = 0;
                        compbuffer.CopyTo(enc);
                    }
                }
                else
                {
                    using (var comp = CreateCompressionStream(enc, compression, CompressionMode.Compress))
                    {
                        comp.Write(RawData, 0, RawData.Length);
                    }
                }
                enc.Close();
                cdata = buffer.ToArray();
            }

            short cbSize   = 2 + 4 + 16 + 4;
            int   fmtSize  = 16 + 2 + cbSize;
            int   riffSize = 4 + 8 + fmtSize + 8 + 4 + AdditionalChunks.Sum(c => 8 + c.Value.Length) + 8 + cdata.Length;

            writer.Write("RIFF".ToCharArray());
            writer.Write(riffSize);
            writer.Write("WAVE".ToCharArray());

            writer.Write("fmt ".ToCharArray());
            writer.Write(fmtSize);
            writer.Write((ushort)0xFFFE);
            writer.Write(NumChannels);
            writer.Write(SampleRate);
            writer.Write((int)Math.Round(cdata.Length / ((float)NumSamples / SampleRate)));
            writer.Write(BlockAlign);
            writer.Write(BitsPerSample);

            writer.Write(cbSize);
            writer.Write((short)0);
            writer.Write(0);

            //writer.Write(FormatGuids[compressionMethod].ToByteArray());
            writer.Write(Version1Guid.ToByteArray());
            writer.Write((byte)compression);
            writer.Write((byte)encryption);
            writer.Write(Format);

            writer.Write("fact".ToCharArray());
            writer.Write(4);
            writer.Write(NumSamples);

            foreach (var chunk in AdditionalChunks)
            {
                writer.Write(chunk.Key.ToCharArray());
                writer.Write(chunk.Value.Length);
                writer.Write(chunk.Value);
            }

            writer.Write("data".ToCharArray());
            writer.Write(cdata.Length);
            writer.Write(cdata);
        }