using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace mame
{
    public class WavWrite
    {
        public static FileStream mWaveFile = null;
        private static BinaryWriter mWriter = null;
        private static int mSampleCount = 0;
        public static void CreateSoundFile(string filename)
        {
            mWaveFile = new FileStream(filename, FileMode.Create);
            mWriter = new BinaryWriter(mWaveFile);
            /**************************************************************************
             Hereiswherethefilewillbecreated.A
             wavefileisaRIFFfile,whichhaschunks
             ofdatathatdescribewhatthefilecontains.
             AwaveRIFFfileisputtogetherlikethis:
             The12byteRIFFchunkisconstructedlikethis:
             Bytes0-3:　'R''I''F''F'
             Bytes4-7:　Lengthoffile,minusthefirst8bytesoftheRIFFdescription.
                      (4bytesfor"WAVE"+24bytesforformatchunklength+
                      8bytesfordatachunkdescription+actualsampledatasize.)
              Bytes8-11:'W''A''V''E'
              The24byteFORMATchunkisconstructedlikethis:
              Bytes0-3:'f''m''t'''
              Bytes4-7:Theformatchunklength.Thisisalways16.
              Bytes8-9:Filepadding.Always1.
              Bytes10-11:Numberofchannels.Either1formono,　or2forstereo.
              Bytes12-15:Samplerate.
              Bytes16-19:Numberofbytespersecond.
              Bytes20-21:Bytespersample.1for8bitmono,2for8bitstereoor
                      16bitmono,4for16bitstereo.
              Bytes22-23:Numberofbitspersample.
              TheDATAchunkisconstructedlikethis:
              Bytes0-3:'d''a''t''a'
              Bytes4-7:Lengthofdata,inbytes.
              Bytes8-:Actualsampledata.
             ***************************************************************************/
            char[] ChunkRiff = { 'R', 'I', 'F', 'F' };
            char[] ChunkType = { 'W', 'A', 'V', 'E' };
            char[] ChunkFmt = { 'f', 'm', 't', ' ' };
            char[] ChunkData = { 'd', 'a', 't', 'a' };
            short shPad = 1;　　　　　　　　//Filepadding
            int nFormatChunkLength = 0x10;　//Formatchunklength.
            int nLength = 0;　　　　　　　　//Filelength,minusfirst8bytesofRIFFdescription.Thiswillbefilledinlater.
            mSampleCount = 0;
            //RIFF
            mWriter.Write(ChunkRiff);
            mWriter.Write(nLength);
            //WAVE
            mWriter.Write(ChunkType);
            mWriter.Write(ChunkFmt);
            mWriter.Write(nFormatChunkLength);
            mWriter.Write(shPad);
            mWriter.Write((short)2);
            mWriter.Write(48000);
            mWriter.Write(192000);
            mWriter.Write((short)4);
            mWriter.Write((short)16);
            //data
            mWriter.Write(ChunkData);
            mWriter.Write((int)0);
        }
        public static void CloseSoundFile()
        {
            mWriter.Seek(4, SeekOrigin.Begin);
            mWriter.Write((int)(mSampleCount + 36));
            mWriter.Seek(40, SeekOrigin.Begin);
            mWriter.Write(mSampleCount);
            mWriter.Close();
            mWaveFile.Close();
            mWriter = null;
            mWaveFile = null;
        }
        public static void wav_add_data_16(byte[] bb1, int length)
        {
            mWriter.Write(bb1, 0, length);
            mSampleCount += length;
            mWriter.Flush();
        }
    }
}