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); }
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(); }
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); }
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(); }
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(); } } }
public void WriteRecordToFile(TlkFileRecord record, string fileName) { using (var stream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite)) { try { WriteRecordToStream(record, stream); } finally { stream.Close(); } } }
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(); } } }
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(); }