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(); } }
public CSTM() { Header = new CSTMHeader(false); Info = new INFO(true); Data = new DATA(); }
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); }