Пример #1
0
        private void ParseBlocks()
        {
            VoidPtr dataAddr = Header;
            int     len      = Header->_header._length;
            int     total    = WorkingUncompressed.Length;

            SetSizeInternal(len);

            //Look for labl block
            LABLHeader *labl = (LABLHeader *)(dataAddr + len);

            if ((total > len) && (labl->_tag == LABLHeader.Tag))
            {
                int count = labl->_numEntries;
                _labels = new LabelItem[count];
                count   = labl->_numEntries;
                for (int i = 0; i < count; i++)
                {
                    LABLEntry *entry = labl->Get(i);
                    _labels[i] = new LabelItem()
                    {
                        String = entry->Name, Tag = entry->_id
                    };
                }
                len += labl->_size;
            }

            //Set data source
            if (total > len)
            {
                _audioSource = new DataSource(dataAddr + len, total - len);
            }
        }
Пример #2
0
        public void Write(VoidPtr address)
        {
            LABLHeader *header   = (LABLHeader *)address;
            int         count    = _labels.Count;
            VoidPtr     dataAddr = address + 12 + count * 4;
            bint *      list     = (bint *)(address + 8);
            LabelItem   label;
            int         size;
            byte *      pad;

            for (int i = 0; i < count;)
            {
                label   = _labels[i++];
                list[i] = (int)dataAddr - (int)list;
                ((LABLEntry *)dataAddr)->Set(label.Tag, label.String);
                dataAddr += label.DataLen;
            }

            pad = (byte *)dataAddr;
            for (size = dataAddr - address; (size & 0x1F) != 0; size++)
            {
                *pad++ = 0;
            }

            header->Set(size, count);
        }
Пример #3
0
        //Finds labels using LABL block between header and footer, also initializes array
        protected bool GetLabels(int count)
        {
            RWSDHeader *header = (RWSDHeader *)WorkingUncompressed.Address;
            int         len    = header->_header._length;
            LABLHeader *labl   = (LABLHeader *)((int)header + len);

            if ((WorkingUncompressed.Length > len) && (labl->_tag == LABLHeader.Tag))
            {
                _labels = new LabelItem[count];
                count   = labl->_numEntries;
                for (int i = 0; i < count; i++)
                {
                    LABLEntry *entry = labl->Get(i);
                    _labels[i] = new LabelItem()
                    {
                        String = entry->Name, Tag = entry->_id
                    };
                }
                return(true);
            }

            return(false);
        }