Example #1
0
        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)");
                    }
                }
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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}");
        }