Example #1
0
 public WavFile(WavFile Copy)
 {
     Header = new WavHeader(Copy.Header);
 }
Example #2
0
        /// <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;
        }
Example #3
0
 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;
 }