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)); }
public ChunkStream(Stream source, MioChunk chunk) : base(source, true) { m_chunk = chunk; BaseStream.Position = m_chunk.Position; }
public ChunkStream(Stream source, MioChunk chunk) { m_source = source; m_chunk = chunk; m_source.Position = m_chunk.Position; }