private AdxKeyConfidence GetReencodeConfidence(CriAdxKey key, string filename) { CriAdxFormat adx; using (var stream = new FileStream(filename, FileMode.Open, FileAccess.Read)) { var reader = new AdxReader { EncryptionKey = key }; adx = (CriAdxFormat)reader.ReadFormat(stream); } Pcm16Format pcm = adx.ToPcm16(); CriAdxFormat adx2 = new CriAdxFormat().EncodeFromPcm16(pcm); var confidence = new AdxKeyConfidence(); int toCompareFull = adx.Channels[0].Audio.Length; int toCompareShort = Math.Min(adx.FrameSize * 100, toCompareFull); for (int i = 0; i < adx.ChannelCount; i++) { confidence.TotalBytesFull += toCompareFull; confidence.TotalBytesShort += toCompareShort; confidence.IdenticalBytesFull += Common.DiffArrays(adx.Channels[i].Audio, adx2.Channels[i].Audio, toCompareFull); confidence.IdenticalBytesShort += Common.DiffArrays(adx.Channels[i].Audio, adx2.Channels[i].Audio, toCompareShort); } return(confidence); }
public static void AdxToWav(FileInfo input, FileInfo output) { if (input == null) { throw new ArgumentNullException(nameof(input)); } if (output == null) { throw new ArgumentNullException(nameof(output)); } try { var data = new AdxReader().Read(input.OpenRead()); using var os = output.Open(FileMode.Create, FileAccess.Write, FileShare.Delete); new WaveWriter().WriteToStream(data, os); } catch (Exception) { var data = new AdxReader { EncryptionKey = new CriAdxKey(0x0030D9E8) }.Read(input.OpenRead()); using var os = output.Open(FileMode.Create, FileAccess.Write, FileShare.Delete); new WaveWriter().WriteToStream(data, os); } }
private int LoadFiles(params string[] files) { int type = 0; foreach (string file in files) { using (var stream = new FileStream(file, FileMode.Open, FileAccess.Read)) { var adx = new AdxReader().ReadMetadata(stream); if (type == 0) { type = adx.Revision; } if (adx.Revision != type) { continue; } var audioData = new byte[adx.AudioDataLength]; stream.Position = adx.HeaderSize + 4; stream.Read(audioData, 0, adx.AudioDataLength); Files.Add(new AdxFile(adx, audioData, file)); } } return(type); }
private void ConvertDAT(string filename) { // Load file WriteLog("Opening file: " + filename); byte[] file = File.ReadAllBytes(filename); switch (System.Text.Encoding.ASCII.GetString(file, 0, 0x10)) { case "archive V2.2\0\0\0": is2010 = false; WriteLog("Bank " + Path.GetFileName(filename) + " is already in the 2004 format."); return; case "archive V2.DMZ\0": is2010 = true; break; default: WriteLog("Bank " + Path.GetFileName(filename) + "error: Unknown archive version/type"); return; } int count = BitConverter.ToInt32(file, 0x10); files = new List <FENTRY>(count); for (int i = 0; i < count; i++) { files.Add(new FENTRY(file, 0x14 + (i * 0xC))); } // Convert WriteLog("Converting soundbank " + Path.GetFileName(filename) + "..."); List <FENTRY> list = new List <FENTRY>(files); foreach (FENTRY item in list) { byte[] waveFile = Compress.ProcessBuffer(item.file); if (is2010) { AudioData audio = new AdxReader().Read(waveFile); item.file = new WaveWriter().GetFile(audio); } } WriteLog("Saving DAT file: " + filename + "..."); int fsize = 0x14; int hloc = fsize; fsize += files.Count * 0xC; int tloc = fsize; foreach (FENTRY item in files) { fsize += item.name.Length + 1; } int floc = fsize; foreach (FENTRY item in files) { fsize += item.file.Length; } byte[] datfile = new byte[fsize]; System.Text.Encoding.ASCII.GetBytes("archive V2.2").CopyTo(datfile, 0); BitConverter.GetBytes(files.Count).CopyTo(datfile, 0x10); foreach (FENTRY item in files) { BitConverter.GetBytes(tloc).CopyTo(datfile, hloc); hloc += 4; System.Text.Encoding.ASCII.GetBytes(item.name).CopyTo(datfile, tloc); tloc += item.name.Length + 1; BitConverter.GetBytes(floc).CopyTo(datfile, hloc); hloc += 4; item.file.CopyTo(datfile, floc); floc += item.file.Length; BitConverter.GetBytes(item.file.Length).CopyTo(datfile, hloc); hloc += 4; } File.WriteAllBytes(filename, datfile); progressBar1.Value += 1; }