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;
}