示例#1
0
        public static TlkFile Load(string tlkFilePath)
        {
            var tlkFile = new TlkFile(tlkFilePath);

            using (var fs = new FileStream(tlkFilePath, FileMode.Open, FileAccess.Read))
                using (var br = new BinaryReader(fs))
                {
                    fs.Seek(0, SeekOrigin.Begin);
                    tlkFile.Directory = new TlkFileDirectory
                    {
                        field1 = br.ReadUInt32(),
                        field2 = br.ReadUInt32(),
                        field3 = br.ReadUInt32()
                    };

                    var firstFileDescriptorOffset = br.ReadUInt32();
                    var numRecords = (firstFileDescriptorOffset - TLK_HEADER_SIZE) / 4;
                    fs.Seek(-4, SeekOrigin.Current);
                    tlkFile.Directory.records = new TlkFileRecord[numRecords];
                    for (var i = 0; i < numRecords; i++)
                    {
                        var thisRecord = new TlkFileRecord {
                            tlkId = (uint)i, offset = br.ReadUInt32()
                        };
                        var curPos = fs.Position;
                        fs.Seek(thisRecord.offset, SeekOrigin.Begin);
                        thisRecord.uncompressedDataLength = br.ReadUInt32();
                        thisRecord.compressedDataLength   = br.ReadUInt32();
                        thisRecord.compressedDataOffset   = thisRecord.offset + 8;
                        fs.Seek(curPos, SeekOrigin.Begin);
                        tlkFile.Directory.records[i] = thisRecord;
                    }
                }
            return(tlkFile);
        }
示例#2
0
        public static void ImportCompressedFiles(Dictionary <uint, string> files, string tlkFileName, CodecType codecType,
                                                 TextWriter outputWriter)
        {
            var tlkFile      = Load(tlkFileName);
            var tlkFileCodec = tlkFile.DetectTlkFileCodecType();

            if (tlkFileCodec != CodecType.Unknown && tlkFileCodec != codecType)
            {
                throw new InvalidOperationException(
                          string.Format(
                              "Invalid <codec> argument: {0} was built using files that were encoded using the {1} codec, not the {2} codec.",
                              tlkFileName, tlkFileCodec, codecType));
            }
            var recordsToInsert = new List <TlkFileRecord>();

            foreach (var dictionaryEntry in files)
            {
                var compressedFileName = dictionaryEntry.Value;
                var tlkFileId          = dictionaryEntry.Key;
                if (outputWriter != null)
                {
                    outputWriter.Write("Importing " + compressedFileName + "...");
                }
                using (var ms = new MemoryStream())
                {
                    uint compressedSize;
                    uint uncompressedSize;
                    LoadCompressedFileAndWriteToStream(ms, compressedFileName, out uncompressedSize, out compressedSize);
                    ms.Flush();
                    ms.Seek(0, SeekOrigin.Begin);
                    var thisRecordToInsert = new TlkFileRecord
                    {
                        tlkId = tlkFileId,
                        uncompressedDataLength = uncompressedSize
                    };
                    var compressedFileBytes = ms.ToArray();
                    thisRecordToInsert.compressedData = new byte[compressedFileBytes.Length - 8];
                    Array.Copy(compressedFileBytes, 8, thisRecordToInsert.compressedData, 0,
                               compressedFileBytes.Length - 8);
                    thisRecordToInsert.compressedDataLength = compressedSize;
                    recordsToInsert.Add(thisRecordToInsert);
                }
                if (outputWriter != null)
                {
                    outputWriter.WriteLine("Completed.");
                }
            }
            if (outputWriter != null)
            {
                outputWriter.Write("Reindexing TLK file...");
            }
            tlkFile.UpdateRecords(recordsToInsert);
            if (outputWriter != null)
            {
                outputWriter.WriteLine("Completed.");
            }

            tlkFile.Save();
        }
