diff options
author | Tsuda Kageyu <tsuda.kageyu@gmail.com> | 2014-02-14 18:45:33 +0900 |
---|---|---|
committer | Tsuda Kageyu <tsuda.kageyu@gmail.com> | 2014-02-14 19:22:53 +0900 |
commit | 9e94f8bb6c44fe54cfd0ddd134d5dd53d65388e9 (patch) | |
tree | c7c3053eb5f73a9bcded0bec11fb5e2a0615379f /taglib/xm | |
parent | aa49723b48aa0fe4edb33da9fa4d596080b85abb (diff) |
Changed XM::File::save() to use seek() properly.
Diffstat (limited to 'taglib/xm')
-rw-r--r-- | taglib/xm/xmfile.cpp | 89 |
1 files changed, 41 insertions, 48 deletions
diff --git a/taglib/xm/xmfile.cpp b/taglib/xm/xmfile.cpp index d8373a78..50161fe4 100644 --- a/taglib/xm/xmfile.cpp +++ b/taglib/xm/xmfile.cpp @@ -403,97 +403,90 @@ bool XM::File::save() debug("XM::File::save() - Cannot save to a read only file."); return false; } + seek(17); writeString(d->tag.title(), 20); - seek(1, Current); + + seek(38); writeString(d->tag.trackerName(), 20); - seek(2, Current); + + seek(60); ulong headerSize = 0; if(!readU32L(headerSize)) return false; - seek(2+2+2, Current); + seek(70); ushort patternCount = 0; ushort instrumentCount = 0; if(!readU16L(patternCount) || !readU16L(instrumentCount)) return false; - seek(60 + headerSize); + long pos = 60 + headerSize; // should be offset_t in taglib2. // need to read patterns again in order to seek to the instruments: for(ushort i = 0; i < patternCount; ++ i) { + seek(pos); ulong patternHeaderLength = 0; if(!readU32L(patternHeaderLength) || patternHeaderLength < 4) return false; + seek(pos + 7); ushort dataSize = 0; - StructReader pattern; - pattern.skip(3).u16L(dataSize); - - uint count = pattern.read(*this, patternHeaderLength - 4U); - if(count != std::min(patternHeaderLength - 4U, (ulong)pattern.size())) + if (!readU16L(dataSize)) return false; - seek(patternHeaderLength - (4 + count) + dataSize, Current); + pos += patternHeaderLength + dataSize; } - StringList lines = d->tag.comment().split("\n"); + const StringList lines = d->tag.comment().split("\n"); uint sampleNameIndex = instrumentCount; for(ushort i = 0; i < instrumentCount; ++ i) { + seek(pos); ulong instrumentHeaderSize = 0; if(!readU32L(instrumentHeaderSize) || instrumentHeaderSize < 4) return false; - uint len = std::min(22UL, instrumentHeaderSize - 4U); + seek(pos + 4); + const uint len = std::min(22UL, instrumentHeaderSize - 4U); if(i >= lines.size()) writeString(String::null, len); else writeString(lines[i], len); - long offset = 0; + ushort sampleCount = 0; if(instrumentHeaderSize >= 29U) { - ushort sampleCount = 0; - seek(1, Current); + seek(pos + 27); if(!readU16L(sampleCount)) return false; + } + + ulong sampleHeaderSize = 0; + if(sampleCount > 0) { + seek(pos + 29); + if(instrumentHeaderSize < 33U || !readU32L(sampleHeaderSize)) + return false; + } + + pos += instrumentHeaderSize; - if(sampleCount > 0) { - ulong sampleHeaderSize = 0; - if(instrumentHeaderSize < 33U || !readU32L(sampleHeaderSize)) + for(ushort j = 0; j < sampleCount; ++ j) { + if(sampleHeaderSize > 4U) { + seek(pos); + ulong sampleLength = 0; + if(!readU32L(sampleLength)) return false; - // skip unhandeled header proportion: - seek(instrumentHeaderSize - 33, Current); - - for(ushort j = 0; j < sampleCount; ++ j) { - if(sampleHeaderSize > 4U) { - ulong sampleLength = 0; - if(!readU32L(sampleLength)) - return false; - offset += sampleLength; - - seek(std::min(sampleHeaderSize, 14UL), Current); - if(sampleHeaderSize > 18U) { - uint len = std::min(sampleHeaderSize - 18U, 22UL); - if(sampleNameIndex >= lines.size()) - writeString(String::null, len); - else - writeString(lines[sampleNameIndex ++], len); - seek(sampleHeaderSize - (18U + len), Current); - } - } - else { - seek(sampleHeaderSize, Current); - } + + if(sampleHeaderSize > 18U) { + seek(pos + 18); + const uint len = std::min(sampleHeaderSize - 18U, 22UL); + if(sampleNameIndex >= lines.size()) + writeString(String::null, len); + else + writeString(lines[sampleNameIndex ++], len); } } - else { - offset = instrumentHeaderSize - 29; - } + pos += sampleHeaderSize; } - else { - offset = instrumentHeaderSize - (4 + len); - } - seek(offset, Current); } return true; |