コード例 #1
0
ファイル: part.cpp プロジェクト: faesong/oom
void chainCloneInternal(Part* p)
{
	Track* t = p->track();
	Part* p1 = 0;

	// Look for a part with the same event list, that we can chain to.
	// It's faster if track type is known...

	if (!t || (t && t->isMidiTrack()))
	{
		MidiTrack* mt = 0;
		MidiTrackList* mtl = song->midis();
		for (ciMidiTrack imt = mtl->begin(); imt != mtl->end(); ++imt)
		{
			mt = *imt;
			const PartList* pl = mt->cparts();
			for (ciPart ip = pl->begin(); ip != pl->end(); ++ip)
			{
				// Added by Tim. p3.3.6
				//printf("chainCloneInternal track %p %s part %p %s evlist %p\n", (*imt), (*imt)->name().toLatin1().constData(), ip->second, ip->second->name().toLatin1().constData(), ip->second->cevents());

				if (ip->second != p && ip->second->cevents() == p->cevents())
				{
					p1 = ip->second;
					break;
				}
			}
			// If a suitable part was found on a different track, we're done. We will chain to it.
			// Otherwise keep looking for parts on another track. If no others found, then we
			//  chain to any suitable part which was found on the same given track t.
			if (p1 && mt != t)
				break;
		}
	}
	if ((!p1 && !t) || (t && t->type() == Track::WAVE))
	{
		WaveTrack* wt = 0;
		WaveTrackList* wtl = song->waves();
		for (ciWaveTrack iwt = wtl->begin(); iwt != wtl->end(); ++iwt)
		{
			wt = *iwt;
			const PartList* pl = wt->cparts();
			for (ciPart ip = pl->begin(); ip != pl->end(); ++ip)
			{
				if (ip->second != p && ip->second->cevents() == p->cevents())
				{
					p1 = ip->second;
					break;
				}
			}
			if (p1 && wt != t)
				break;
		}
	}

	// No part found with same event list? Done.
	if (!p1)
		return;

	// Make sure the part to be chained is unchained first.
	p->prevClone()->setNextClone(p->nextClone());
	p->nextClone()->setPrevClone(p->prevClone());

	// Link the part to be chained.
	p->setPrevClone(p1);
	p->setNextClone(p1->nextClone());

	// Re-link the existing part.
	p1->nextClone()->setPrevClone(p);
	p1->setNextClone(p);
}