public WavFile(WavFile Copy) { Header = new WavHeader(Copy.Header); }
/// <summary> /// Загружает данные из файла /// </summary> /// <param name="path"></param> public void Load(Stream stream) { /******************************** Чтение заголовка *******************************/ Header = new WavHeader(); int hsize = Marshal.SizeOf(Header.GetType()); byte[] buffer = new byte[hsize]; stream.Read(buffer, 0, hsize); GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); Header = (WavHeader)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), Header.GetType()); handle.Free(); /******************************** Чтение данных *******************************/ if (Header.BitsPerSample > 32) throw new FormatException("Format is not supported: too large bps"); if (Header.AudioFormat != 1) throw new FormatException("Format is not supported: encoding format is not PCM"); NumSamples = (long)((stream.Length - hsize) * 8.0 / Header.BitsPerSample / Header.NumChannels); BinaryReader br = new BinaryReader(stream); Data = new int[Header.NumChannels][]; for (int i = 0; i < Header.NumChannels; i++) Data[i] = new int[NumSamples]; switch (Header.BitsPerSample) { case 8: for (int i = 0; i < Header.NumChannels; i++) { for (int j = 0; j < NumSamples; j++) Data[i][j] = br.ReadByte(); } break; case 16: for (int i = 0; i < Header.NumChannels; i++) { for (int j = 0; j < NumSamples; j++) Data[i][j] = br.ReadInt16(); } break; case 24: throw new NotImplementedException("24 bytes per second not supported"); default: for (int i = 0; i < Header.NumChannels; i++) { for (int j = 0; j < NumSamples; j++) Data[i][j] = br.ReadInt32(); } break; } stream.Close(); return; }
public WavHeader(WavHeader wavHeader) { ChunkId = wavHeader.ChunkId; ChunkSize = wavHeader.ChunkSize; Format = wavHeader.Format; Subchunk1Id = wavHeader.Subchunk1Id; Subchunk1Size = wavHeader.Subchunk1Size; AudioFormat = wavHeader.AudioFormat; NumChannels = wavHeader.NumChannels; SampleRate = wavHeader.SampleRate; ByteRate = wavHeader.ByteRate; BlockAlign = wavHeader.BlockAlign; BitsPerSample = wavHeader.BitsPerSample; Subchunk2Id = wavHeader.Subchunk2Id; Subchunk2Size = wavHeader.Subchunk2Size; }