public override int Read(byte[] buffer, int offset, int count) { int read = 0; while (reader.Read()) { if (reader.RecordType == FlacBox.FlacRecordType.Subframe) { var samples = reader.GetValues().ToList(); int num = samples.Count; if (bitsPerSample == 8) { for (int i = 0; i < num; i++) { buffer[i + offset + read] = (byte)samples[i]; } } else { unsafe { if (offset + count > buffer.Length) throw new IndexOutOfRangeException(); fixed(byte *rawdata = buffer) { if (bitsPerSample == 16) { short *data = (short *)(rawdata + offset + read); for (int i = 0; i < num; i++) { data[i] = (short)samples[i]; } } else if (bitsPerSample == 32) { int *data = (int *)(rawdata + offset + read); for (int i = 0; i < num; i++) { data[i] = samples[i]; } } } } } read += samples.Count * bitsPerSample / 8; } } return(read); }
public override PcmChunkMessage Decode(PcmChunkMessage flacChunk) { byte[] allData = new byte[m_FlacHeader.Length + flacChunk.Payload.Length]; Buffer.BlockCopy(m_FlacHeader, 0, allData, 0, m_FlacHeader.Length); Buffer.BlockCopy(flacChunk.Payload, 0, allData, m_FlacHeader.Length, flacChunk.Payload.Length); using (MemoryStream stream = new MemoryStream(allData)) { using (FlacReader reader = new FlacReader(stream)) { byte[] newPayload = new byte[reader.Length]; reader.Read(newPayload, 0, newPayload.Length); flacChunk.ClearPayload(); flacChunk.SetPayload(newPayload); } } return(flacChunk); }