! @excsafety{Weak} -- This WaveClip remains destructible in case of AudacityException. But some cutlines may be deleted */
| 1413 | -- This WaveClip remains destructible in case of AudacityException. |
| 1414 | But some cutlines may be deleted */ |
| 1415 | void WaveClip::ClearAndAddCutLine(double t0, double t1) |
| 1416 | { |
| 1417 | StrongInvariantScope scope{ *this }; |
| 1418 | if (t0 > GetPlayEndTime() || t1 < GetPlayStartTime() || CountSamples(t0, t1) == 0) |
| 1419 | return; // no samples to remove |
| 1420 | |
| 1421 | Transaction transaction{ *this }; |
| 1422 | |
| 1423 | const double clip_t0 = std::max( t0, GetPlayStartTime() ); |
| 1424 | const double clip_t1 = std::min( t1, GetPlayEndTime() ); |
| 1425 | |
| 1426 | auto newClip = std::make_shared<WaveClip>( |
| 1427 | *this, GetFactory(), true, clip_t0, clip_t1); |
| 1428 | if(t1 < GetPlayEndTime()) |
| 1429 | { |
| 1430 | newClip->ClearSequence(t1, newClip->GetSequenceEndTime()) |
| 1431 | .Commit(); |
| 1432 | newClip->SetTrimRight(.0); |
| 1433 | } |
| 1434 | if(t0 > GetPlayStartTime()) |
| 1435 | { |
| 1436 | newClip->ClearSequence(newClip->GetSequenceStartTime(), t0) |
| 1437 | .Commit(); |
| 1438 | newClip->SetTrimLeft(.0); |
| 1439 | } |
| 1440 | |
| 1441 | newClip->SetSequenceStartTime( clip_t0 - GetSequenceStartTime() ); |
| 1442 | |
| 1443 | // Remove cutlines from this clip that were in the selection, shift |
| 1444 | // left those that were after the selection |
| 1445 | // May DELETE as we iterate, so don't use range-for |
| 1446 | for (auto it = mCutLines.begin(); it != mCutLines.end();) |
| 1447 | { |
| 1448 | WaveClip* clip = it->get(); |
| 1449 | double cutlinePosition = GetSequenceStartTime() + clip->GetSequenceStartTime(); |
| 1450 | if (cutlinePosition >= t0 && cutlinePosition <= t1) |
| 1451 | it = mCutLines.erase(it); |
| 1452 | else |
| 1453 | { |
| 1454 | if (cutlinePosition >= t1) |
| 1455 | { |
| 1456 | clip->ShiftBy(clip_t0 - clip_t1); |
| 1457 | } |
| 1458 | ++it; |
| 1459 | } |
| 1460 | } |
| 1461 | |
| 1462 | // Clear actual audio data |
| 1463 | auto s0 = TimeToSequenceSamples(t0); |
| 1464 | auto s1 = TimeToSequenceSamples(t1); |
| 1465 | |
| 1466 | // use Weak-guarantee |
| 1467 | for (auto &pSequence : mSequences) |
| 1468 | pSequence->Delete(s0, s1-s0); |
| 1469 | |
| 1470 | // Collapse envelope |
| 1471 | auto sampleTime = 1.0 / GetRate(); |
| 1472 | GetEnvelope().CollapseRegion( t0, t1, sampleTime ); |
no test coverage detected