Example #1
0
        private Stream LoadChunks(EriFile erif)
        {
            uint            current_sample = 0;
            List <MioChunk> chunks         = new List <MioChunk>();

            try
            {
                erif.BaseStream.Position = m_stream_pos;
                for (;;)
                {
                    long chunk_length = erif.FindSection("SoundStm");
                    if (chunk_length > int.MaxValue)
                    {
                        throw new FileSizeException();
                    }
                    var chunk = new MioChunk();
                    chunk.FirstSample = current_sample;
                    chunk.Version     = erif.ReadByte();
                    chunk.Flags       = erif.ReadByte();
                    erif.ReadInt16();
                    chunk.SampleCount = erif.ReadUInt32();
                    chunk.Position    = erif.BaseStream.Position;
                    chunk.Size        = (uint)(chunk_length - 8);
                    current_sample   += chunk.SampleCount;
                    chunks.Add(chunk);
                    erif.BaseStream.Seek(chunk.Size, SeekOrigin.Current);
                }
            }
            catch (EndOfStreamException) { /* ignore EOF errors */ }
            m_total_samples = current_sample;
            if (0 == m_total_samples)
            {
                m_decode_finished = true;
                return(Stream.Null);
            }
            uint sample_bytes = (uint)ChannelCount * BitsPerSample / 8;
            var  total_bytes  = m_total_samples * sample_bytes;

            m_wait_handles = new WaitHandle[2] {
                m_available_chunk, m_decode_complete
            };
            m_chunk_queue = new ConcurrentQueue <byte[]>();
            m_worker      = new BackgroundWorker();
            m_worker.WorkerSupportsCancellation = true;
            m_worker.DoWork += DoWork_Decode;
            m_worker.RunWorkerAsync(chunks);
            return(new MemoryStream((int)total_bytes));
        }
Example #2
0
 public ChunkStream(Stream source, MioChunk chunk) : base(source, true)
 {
     m_chunk             = chunk;
     BaseStream.Position = m_chunk.Position;
 }
Example #3
0
 public ChunkStream(Stream source, MioChunk chunk)
 {
     m_source          = source;
     m_chunk           = chunk;
     m_source.Position = m_chunk.Position;
 }