//dataChunk ReadDataHeader() - 2004 July 28
        //Again, not much to say.
        public dataChunk ReadDataHeader()
        {
            data = new dataChunk();

            data.sChunkID      = "data";
            data.dwChunkSize   = reader.ReadUInt32();
            data.lFilePosition = reader.BaseStream.Position;
            if (fact != null)
            {
                data.dwNumSamples = fact.dwNumSamples;
            }
            else
            {
                data.dwNumSamples = data.dwChunkSize / (format.dwBitsPerSample / 8 * format.wChannels);
            }
            //The above could be written as data.dwChunkSize / format.wBlockAlign, but I want to emphasize what the frames look like.
            data.dwMinLength = (data.dwChunkSize / format.dwAvgBytesPerSec) / 60;
            data.dSecLength  = ((double)data.dwChunkSize / (double)format.dwAvgBytesPerSec) - (double)data.dwMinLength * 60;
            return(data);
        }
        public WaveFile(string filename)
        {
            reader            = new WaveFileReader(filename);
            maindata          = reader.ReadMainFileHeader();
            maindata.FileName = filename;
            long   chunkSize = 0;
            string chunkName = null;

            while (chunkName != "data" && reader.GetPosition() < (long)maindata.dwFileLength && reader.GetPosition() + chunkSize < maindata.dwFileLength)
            {
                chunkName = reader.GetChunkName();
                switch (chunkName)
                {
                case "fmt ":

                    format    = reader.ReadFormatHeader();
                    chunkSize = format.dwChunkSize;
                    break;

                case "fact":

                    fact      = reader.ReadFactHeader();
                    chunkSize = fact.dwChunkSize;
                    break;

                case "data":

                    data      = reader.ReadDataHeader();
                    chunkSize = data.dwChunkSize;
                    break;

                default:
                    //This provides the required skipping of unsupported chunks.
                    // reader.AdvanceToNext();

                    chunkSize = 0;
                    break;
                }
            }
        }