Example #1
0
        public CSTM(byte[] Data)
        {
            EndianBinaryReader er = new EndianBinaryReader(new MemoryStream(Data), Endianness.LittleEndian);

            try
            {
                Header = new CSTMHeader(er);
                er.BaseStream.Position = Header.Sections[0].Offset;
                Info = new INFO(er);
                if (Header.NrSections > 2 && Header.Sections[1].Id == 0x4001)
                {
                    er.BaseStream.Position = Header.Sections[1].Offset;
                    Seek = new SEEK(er);
                    er.BaseStream.Position = Header.Sections[2].Offset;
                    this.Data = new DATA(er);
                }
                else
                {
                    er.BaseStream.Position = Header.Sections[1].Offset;
                    this.Data = new DATA(er);
                }
            }
            finally
            {
                er.Close();
            }
        }
Example #2
0
 public CSTM()
 {
     Header = new CSTMHeader(false);
     Info   = new INFO(true);
     Data   = new DATA();
 }
Example #3
0
 public bool CreateFromFile()
 {
     System.Windows.Forms.OpenFileDialog f = new System.Windows.Forms.OpenFileDialog();
     f.Filter = WAV.Identifier.GetFileFilter();
     if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
         f.FileName.Length > 0)
     {
         WAV w = new WAV(File.ReadAllBytes(f.FileName));
         Header = new CSTMHeader(false);
         Info   = new INFO(true);
         Data   = new DATA();
         Info.StreamInfo.SampleRate = w.Wave.FMT.SampleRate;
         Info.StreamInfo.NrChannels = (byte)w.Wave.FMT.NrChannel;
         if (w.Wave.FMT.AudioFormat == WAV.WaveData.FMTBlock.WaveFormat.WAVE_FORMAT_PCM && w.Wave.FMT.BitsPerSample == 16)
         {
             Info.StreamInfo.Format              = 1;
             Info.StreamInfo.SeekInterval        = 0x1000;
             Info.StreamInfo.LoopEnd             = (uint)((w.Wave.DATA.Data.Length / w.Wave.FMT.NrChannel) / 2);
             Info.StreamInfo.BlockSize           = 0x2000;
             Info.StreamInfo.BlockNrSamples      = 0x2000 / 2;
             Info.StreamInfo.NrBlocks            = (uint)((w.Wave.DATA.Data.Length / w.Wave.FMT.NrChannel) / 0x2000) + 1;
             Info.StreamInfo.LastBlockSize       = (uint)((w.Wave.DATA.Data.Length / w.Wave.FMT.NrChannel) % 0x2000);
             Info.StreamInfo.LastBlockPaddedSize = Info.StreamInfo.LastBlockSize;
             while ((Info.StreamInfo.LastBlockPaddedSize % 4) != 0)
             {
                 Info.StreamInfo.LastBlockPaddedSize++;
             }
             Info.StreamInfo.LastBlockNrSamples     = Info.StreamInfo.LastBlockSize / 2;
             Info.TrackInfoReferenceTable.NrEntries = 1;
             Info.TrackInfoReferenceTable.Entries   = new INFO.SectionInfo[] { new INFO.SectionInfo(0x4101) };
             Info.TrackInfos = new INFO.TrackInfo[] { new INFO.TrackInfo() };
             Info.ChannelInfoReferenceTable.NrEntries = 2;
             Info.ChannelInfoReferenceTable.Entries   = new INFO.SectionInfo[] { new INFO.SectionInfo(0x4102), new INFO.SectionInfo(0x4102) };
             Info.ChannelInfos = new INFO.ChannelInfo[] { new INFO.ChannelInfo(), new INFO.ChannelInfo() };
             byte[][] channels = new byte[w.Wave.FMT.NrChannel][];
             for (int i = 0; i < w.Wave.FMT.NrChannel; i++)
             {
                 channels[i] = w.GetChannelData(i);
             }
             Data.Data = new byte[(Info.StreamInfo.NrBlocks - 1) * 0x2000 * w.Wave.FMT.NrChannel + Info.StreamInfo.LastBlockPaddedSize * w.Wave.FMT.NrChannel];
             int offs = 0;
             for (int i = 0; i < Info.StreamInfo.NrBlocks - 1; i++)
             {
                 for (int j = 0; j < w.Wave.FMT.NrChannel; j++)
                 {
                     Array.Copy(channels[j], i * 0x2000, Data.Data, offs, 0x2000);
                     offs += 0x2000;
                 }
             }
             for (int j = 0; j < w.Wave.FMT.NrChannel; j++)
             {
                 Array.Copy(channels[j], channels[j].Length - Info.StreamInfo.LastBlockSize, Data.Data, offs, Info.StreamInfo.LastBlockSize);
                 offs += (int)Info.StreamInfo.LastBlockSize;
                 while ((offs % 4) != 0)
                 {
                     offs++;
                 }
             }
             return(true);
         }
         else
         {
             return(false);
         }
     }
     return(false);
 }