2 |
* * |
* * |
3 |
* libgig - C++ cross-platform Gigasampler format file access library * |
* libgig - C++ cross-platform Gigasampler format file access library * |
4 |
* * |
* * |
5 |
* Copyright (C) 2003-2016 by Christian Schoenebeck * |
* Copyright (C) 2003-2017 by Christian Schoenebeck * |
6 |
* <cuse@users.sourceforge.net> * |
* <cuse@users.sourceforge.net> * |
7 |
* * |
* * |
8 |
* This library is free software; you can redistribute it and/or modify * |
* This library is free software; you can redistribute it and/or modify * |
269 |
* steps. |
* steps. |
270 |
* |
* |
271 |
* Once the whole data was processed by __calculateCRC(), one should |
* Once the whole data was processed by __calculateCRC(), one should |
272 |
* call __encodeCRC() to get the final CRC result. |
* call __finalizeCRC() to get the final CRC result. |
273 |
* |
* |
274 |
* @param buf - pointer to data the CRC shall be calculated of |
* @param buf - pointer to data the CRC shall be calculated of |
275 |
* @param bufSize - size of the data to be processed |
* @param bufSize - size of the data to be processed |
286 |
* |
* |
287 |
* @param crc - variable previously passed to __calculateCRC() |
* @param crc - variable previously passed to __calculateCRC() |
288 |
*/ |
*/ |
289 |
inline static uint32_t __encodeCRC(const uint32_t& crc) { |
inline static void __finalizeCRC(uint32_t& crc) { |
290 |
return crc ^ 0xffffffff; |
crc ^= 0xffffffff; |
291 |
} |
} |
292 |
|
|
293 |
|
|
1294 |
// if this is the last write, update the checksum chunk in the |
// if this is the last write, update the checksum chunk in the |
1295 |
// file |
// file |
1296 |
if (pCkData->GetPos() == pCkData->GetSize()) { |
if (pCkData->GetPos() == pCkData->GetSize()) { |
1297 |
|
__finalizeCRC(crc); |
1298 |
File* pFile = static_cast<File*>(GetParent()); |
File* pFile = static_cast<File*>(GetParent()); |
1299 |
pFile->SetSampleChecksum(this, __encodeCRC(crc)); |
pFile->SetSampleChecksum(this, crc); |
1300 |
} |
} |
1301 |
return res; |
return res; |
1302 |
} |
} |
1417 |
if (nRead <= 0) break; |
if (nRead <= 0) break; |
1418 |
__calculateCRC(&buffer[0], nRead * FrameSize, crc); |
__calculateCRC(&buffer[0], nRead * FrameSize, crc); |
1419 |
} |
} |
1420 |
__encodeCRC(crc); |
__finalizeCRC(crc); |
1421 |
return crc; |
return crc; |
1422 |
} |
} |
1423 |
|
|
4247 |
// recalculate CRC32 check sum |
// recalculate CRC32 check sum |
4248 |
__resetCRC(crc); |
__resetCRC(crc); |
4249 |
__calculateCRC(&data[0], data.size(), crc); |
__calculateCRC(&data[0], data.size(), crc); |
4250 |
__encodeCRC(crc); |
__finalizeCRC(crc); |
4251 |
// make sure chunk exists and has the required size |
// make sure chunk exists and has the required size |
4252 |
const file_offset_t chunkSize = (file_offset_t) 7*sizeof(int32_t) + Name.size() + data.size(); |
const file_offset_t chunkSize = (file_offset_t) 7*sizeof(int32_t) + Name.size() + data.size(); |
4253 |
if (!pChunk) pChunk = pGroup->pList->AddSubChunk(CHUNK_ID_SCRI, chunkSize); |
if (!pChunk) pChunk = pGroup->pList->AddSubChunk(CHUNK_ID_SCRI, chunkSize); |
4298 |
return pGroup; |
return pGroup; |
4299 |
} |
} |
4300 |
|
|
4301 |
|
/** |
4302 |
|
* Make a (semi) deep copy of the Script object given by @a orig |
4303 |
|
* and assign it to this object. Note: the ScriptGroup this Script |
4304 |
|
* object belongs to remains untouched by this call. |
4305 |
|
* |
4306 |
|
* @param orig - original Script object to be copied from |
4307 |
|
*/ |
4308 |
|
void Script::CopyAssign(const Script* orig) { |
4309 |
|
Name = orig->Name; |
4310 |
|
Compression = orig->Compression; |
4311 |
|
Encoding = orig->Encoding; |
4312 |
|
Language = orig->Language; |
4313 |
|
Bypass = orig->Bypass; |
4314 |
|
data = orig->data; |
4315 |
|
} |
4316 |
|
|
4317 |
void Script::RemoveAllScriptReferences() { |
void Script::RemoveAllScriptReferences() { |
4318 |
File* pFile = pGroup->pFile; |
File* pFile = pGroup->pFile; |
4319 |
for (int i = 0; pFile->GetInstrument(i); ++i) { |
for (int i = 0; pFile->GetInstrument(i); ++i) { |
4460 |
EffectSend = 0; |
EffectSend = 0; |
4461 |
Attenuation = 0; |
Attenuation = 0; |
4462 |
FineTune = 0; |
FineTune = 0; |
4463 |
PitchbendRange = 0; |
PitchbendRange = 2; |
4464 |
PianoReleaseMode = false; |
PianoReleaseMode = false; |
4465 |
DimensionKeyRange.low = 0; |
DimensionKeyRange.low = 0; |
4466 |
DimensionKeyRange.high = 0; |
DimensionKeyRange.high = 0; |
5629 |
mGroups[pFile->GetSample(i)->GetGroup()]->AddSample(s); |
mGroups[pFile->GetSample(i)->GetGroup()]->AddSample(s); |
5630 |
mSamples[pFile->GetSample(i)] = s; |
mSamples[pFile->GetSample(i)] = s; |
5631 |
} |
} |
5632 |
|
|
5633 |
|
// clone script groups and their scripts |
5634 |
|
for (int iGroup = 0; pFile->GetScriptGroup(iGroup); ++iGroup) { |
5635 |
|
ScriptGroup* sg = pFile->GetScriptGroup(iGroup); |
5636 |
|
ScriptGroup* dg = AddScriptGroup(); |
5637 |
|
dg->Name = "COPY" + ToString(iCallCount) + "_" + sg->Name; |
5638 |
|
for (int iScript = 0; sg->GetScript(iScript); ++iScript) { |
5639 |
|
Script* ss = sg->GetScript(iScript); |
5640 |
|
Script* ds = dg->AddScript(); |
5641 |
|
ds->CopyAssign(ss); |
5642 |
|
} |
5643 |
|
} |
5644 |
|
|
5645 |
//BUG: For some reason this method only works with this additional |
//BUG: For some reason this method only works with this additional |
5646 |
// Save() call in between here. |
// Save() call in between here. |
5647 |
// |
// |