예제 #1
0
        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!");
        }
예제 #2
0
        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);
        }