示例#3
0
 public void DecompressRecordAndWriteToStream(CodecType codecType, TlkFileRecord record, Stream stream)
 {
     Array.Clear(_compressedAudioBuffer, 0, _compressedAudioBuffer.Length);
     Array.Clear(_uncompressedAudioBuffer, 0, _uncompressedAudioBuffer.Length);
     GetCompressedAudioDataFromRecord(record, _compressedAudioBuffer, 0);
     DecompressAudioDataAsWAVToStream(codecType, _compressedAudioBuffer, 0, (int)record.compressedDataLength,
                                      stream);
 }
示例#4
0
 public void WriteRecordToStream(TlkFileRecord record, Stream stream)
 {
     Array.Clear(_compressedAudioBuffer, 0, _compressedAudioBuffer.Length);
     GetCompressedAudioDataFromRecord(record, _compressedAudioBuffer, 0);
     stream.Write(BitConverter.GetBytes(record.uncompressedDataLength), 0, 4);
     stream.Write(BitConverter.GetBytes(record.compressedDataLength), 0, 4);
     stream.Write(_compressedAudioBuffer, 0, (int)record.compressedDataLength);
     stream.Flush();
 }
示例#5
0
 public void DecompressRecordAndWriteToFile(CodecType codecType, TlkFileRecord record, string fileName)
 {
     using (var stream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
     {
         try
         {
             DecompressRecordAndWriteToStream(codecType, record, stream);
         }
         finally
         {
             stream.Close();
         }
     }
 }
示例#6
0
 public void WriteRecordToFile(TlkFileRecord record, string fileName)
 {
     using (var stream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
     {
         try
         {
             WriteRecordToStream(record, stream);
         }
         finally
         {
             stream.Close();
         }
     }
 }
示例#7
0
 private void GetCompressedAudioDataFromRecord(TlkFileRecord record, byte[] outputBuffer, int outputBufferOffset)
 {
     using (var fs = new FileStream(_tlkFilePath, FileMode.Open, FileAccess.Read))
     {
         try
         {
             fs.Seek(record.compressedDataOffset, SeekOrigin.Begin);
             fs.Read(outputBuffer, outputBufferOffset, (int)record.compressedDataLength);
         }
         finally
         {
             fs.Close();
         }
     }
 }
示例#8
0
        public static void ImportWAVFiles(CodecType codecType, Dictionary <uint, string> files, string tlkFileName,
                                          TextWriter outputWriter)
        {
            var tlkFile = Load(tlkFileName);

            using (var codec = GetCodec(codecType))
            {
                var recordsToInsert = new List <TlkFileRecord>();
                foreach (var dictionaryEntry in files)
                {
                    var wavFileName = dictionaryEntry.Value;
                    var tlkFileId   = dictionaryEntry.Key;
                    if (outputWriter != null)
                    {
                        outputWriter.Write("Importing " + wavFileName + "...");
                    }
                    using (var ms = new MemoryStream())
                    {
                        CompressWAVFileAndWriteToStream(wavFileName, ms, codec);
                        ms.Flush();
                        ms.Seek(0, SeekOrigin.Begin);
                        var thisRecordToInsert = new TlkFileRecord
                        {
                            tlkId = tlkFileId,
                            uncompressedDataLength =
                                (uint)new FileInfo(wavFileName).Length,
                            compressedData = ms.ToArray()
                        };
                        thisRecordToInsert.compressedDataLength = (uint)thisRecordToInsert.compressedData.Length;
                        recordsToInsert.Add(thisRecordToInsert);
                    }
                    if (outputWriter != null)
                    {
                        outputWriter.WriteLine("Completed.");
                    }
                }
                if (outputWriter != null)
                {
                    outputWriter.Write("Reindexing TLK file...");
                }
                tlkFile.UpdateRecords(recordsToInsert);
                if (outputWriter != null)
                {
                    outputWriter.WriteLine("Completed.");
                }
            }
            tlkFile.Save();
        }