public static string ExtractSdat(string pSdatPath) { string fullPath = Path.GetFullPath(pSdatPath); string outputPath = null; string waveArcOutputPath; if (!File.Exists(fullPath)) { throw new FileNotFoundException(String.Format("Cannot find file <{0}>", fullPath)); } else { Swar swar = new Swar(); string swavOutputPath; using (FileStream fs = File.OpenRead(fullPath)) { Type dataType = FormatUtil.getObjectType(fs); if (dataType != null && dataType.Name.Equals("Sdat")) { string filePrefix = Path.GetFileNameWithoutExtension(fullPath); outputPath = Path.Combine(Path.GetDirectoryName(fullPath), filePrefix); Sdat sdat = new Sdat(); sdat.Initialize(fs, fullPath); sdat.ExtractBanks(fs, outputPath); sdat.ExtractSseqs(fs, outputPath); sdat.ExtractSeqArc(fs, outputPath); sdat.ExtractStrms(fs, outputPath); waveArcOutputPath = sdat.ExtractWaveArcs(fs, outputPath); // extract SWAVs if (!String.IsNullOrEmpty(waveArcOutputPath)) { foreach (string f in Directory.GetFiles(waveArcOutputPath, "*" + Swar.FILE_EXTENSION)) { using (FileStream swarFs = File.Open(f, FileMode.Open, FileAccess.Read)) { dataType = FormatUtil.getObjectType(swarFs); if (dataType != null && dataType.Name.Equals("Swar")) { swavOutputPath = Path.Combine(waveArcOutputPath, Path.GetFileNameWithoutExtension(f)); swar.Initialize(swarFs, f); ExtractAndWriteSwavFromSwar(swarFs, swar, swavOutputPath); } } } } sdat.BuildSmap(outputPath, filePrefix); } } } return(outputPath); }
public static void ExtractAndWriteSwavFromSwar(Stream pStream, Swar pSwar, string pOutputPath, bool includeOutputFolderInFileName) { string outputFileName; string outputFolderName = Path.GetFileName(pOutputPath); if (pSwar.SampleOffsets.Length > 0) { if (!Directory.Exists(pOutputPath)) { Directory.CreateDirectory(pOutputPath); } } for (int i = 0; i < pSwar.SampleOffsets.Length; i++) { if (pSwar.SampleOffsets[i] > 0) { Swav.SwavInfo swavInfo = Swav.GetSwavInfo(pStream, pSwar.SampleOffsets[i]); UInt32 fileSize = (swavInfo.LoopOffset + swavInfo.NonLoopLength) * 4; if (includeOutputFolderInFileName) { outputFileName = Path.Combine(pOutputPath, String.Format("{0}_{1}", outputFolderName, i.ToString("X2")) + Swav.FILE_EXTENSION); } else { outputFileName = Path.Combine(pOutputPath, i.ToString("X2") + Swav.FILE_EXTENSION); } using (BinaryWriter bw = new BinaryWriter(File.Open(outputFileName, FileMode.Create, FileAccess.Write))) { bw.Write(Swav.ASCII_SIGNATURE); bw.Write(BitConverter.GetBytes(fileSize + 0x10 + 0x08 + Swav.SWAV_INFO_SIZE)); bw.Write(BitConverter.GetBytes((UInt16)0x10)); bw.Write(BitConverter.GetBytes((UInt16)0x01)); bw.Write(Swav.DATA_SIGNATURE); bw.Write(BitConverter.GetBytes(fileSize + 0x08 + Swav.SWAV_INFO_SIZE)); bw.Write(ParseFile.ParseSimpleOffset(pStream, pSwar.SampleOffsets[i], (int)Swav.SWAV_INFO_SIZE)); bw.Write(ParseFile.ParseSimpleOffset(pStream, pSwar.SampleOffsets[i] + Swav.SWAV_INFO_SIZE, (int)fileSize)); } } } }
public static void ExtractAndWriteSwavFromSwar(Stream pStream, Swar pSwar, string pOutputPath) { ExtractAndWriteSwavFromSwar(pStream, pSwar, pOutputPath, false); }