protected override void DoTaskForFile(string pPath, IVgmtWorkerStruct pExtractStruct, DoWorkEventArgs e) { ExtractCriAcbAwbStruct extractStruct = (ExtractCriAcbAwbStruct)pExtractStruct; byte[] magicBytes; long awbOffset = 0; using (FileStream fs = File.Open(pPath, FileMode.Open, FileAccess.Read, FileShare.Read)) { magicBytes = ParseFile.ParseSimpleOffset(fs, 0, 4); this.progressStruct.Clear(); // ACB if (ParseFile.CompareSegment(magicBytes, 0, CriAcbFile.SIGNATURE_BYTES)) { this.progressStruct.GenericMessage = String.Format("Processing ACB file: '{0}'.{1}", Path.GetFileName(pPath), Environment.NewLine); ReportProgress(Constants.ProgressMessageOnly, this.progressStruct); CriAcbFile acb = new CriAcbFile(fs, 0, extractStruct.IncludeCueIdInFileName); acb.ExtractAll(); } else if (ParseFile.CompareSegment(magicBytes, 0, CriAfs2Archive.SIGNATURE)) { this.progressStruct.GenericMessage = String.Format("Processing AWB file: '{0}'.{1}", Path.GetFileName(pPath), Environment.NewLine); ReportProgress(Constants.ProgressMessageOnly, this.progressStruct); CriAfs2Archive afs2 = new CriAfs2Archive(fs, 0); afs2.ExtractAll(); } else { this.progressStruct.GenericMessage = String.Format("ACB/AWB signature not found at offset 0...scanning for AWB signature: '{0}'.{1}", Path.GetFileName(pPath), Environment.NewLine); ReportProgress(Constants.ProgressMessageOnly, this.progressStruct); awbOffset = ParseFile.GetNextOffset(fs, 0, CriAfs2Archive.SIGNATURE); if (awbOffset > 0) { CriAfs2Archive afs2 = new CriAfs2Archive(fs, awbOffset); afs2.ExtractAll(); } else { this.progressStruct.GenericMessage = String.Format("File is not an ACB or AWB...skipping: '{0}'.{1}", Path.GetFileName(pPath), Environment.NewLine); ReportProgress(Constants.ProgressMessageOnly, this.progressStruct); } } } }
public static void DecodeAcbFiles(FileInfo filename, DirectoryInfo AudioFolder) { var volume = 1F; var mode = 16; var loop = 0; var ciphKey1 = 0x92EBF464; uint ciphKey2 = 0x7E896318; var dir = AudioFolder; var dir2 = new DirectoryInfo(AudioFolder.FullName + @"\DecodedWavs\"); var acbfile = filename; var fs = new FileStream(acbfile.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); var af = new CriAcbFile(fs, 0, false); af.ExtractAll(); fs.Close(); var destinationFolder = new DirectoryInfo(Path.Combine(acbfile.DirectoryName, "_vgmt_acb_ext_" + Path.GetFileNameWithoutExtension(acbfile.FullName))); var OutFolder = Path.Combine(Path.GetDirectoryName(acbfile.FullName.Replace(dir.FullName, dir2.FullName)), Path.GetFileNameWithoutExtension(acbfile.FullName)); Directory.CreateDirectory(OutFolder); Parallel.ForEach(destinationFolder.GetFiles("*.hca", SearchOption.AllDirectories), hcafile => { using (var inputFileStream = File.Open(hcafile.FullName, FileMode.Open, FileAccess.Read)) { using (var outputFileStream = File.Open(OutFolder + @"\" + hcafile.Name.Substring(0, hcafile.Name.Length - 4) + ".wav", FileMode.Create, FileAccess.Write)) { var decodeParams = DecodeParams.CreateDefault(); decodeParams.Key1 = ciphKey1; decodeParams.Key2 = ciphKey2; decodeParams.KeyModifier = 0; var audioParams = AudioParams.CreateDefault(); audioParams.InfiniteLoop = AudioParams.Default.InfiniteLoop; audioParams.SimulatedLoopCount = AudioParams.Default.SimulatedLoopCount; audioParams.OutputWaveHeader = true; using (var hcaStream = new HcaAudioStream(inputFileStream, decodeParams, audioParams)) { var read = 1; var dataBuffer = new byte[1024]; while (read > 0) { read = hcaStream.Read(dataBuffer, 0, dataBuffer.Length); if (read > 0) { outputFileStream.Write(dataBuffer, 0, read); } } } } } File.Delete(hcafile.FullName); }); var awbfilename = acbfile.FullName.Substring(0, acbfile.FullName.Length - 4) + ".awb"; File.Delete(acbfile.FullName); File.Delete(awbfilename); Directory.Delete(destinationFolder.FullName, true); }