Пример #1
0
        public Stream GetContent(uint hash)
        {
            IdxEntry entry;

            if (!index.TryGetValue(hash, out entry))
            {
                return(null);
            }

            s.Seek(entry.Offset, SeekOrigin.Begin);

            var waveHeaderMemoryStream = new MemoryStream();

            var channels = (entry.Flags & 1) > 0 ? 2 : 1;

            if ((entry.Flags & 2) > 0)
            {
                // PCM
                waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("RIFF"));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes(entry.Length + 36));
                waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("WAVE"));
                waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("fmt "));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes(16));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)WavLoader.WaveType.Pcm));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)channels));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes(entry.SampleRate));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes(2 * channels * entry.SampleRate));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)(2 * channels)));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)16));
                waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("data"));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes(entry.Length));
            }

            if ((entry.Flags & 8) > 0)
            {
                // IMA ADPCM
                var samplesPerChunk = (2 * (entry.ChunkSize - 4)) + 1;
                var bytesPerSec     = (int)Math.Floor(((double)(2 * entry.ChunkSize) / samplesPerChunk) * ((double)entry.SampleRate / 2));
                var chunkSize       = entry.ChunkSize > entry.Length ? entry.Length : entry.ChunkSize;

                waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("RIFF"));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes(entry.Length + 52));
                waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("WAVE"));
                waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("fmt "));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes(20));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)WavLoader.WaveType.ImaAdpcm));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)channels));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes(entry.SampleRate));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes(bytesPerSec));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)chunkSize));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)4));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)2));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)samplesPerChunk));
                waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("fact"));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes(4));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes(4 * entry.Length));
                waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("data"));
                waveHeaderMemoryStream.Write(BitConverter.GetBytes(entry.Length));
            }

            waveHeaderMemoryStream.Seek(0, SeekOrigin.Begin);

            // Construct a merged stream
            var mergedStream = new MergedStream(waveHeaderMemoryStream, s);

            mergedStream.SetLength(waveHeaderMemoryStream.Length + entry.Length);

            return(mergedStream);
        }
Пример #2
0
        public void CanDispose()
        {
            var stream = new MergedStream();

            stream.Dispose();
        }
Пример #3
0
            public Stream GetStream(string filename)
            {
                IdxEntry entry;

                if (!index.TryGetValue(filename, out entry))
                {
                    return(null);
                }

                var waveHeaderMemoryStream = new MemoryStream();

                var channels = (entry.Flags & 1) > 0 ? 2 : 1;

                if ((entry.Flags & 2) > 0)
                {
                    // PCM
                    waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("RIFF"));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(entry.Length + 36));
                    waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("WAVE"));
                    waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("fmt "));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(16));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)1));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)channels));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(entry.SampleRate));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(2 * channels * entry.SampleRate));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)(2 * channels)));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)16));
                    waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("data"));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(entry.Length));
                }

                if ((entry.Flags & 8) > 0)
                {
                    // IMA ADPCM
                    var samplesPerChunk = (2 * (entry.ChunkSize - 4)) + 1;
                    var bytesPerSec     = (int)Math.Floor(((double)(2 * entry.ChunkSize) / samplesPerChunk) * ((double)entry.SampleRate / 2));
                    var chunkSize       = entry.ChunkSize > entry.Length ? entry.Length : entry.ChunkSize;

                    waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("RIFF"));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(entry.Length + 52));
                    waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("WAVE"));
                    waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("fmt "));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(20));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)17));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)channels));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(entry.SampleRate));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(bytesPerSec));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)chunkSize));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)4));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)2));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)samplesPerChunk));
                    waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("fact"));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(4));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(4 * entry.Length));
                    waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("data"));
                    waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(entry.Length));
                }

                waveHeaderMemoryStream.Seek(0, SeekOrigin.Begin);

                // Construct a merged stream
                var waveStream   = SegmentStream.CreateWithoutOwningStream(s, entry.Offset, (int)entry.Length);
                var mergedStream = new MergedStream(waveHeaderMemoryStream, waveStream);

                mergedStream.SetLength(waveHeaderMemoryStream.Length + entry.Length);

                return(mergedStream);
            }
Пример #4
0
 public void CanReadLengthOfMergedStream(MergedStream mergedStream, string expectedData)
 {
     Assert.Equal(expectedData.Length, mergedStream.Length);
 }