Nanook.TheGhost.DatWad.writeFsbToStream C# (CSharp) Method

writeFsbToStream() private static method

private static writeFsbToStream ( FileStream fsWrite, string wavFilename, string internalFilename ) : long
fsWrite System.IO.FileStream
wavFilename string
internalFilename string
return long
        private static long writeFsbToStream(FileStream fsWrite, string wavFilename, string internalFilename)
        {
            int filenameLen = 30;
            long pos = fsWrite.Position;
            long ret;

            //open XBADPCM file to write as FSB file
            using (FileStream fs = File.OpenRead(wavFilename))
            {
                //not fully correct for XBADPCM
                WavSingleChunkHeader wh = WavProcessor.ParseWavSingleChunkHeader(fs);

                BinaryEndianWriter bw = new BinaryEndianWriter(fsWrite);

                byte[] fsbFilename = new byte[filenameLen];

                //FileHeader

                bw.Write(Encoding.Default.GetBytes("FSB3"));
                bw.Write((uint)1, EndianType.Little); //1 sample in file
                bw.Write((uint)80, EndianType.Little); //sampleheader length
                bw.Write(wh.ChunkLength, EndianType.Little); //sampleheader length
                bw.Write((uint)0x00030001, EndianType.Little); //header version 3.1
                bw.Write((uint)0, EndianType.Little); //global mode flags

                //SampleHeader (80 byte version)
                bw.Write((UInt16)80, EndianType.Little); //sampleheader length
                bw.Write(Encoding.Default.GetBytes(internalFilename.ToLower().PadRight(filenameLen, '\0').Substring(0, filenameLen))); //write filename

                //sampleheader length
                uint lenSamp = (uint)Math.Round(((double)wh.SamplesPerSec / (double)wh.AvgBytesPerSec) * wh.ChunkLength);
                if (lenSamp < 0xFA00)
                    lenSamp = 0xFA00; //set smallest allowed size? May be a memory allocation thing for FSB

                bw.Write(lenSamp, EndianType.Little); //sampleheader length
                bw.Write(wh.ChunkLength, EndianType.Little); //compressed bytes
                bw.Write((uint)0x0, EndianType.Little); //loop start
                bw.Write(lenSamp - 1, EndianType.Little); //loop end
                bw.Write((uint)0x20400041, EndianType.Little); //sample mode
                bw.Write(wh.SamplesPerSec, EndianType.Little); //frequency
                bw.Write((ushort)0xFF, EndianType.Little); //default volume
                bw.Write((ushort)0xFFFF, EndianType.Little); //default pan
                bw.Write((ushort)0xFF, EndianType.Little); //default pri
                bw.Write(wh.Channels, EndianType.Little); //channels
                bw.Write((float)1, EndianType.Little); //min distance
                bw.Write((float)1000000, EndianType.Little); //max distance
                bw.Write((uint)0x0, EndianType.Little); //varfreq
                bw.Write((ushort)0x0, EndianType.Little); //varvol
                bw.Write((ushort)0x0, EndianType.Little); //varpan

                copy(fs, fsWrite, wh.ChunkLength);
                uint fileSize = (uint)(24 + 80 + wh.ChunkLength);
                byte[] buff;

                ret = fsWrite.Position - pos;

                if (fileSize % DatWad.FileAlignment != 0)
                {
                    buff = new byte[DatWad.FileAlignment - (fileSize % DatWad.FileAlignment)];
                    for (int i = 0; i < buff.Length; i++)
                        buff[i] = DatWad.FileAlignmentPadValue;
                    fsWrite.Write(buff, 0, buff.Length);
                }
            }

            return ret;
        }