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; }
            }
        }
Exemple #2
0
        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);
                }
            }
        }
Exemple #3
0
        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);
            }
        }
Exemple #4
0
        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);
                }
            }
        }
Exemple #5
0
        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);
                }
            }
        }