summaryrefslogtreecommitdiff
path: root/muse2/muse/wavetrack.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'muse2/muse/wavetrack.cpp')
-rw-r--r--muse2/muse/wavetrack.cpp51
1 files changed, 21 insertions, 30 deletions
diff --git a/muse2/muse/wavetrack.cpp b/muse2/muse/wavetrack.cpp
index 363f8966..f21992a6 100644
--- a/muse2/muse/wavetrack.cpp
+++ b/muse2/muse/wavetrack.cpp
@@ -60,27 +60,11 @@ void WaveTrack::internal_assign(const Track& t, int flags)
const PartList* pl = t.cparts();
for (ciPart ip = pl->begin(); ip != pl->end(); ++ip) {
Part* spart = ip->second;
- bool clone = spart->events()->arefCount() > 1;
- // This increments aref count if cloned, and chains clones.
- // It also gives the new part a new serial number.
- Part* dpart = newPart(spart, clone);
- if(!clone) {
- // Copy Events
- MusECore::EventList* se = spart->events();
- MusECore::EventList* de = dpart->events();
- for (MusECore::iEvent i = se->begin(); i != se->end(); ++i) {
- MusECore::Event oldEvent = i->second;
- MusECore::Event ev = oldEvent.clone();
- de->add(ev);
- }
- }
-
- // TODO: Should we include the parts in the undo?
- // dpart->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it
- // // so we must decrement it first :/
- // // These will not increment ref count, and will not chain clones...
- // // DELETETHIS: is the above comment still correct (by flo93)? i doubt it!
- // operations.push_back(MusECore::UndoOp(MusECore::UndoOp::AddPart,dpart));
+ Part* dpart;
+ if (spart->hasClones())
+ dpart = spart->createNewClone();
+ else
+ dpart = spart->duplicate();
parts()->add(dpart);
}
@@ -127,8 +111,7 @@ void WaveTrack::fetchData(unsigned pos, unsigned samples, float** bp, bool doSee
if (pos >= p_epos)
continue;
- EventList* events = part->events();
- for (iEvent ie = events->begin(); ie != events->end(); ++ie) {
+ for (iEvent ie = part->nonconst_events().begin(); ie != part->nonconst_events().end(); ++ie) {
Event& event = ie->second;
unsigned e_spos = event.frame() + p_spos;
unsigned nn = event.lenFrame();
@@ -201,11 +184,11 @@ void WaveTrack::read(Xml& xml)
switch (token) {
case Xml::Error:
case Xml::End:
- return;
+ goto out_of_WaveTrackRead_forloop;
case Xml::TagStart:
if (tag == "part") {
Part* p = 0;
- p = readXmlPart(xml, this);
+ p = Part::readFromXml(xml, this);
if(p)
parts()->add(p);
}
@@ -217,12 +200,14 @@ void WaveTrack::read(Xml& xml)
case Xml::TagEnd:
if (tag == "wavetrack") {
mapRackPluginsToControllers();
- return;
+ goto out_of_WaveTrackRead_forloop;
}
default:
break;
}
}
+out_of_WaveTrackRead_forloop:
+ chainTrackParts(this);
}
//---------------------------------------------------------
@@ -231,7 +216,16 @@ void WaveTrack::read(Xml& xml)
Part* WaveTrack::newPart(Part*p, bool clone)
{
- WavePart* part = clone ? new WavePart(this, p->events()) : new WavePart(this);
+ WavePart* part;
+ if (clone)
+ {
+ part = (WavePart*)p->createNewClone();
+ part->setTrack(this);
+ }
+ else
+ part = new WavePart(this);
+
+
if (p) {
part->setName(p->name());
part->setColorIndex(p->colorIndex());
@@ -240,9 +234,6 @@ Part* WaveTrack::newPart(Part*p, bool clone)
part->setMute(p->mute());
}
- if(clone)
- chainClone(p, part);
-
return part;
}