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); } }
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); }
//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); }