private static void ProcessAllBinaries(uint acbFormatVersion, DecodeParams baseDecodeParams, string extractDir, Afs2Archive archive, Stream dataStream, bool isInternal) { if (!Directory.Exists(extractDir)) { Directory.CreateDirectory(extractDir); } var afsSource = isInternal ? "internal" : "external"; var decodeParams = baseDecodeParams; if (acbFormatVersion >= NewEncryptionVersion) { decodeParams.KeyModifier = archive.HcaKeyModifier; } else { decodeParams.KeyModifier = 0; } foreach (var entry in archive.Files) { var record = entry.Value; var extractFileName = AcbFile.GetSymbolicFileNameFromCueId(record.CueId); extractFileName = extractFileName.ReplaceExtension(".bin", ".wav"); var extractFilePath = Path.Combine(extractDir, extractFileName); using (var fileData = AcbHelper.ExtractToNewStream(dataStream, record.FileOffsetAligned, (int)record.FileLength)) { var isHcaStream = HcaReader.IsHcaStream(fileData); Console.Write("Processing {0} AFS: #{1} (offset={2} size={3})... ", afsSource, record.CueId, record.FileOffsetAligned, record.FileLength); if (isHcaStream) { try { using (var fs = File.Open(extractFilePath, FileMode.Create, FileAccess.Write, FileShare.Write)) { DecodeHca(fileData, fs, decodeParams); } Console.WriteLine("decoded"); } catch (Exception ex) { if (File.Exists(extractFilePath)) { File.Delete(extractFilePath); } Console.WriteLine(ex.Message); } } else { Console.WriteLine("skipped (not HCA)"); } } } }
public Frequency[][] LoadFrequencies(string path) { string[] files = Directory.GetFiles(path, "*hca"); var freq = Helpers.CreateJaggedArray <Frequency[][]>(30, 0x100); var counts = Helpers.CreateJaggedArray <int[][]>(30, 0x100); int total = 0; Progress.SetTotal(files.Length); var reader = new HcaReader { Decrypt = false }; foreach (string file in files) { CriHcaFormat hca; using (var stream = new FileStream(file, FileMode.Open, FileAccess.Read)) { hca = (CriHcaFormat)reader.ReadFormat(stream); } foreach (byte[] frame in hca.AudioData) { for (int position = 0; position < 30; position++) { counts[position][frame[position]]++; } total++; } Progress.ReportAdd(1); } for (int position = 0; position < 30; position++) { for (int value = 0; value < 0x100; value++) { freq[position][value] = new Frequency((byte)value, (float)counts[position][value] / total); } freq[position] = freq[position].OrderByDescending(x => x.Freq).ToArray(); } return(freq); }
public override void ExtractAsWav(IApplicationLogger logger, MaterialSection.MaterialEntry entry, byte[] fullFileBytes, string wavPath) { var rawContentBytes = fullFileBytes.SubArray(entry.InnerStreamStartPosition, entry.InnerStreamSize); AudioData audioData = null; HcaReader reader = new HcaReader(); BinaryReader fullBinaryReader = new BinaryReader(new MemoryStream(fullFileBytes)); var encryption = fullBinaryReader.ReadByteAt(entry.ExtraDataOffset + 0x0d); if (encryption == 1) { DecryptHCA(entry, rawContentBytes, fullBinaryReader); } audioData = reader.Read(rawContentBytes); WaveWriter writer = new WaveWriter(); var wavBytes = writer.GetFile(audioData); File.WriteAllBytes(wavPath, wavBytes); logger.Log($"Created wav audio track at: {wavPath}"); }