public virtual void Rebuild(bool force) { if (!IsDirty && !force) { return; } //Get uncompressed size int size = OnCalculateSize(force); //Create temp map FileMap uncompMap = FileMap.FromTempFile(size); //Rebuild node (uncompressed) Rebuild(uncompMap.Address, size, force); _replSrc.Map = _replUncompSrc.Map = uncompMap; //If compressed, compress resulting data. if (_compression != CompressionType.None) { //Compress node to temp file FileStream stream = new FileStream(Path.GetTempFileName(), FileMode.Open, FileAccess.ReadWrite, FileShare.None, 0x8, FileOptions.DeleteOnClose | FileOptions.SequentialScan); try { Compressor.Compact(_compression, uncompMap.Address, uncompMap.Length, stream, this); _replSrc = new DataSource(FileMap.FromStreamInternal(stream, FileMapProtect.Read, 0, (int)stream.Length), _compression); } catch (Exception x) { stream.Dispose(); throw; } } }
public override unsafe void Export(string outPath) { if (outPath.EndsWith(".wav")) { WAV.ToFile(CreateStreams()[0], outPath); } else { if (_audioSource != DataSource.Empty) { int size = WorkingUncompressed.Length + _audioSource.Length; using (FileStream stream = new FileStream(outPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) { stream.SetLength(size); using (FileMap map = FileMap.FromStreamInternal(stream, FileMapProtect.ReadWrite, 0, size)) { VoidPtr addr = map.Address; //Write header Memory.Move(addr, WorkingUncompressed.Address, (uint)WorkingUncompressed.Length); //Set the offset to the audio samples (_dataLocation) RSTMHeader *hdr = (RSTMHeader *)addr; hdr->_header._length = WorkingUncompressed.Length + _audioSource.Length; hdr->DATAData->Set(_audioSource.Length + 0x20); addr += WorkingUncompressed.Length; //Append audio samples to the end Memory.Move(addr, _audioSource.Address, (uint)_audioSource.Length); if (outPath.EndsWith(".bcstm")) { ShowADPCMConversionWarning(); byte[] bcstm_temp = CSTMConverter.FromRSTM(hdr); fixed(byte *ptr = bcstm_temp) { Memory.Move(map.Address, ptr, (uint)bcstm_temp.Length); } } else if (outPath.EndsWith(".bfstm")) { ShowADPCMConversionWarning(); byte[] bfstm_temp = FSTMConverter.FromRSTM(hdr); fixed(byte *ptr = bfstm_temp) { Memory.Move(map.Address, ptr, (uint)bfstm_temp.Length); } } } } } else { base.Export(outPath); } } }
public override unsafe void Export(string outPath) { LabelBuilder labl; int lablLen, size; VoidPtr addr; Rebuild(); if (_audioSource != DataSource.Empty) { //Get strings labl = new LabelBuilder(); GetStrings(labl); lablLen = (labl.Count == 0) ? 0 : labl.GetSize(); size = WorkingUncompressed.Length + lablLen + _audioSource.Length; using (FileStream stream = new FileStream(outPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) { stream.SetLength(size); using (FileMap map = FileMap.FromStreamInternal(stream, FileMapProtect.ReadWrite, 0, size)) { addr = map.Address; //Write header Memory.Move(addr, WorkingUncompressed.Address, (uint)WorkingUncompressed.Length); addr += WorkingUncompressed.Length; //Write strings if (lablLen > 0) { labl.Write(addr); } addr += lablLen; //Write data Memory.Move(addr, _audioSource.Address, (uint)_audioSource.Length); } } } else { base.Export(outPath); } }
public static void ToFile(IAudioStream source, string path) { using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, 8, FileOptions.SequentialScan)) { //Estimate size int outLen = 44 + (source.Samples * source.Channels * 2); //Create file map stream.SetLength(outLen); using (FileMap map = FileMap.FromStreamInternal(stream, FileMapProtect.ReadWrite, 0, outLen)) { RIFFHeader *riff = (RIFFHeader *)map.Address; * riff = new RIFFHeader(1, source.Channels, 16, source.Frequency, source.Samples); source.SamplePosition = 0; source.ReadSamples(map.Address + 44, source.Samples); } } }
public override void Export(string outPath) { LabelBuilder labl; int lablLen, size; VoidPtr addr; Rebuild(); //Get strings labl = new LabelBuilder(); GetStrings(labl); lablLen = labl.Count == 0 ? 0 : labl.GetSize(); size = WorkingUncompressed.Length + lablLen + _audioSource.Length; using (FileStream stream = new FileStream(outPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) { stream.SetLength(size); using (FileMap map = FileMap.FromStreamInternal(stream, FileMapProtect.ReadWrite, 0, size)) { addr = map.Address; //Write headers MoveRawUncompressed(addr, WorkingUncompressed.Length); addr += WorkingUncompressed.Length; //Write strings if (lablLen > 0) { labl.Write(addr); } addr += lablLen; //Write sound data int audioLen = _audioSource.Length; Memory.Move(addr, _audioSource.Address, (uint)audioLen); _audioSource.Close(); _audioSource = new DataSource(addr, audioLen); } } }
public override unsafe void Export(string outPath) { if (outPath.EndsWith(".wav")) { WAV.ToFile(CreateStreams()[0], outPath); } else { if (_audioSource != DataSource.Empty) { int size = WorkingUncompressed.Length + _audioSource.Length; using (FileStream stream = new FileStream(outPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) { stream.SetLength(size); using (FileMap map = FileMap.FromStreamInternal(stream, FileMapProtect.ReadWrite, 0, size)) { VoidPtr addr = map.Address; //Write header Memory.Move(addr, WorkingUncompressed.Address, (uint)WorkingUncompressed.Length); //Set the offset to the audio samples (_dataLocation) *(bint *)(addr + 0x14) = WorkingUncompressed.Length; addr += WorkingUncompressed.Length; //Append audio samples to the end Memory.Move(addr, _audioSource.Address, (uint)_audioSource.Length); } } } else { base.Export(outPath); } } }