private void TryReplacingTrackContents(Blackboard blackboard, TemporaryTrack track) { if (track.ExpectedName == null) { return; } var originalCodec = AvailableCodecs.GetCodec(track.CurrentCodec); if (originalCodec == null) { blackboard.Logger.Error($"The track ({track.ExpectedName}) uses the {track.OriginalEntry.Codec} Codec, but AudioMog has no handler to replace it! Skipping!"); return; } var typelessFilePath = Path.Combine(_hcaFilesFolder, track.ExpectedName); if (blackboard.Settings.UseWavFilesIfAvailable) { var wavFilePath = AddExtension(typelessFilePath, ".wav"); if (File.Exists(wavFilePath)) { blackboard.Logger.Log($"Appending {AddExtension(track.ExpectedName, ".wav")}!"); var wavFileBytes = File.ReadAllBytes(wavFilePath); var wavReader = new WaveReader(); var audioData = wavReader.Read(wavFileBytes); var hcaWriter = new HcaWriter(); var hcaFileBytes = hcaWriter.GetFile(audioData); track.RawPortion = hcaFileBytes; track.CurrentCodec = MaterialCodecType.HCA; return; } } var hcaFilePath = AddExtension(typelessFilePath, ".hca"); if (File.Exists(hcaFilePath)) { blackboard.Logger.Log($"Appending {AddExtension(track.ExpectedName, ".hca")}!"); var hcaFileBytes = File.ReadAllBytes(hcaFilePath); track.RawPortion = hcaFileBytes; track.CurrentCodec = MaterialCodecType.HCA; return; } var rawFilePath = AddExtension(typelessFilePath, originalCodec.FileFormat); if (File.Exists(rawFilePath)) { blackboard.Logger.Log($"Appending {AddExtension(track.ExpectedName, originalCodec.FileFormat)}!"); var hcaFileBytes = File.ReadAllBytes(rawFilePath); track.RawPortion = hcaFileBytes; track.CurrentCodec = track.OriginalEntry.Codec; return; } blackboard.Logger.Log($"Found no replacement to {track.ExpectedName}, using original track from uexp!"); }
private static int Main(string[] args) { var parser = new Parser(settings => { settings.IgnoreUnknownArguments = true; }); var parserResult = parser.ParseArguments <Options>(args); if (parserResult.Tag == ParserResultType.NotParsed) { Console.WriteLine(HelpMessage); return(-1); } var options = ((Parsed <Options>)parserResult).Value; var inputFile = Path.GetFullPath(options.InputFileName); string outputFile; if (!string.IsNullOrEmpty(options.OutputFileName)) { outputFile = options.OutputFileName; } else { var inputFileInfo = new FileInfo(inputFile); var inputFileDir = inputFileInfo.DirectoryName; if (inputFileDir == null) { inputFileDir = string.Empty; } outputFile = Path.Combine(inputFileDir, inputFileInfo.Name.Substring(0, inputFileInfo.Name.Length - inputFileInfo.Extension.Length) + ".hca"); } // Quality = 3 (~128 Kbps) for MLTD, 1 (~256 Kbps) for CGSS // Update 2018-10: CGSS uses q=2 and MLTD uses q=4, under the new encoder? var quality = options.Quaility; if (quality < 1 || quality > 5) { Console.WriteLine("Warning: Quality should be 1 to 5. Using q=2."); quality = 2; } Console.WriteLine("Encoding {0} to {1} (q={2}) ...", inputFile, outputFile, quality); var waveReader = new WaveReader(); AudioData audioData; using (var fileStream = File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read)) { audioData = waveReader.Read(fileStream); } var hcaWriter = new HcaWriter(); hcaWriter.Configuration.Quality = (CriHcaQuality)quality; hcaWriter.Configuration.LimitBitrate = false; // Encryption keys are not set here, so the output HCA will always be type 0. var fileData = hcaWriter.GetFile(audioData); using (var fileStream = File.Open(outputFile, FileMode.Create, FileAccess.Write, FileShare.Write)) { fileStream.Write(fileData, 0, fileData.Length); } return(0); }