From d51caef570ef25b97b9b4687bd870a5afcc623ec Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Sat, 10 Aug 2013 17:22:43 +0200 Subject: cleanup --- muse2/muse/audio.cpp | 7 ------- 1 file changed, 7 deletions(-) (limited to 'muse2/muse/audio.cpp') diff --git a/muse2/muse/audio.cpp b/muse2/muse/audio.cpp index 0c507fa2..659ae8a9 100644 --- a/muse2/muse/audio.cpp +++ b/muse2/muse/audio.cpp @@ -762,13 +762,6 @@ void Audio::processMsg(AudioMsg* msg) frameOffset = syncFrame - samplePos; } break; - // DELETETHIS 6 - //case SEQM_ADD_TRACK: - //case SEQM_REMOVE_TRACK: - //case SEQM_CHANGE_TRACK: - //case SEQM_ADD_PART: - //case SEQM_REMOVE_PART: - //case SEQM_CHANGE_PART: case SEQM_SET_TRACK_OUT_CHAN: case SEQM_SET_TRACK_OUT_PORT: case SEQM_REMAP_PORT_DRUM_CTL_EVS: -- cgit v1.2.3 From cf5765018e4b742bbf490cf9fd57757bfb921f83 Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Sat, 10 Aug 2013 17:22:58 +0200 Subject: removed ModifyPart/changePart. Replaced with ModifyPartLength etc. --- muse2/muse/arranger/pcanvas.cpp | 182 +++++++++++++++++++--------------------- muse2/muse/audio.cpp | 4 +- muse2/muse/audio.h | 6 +- muse2/muse/functions.cpp | 28 ++----- muse2/muse/midiseq.cpp | 3 - muse2/muse/part.cpp | 62 ++++---------- muse2/muse/seqmsg.cpp | 15 ---- muse2/muse/song.cpp | 69 +++------------ muse2/muse/song.h | 2 - muse2/muse/structure.cpp | 63 ++++++-------- muse2/muse/undo.cpp | 125 ++++++++++++++------------- muse2/muse/undo.h | 23 +++-- 12 files changed, 229 insertions(+), 353 deletions(-) (limited to 'muse2/muse/audio.cpp') diff --git a/muse2/muse/arranger/pcanvas.cpp b/muse2/muse/arranger/pcanvas.cpp index 646a9382..0e1e04a8 100644 --- a/muse2/muse/arranger/pcanvas.cpp +++ b/muse2/muse/arranger/pcanvas.cpp @@ -64,6 +64,10 @@ #include "utils.h" #include "dialogs.h" #include "widgets/pastedialog.h" +#include "undo.h" + +using MusECore::Undo; +using MusECore::UndoOp; #define ABS(x) (abs(x)) @@ -189,12 +193,12 @@ void PartCanvas::returnPressed() if (editMode) { //this check is neccessary, because it returnPressed may be called //twice. the second call would cause a crash, however! - MusECore::Part* oldPart = editPart->part(); - MusECore::Part* newPart = oldPart->clone(); - - newPart->setName(lineEditor->text()); + MusECore::Part* part = editPart->part(); // Indicate do undo, and do port controller values but not clone parts. - MusEGlobal::audio->msgChangePart(oldPart, newPart, true, true, false); + + Undo operations; + operations.push_back(UndoOp(UndoOp::ModifyPartName,part, part->name().toUtf8().data(), lineEditor->text().toUtf8().data())); // FIXME char sucks, better use QString directly. + MusEGlobal::song->applyOperationGroup(operations); editMode = false; @@ -314,7 +318,7 @@ void PartCanvas::moveCanvasItems(CItemList& items, int dp, int dx, DragType dtyp bool result=moveItem(operations, ci, newpos, dtype); if (result) - ci->move(newpos); + ci->move(newpos); if(moving.size() == 1) { itemReleased(curItem, newpos); @@ -333,102 +337,89 @@ void PartCanvas::moveCanvasItems(CItemList& items, int dp, int dx, DragType dtyp //--------------------------------------------------------- bool PartCanvas::moveItem(MusECore::Undo& operations, CItem* item, const QPoint& newpos, DragType t) - { - NPart* npart = (NPart*) item; - MusECore::Part* spart = npart->part(); - MusECore::Track* track = npart->track(); - MusECore::Track* dtrack=NULL; - unsigned dtick = newpos.x(); - unsigned ntrack = y2pitch(item->mp().y()); - MusECore::Track::TrackType type = track->type(); - if (tracks->index(track) == ntrack && (dtick == spart->tick())) { - return false; - } - if (ntrack >= tracks->size()) { - ntrack = tracks->size(); - if (MusEGlobal::debugMsg) - printf("PartCanvas::moveItem - add new track\n"); - dtrack = MusEGlobal::song->addTrack(operations, type); // Add at end of list. - - if (type == MusECore::Track::WAVE) { - MusECore::WaveTrack* st = (MusECore::WaveTrack*) track; - MusECore::WaveTrack* dt = (MusECore::WaveTrack*) dtrack; - dt->setChannels(st->channels()); - } - emit tracklistChanged(); - } - else - { - dtrack = tracks->index(ntrack); - if (dtrack->type() != type) { - QMessageBox::critical(this, QString("MusE"), - tr("Cannot copy/move/clone to different Track-Type")); - return false; - } - } - - MusECore::Part* dpart; - bool clone = (t == MOVE_CLONE || (t == MOVE_COPY && spart->events()->arefCount() > 1)); - - if(t == MOVE_MOVE) - { - // This doesn't increment aref count, and doesn't chain clones. - // It also gives the new part a new serial number, but it is - // overwritten with the old one by Song::changePart(), from Audio::msgChangePart() below. - dpart = spart->clone(); - dpart->setTrack(dtrack); - } - else +{ + NPart* npart = (NPart*) item; + MusECore::Part* spart = npart->part(); + MusECore::Track* track = npart->track(); + MusECore::Track* dtrack=NULL; + unsigned dtick = newpos.x(); // FIXME TODO make subtick-compatible! + unsigned ntrack = y2pitch(item->mp().y()); + MusECore::Track::TrackType type = track->type(); + int new_partend; + if (tracks->index(track) == ntrack && (dtick == spart->tick())) { + return false; + } + if (ntrack >= tracks->size()) { + ntrack = tracks->size(); + if (MusEGlobal::debugMsg) + printf("PartCanvas::moveItem - add new track\n"); + dtrack = MusEGlobal::song->addTrack(operations, type); // Add at end of list. + + if (type == MusECore::Track::WAVE) { + MusECore::WaveTrack* st = (MusECore::WaveTrack*) track; + MusECore::WaveTrack* dt = (MusECore::WaveTrack*) dtrack; + dt->setChannels(st->channels()); + } + emit tracklistChanged(); + } + else + { + dtrack = tracks->index(ntrack); + if (dtrack->type() != type) { + QMessageBox::critical(this, QString("MusE"), + tr("Cannot copy/move/clone to different Track-Type")); + return false; + } + } + + + + if(t == MOVE_MOVE) + { + operations.push_back(MusECore::UndoOp(MusECore::UndoOp::ModifyPartTick,spart,spart->tick(),dtick)); + + new_partend=(spart->lenTick() + dtick); + } + else + { + MusECore::Part* dpart; + bool clone = (t == MOVE_CLONE || (t == MOVE_COPY && spart->events()->arefCount() > 1)); + // This increments aref count if cloned, and chains clones. // It also gives the new part a new serial number. dpart = dtrack->newPart(spart, clone); - - dpart->setTick(dtick); - - if(t == MOVE_MOVE) - item->setPart(dpart); - if (t == MOVE_COPY && !clone) { + + dpart->setTick(dtick); + if (t == MOVE_COPY && !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); - } + MusECore::Event oldEvent = i->second; + MusECore::Event ev = oldEvent.clone(); + de->add(ev); } - - - if (t == MOVE_COPY || t == MOVE_CLONE) { - 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... - // TODO DELETETHIS: is the above comment still correct (by flo93)? i doubt it! - operations.push_back(MusECore::UndoOp(MusECore::UndoOp::AddPart,dpart)); - } - else if (t == MOVE_MOVE) { - // In all cases found ev lists were same. So this is redundant - Redo incs then decs the same list. - // But just in case we ever have two different lists... - dpart->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it - // so we must decrement it first :/ - spart->events()->incARef(1); // the later MusEGlobal::song->applyOperationGroup() will decrement it - // so we must increment it first :/ - dpart->setSelected(spart->selected()); - // These will increment ref count if not a clone, and will chain clones... - // TODO DELETETHIS: is the above comment still correct (by flo93)? i doubt it! - operations.push_back(MusECore::UndoOp(MusECore::UndoOp::ModifyPart,spart, dpart, true, false)); - - spart->setSelected(false); - } - // else // will never happen -> operations will never be empty - - if (MusEGlobal::song->len() < (dpart->lenTick() + dpart->tick())) + } + + 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... + // TODO DELETETHIS: is the above comment still correct (by flo93)? i doubt it! + operations.push_back(MusECore::UndoOp(MusECore::UndoOp::AddPart,dpart)); + + new_partend=(dpart->lenTick() + dpart->tick()); + + } + + if (MusEGlobal::song->len() < new_partend) // FIXME this is buggy anyway. operations.push_back( MusECore::UndoOp(MusECore::UndoOp::ModifySongLen, - dpart->lenTick() + dpart->tick(), + new_partend, MusEGlobal::song->len() ) ); - - return true; - } + + + + return true; +} //--------------------------------------------------------- // raster @@ -866,9 +857,10 @@ void PartCanvas::itemPopup(CItem* item, int n, const QPoint& pt) MusECore::Event ev = oldEvent.clone(); de->add(ev); } - // Indicate undo, and do port controller values but not clone parts. - // changed by flo93: removed start and endUndo, instead changed first bool to true - MusEGlobal::audio->msgChangePart(spart, dpart, true, true, false); + Undo operations; + operations.push_back(UndoOp(UndoOp::DeletePart, spart)); + operations.push_back(UndoOp(UndoOp::AddPart, dpart)); + MusEGlobal::song->applyOperationGroup(operations); break; } case 16: // Export to file diff --git a/muse2/muse/audio.cpp b/muse2/muse/audio.cpp index 659ae8a9..bbc803c5 100644 --- a/muse2/muse/audio.cpp +++ b/muse2/muse/audio.cpp @@ -76,9 +76,9 @@ void initAudio() extern double curTime(); const char* seqMsgList[] = { - "SEQM_ADD_TRACK", "SEQM_REMOVE_TRACK", //"SEQM_CHANGE_TRACK", DELETETHIS + "SEQM_ADD_TRACK", "SEQM_REMOVE_TRACK", "SEQM_MOVE_TRACK", - "SEQM_ADD_PART", "SEQM_REMOVE_PART", "SEQM_CHANGE_PART", + "SEQM_ADD_PART", "SEQM_REMOVE_PART", "SEQM_ADD_EVENT", "SEQM_REMOVE_EVENT", "SEQM_CHANGE_EVENT", "SEQM_ADD_TEMPO", "SEQM_SET_TEMPO", "SEQM_REMOVE_TEMPO", "SEQM_ADD_SIG", "SEQM_REMOVE_SIG", "SEQM_SET_GLOBAL_TEMPO", diff --git a/muse2/muse/audio.h b/muse2/muse/audio.h index a403e5bf..e8d22f78 100644 --- a/muse2/muse/audio.h +++ b/muse2/muse/audio.h @@ -60,9 +60,9 @@ class Track; //--------------------------------------------------------- enum { - SEQM_ADD_TRACK, SEQM_REMOVE_TRACK, //SEQM_CHANGE_TRACK, DELETETHIS + SEQM_ADD_TRACK, SEQM_REMOVE_TRACK, SEQM_MOVE_TRACK, - SEQM_ADD_PART, SEQM_REMOVE_PART, SEQM_CHANGE_PART, + SEQM_ADD_PART, SEQM_REMOVE_PART, SEQM_ADD_EVENT, SEQM_REMOVE_EVENT, SEQM_CHANGE_EVENT, SEQM_ADD_TEMPO, SEQM_SET_TEMPO, SEQM_REMOVE_TEMPO, SEQM_ADD_SIG, SEQM_REMOVE_SIG, SEQM_ADD_KEY, SEQM_REMOVE_KEY, @@ -234,11 +234,9 @@ class Audio { void msgRemoveTrack(Track*, bool u = true); void msgRemoveTracks(); - //void msgChangeTrack(Track* oldTrack, Track* newTrack, bool u = true); DELETETHIS void msgMoveTrack(int idx1, int dx2, bool u = true); void msgAddPart(Part*, bool u = true); void msgRemovePart(Part*, bool u = true); - void msgChangePart(Part* oldPart, Part* newPart, bool u = true, bool doCtrls = true, bool doClones = false); void msgAddEvent(Event&, Part*, bool u = true, bool doCtrls = true, bool doClones = false); void msgDeleteEvent(Event&, Part*, bool u = true, bool doCtrls = true, bool doClones = false); void msgChangeEvent(Event&, Event&, Part*, bool u = true, bool doCtrls = true, bool doClones = false); diff --git a/muse2/muse/functions.cpp b/muse2/muse/functions.cpp index fa53f5d4..449461c5 100644 --- a/muse2/muse/functions.cpp +++ b/muse2/muse/functions.cpp @@ -2,7 +2,7 @@ // MusE // Linux Music Editor // $Id: functions.cpp,v 1.20.2.19 2011/05/05 20:10 flo93 Exp $ -// (C) Copyright 2011 Florian Jung (flo93@sourceforge.net) +// (C) Copyright 2011,2013 Florian Jung (flo93@sourceforge.net) // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -1310,11 +1310,7 @@ void shrink_parts(int raster) if (lensecond->lenTick()) - { - MidiPart* new_part = new MidiPart(*(MidiPart*)part->second); - new_part->setLenTick(len); - operations.push_back(UndoOp(UndoOp::ModifyPart, part->second, new_part, true, false)); - } + operations.push_back(UndoOp(UndoOp::ModifyPartLength, part->second, part->second->lenTick(), len, true, false)); } MusEGlobal::song->applyOperationGroup(operations); @@ -1326,8 +1322,8 @@ void schedule_resize_all_same_len_clone_parts(Part* part, unsigned new_len, Undo QSet already_done; for (Undo::iterator op_it=operations.begin(); op_it!=operations.end();op_it++) - if (op_it->type==UndoOp::ModifyPart || op_it->type==UndoOp::DeletePart) - already_done.insert(op_it->nPart); + if (op_it->type==UndoOp::DeletePart) + already_done.insert(op_it->part); unsigned old_len= part->type() == Pos::FRAMES ? part->lenFrame() : part->lenTick(); if (old_len!=new_len) @@ -1338,18 +1334,12 @@ void schedule_resize_all_same_len_clone_parts(Part* part, unsigned new_len, Undo if (part->type() == Pos::FRAMES) { if (part_it->lenFrame()==old_len && !already_done.contains(part_it)) - { - WavePart* new_part = new WavePart(*(WavePart*)part_it); - new_part->setLenFrame(new_len); - operations.push_back(UndoOp(UndoOp::ModifyPart, part_it, new_part, true, false)); - } + operations.push_back(UndoOp(UndoOp::ModifyPartLengthFrames, part_it, part_it->lenFrame(), new_len, true, false)); // FIXME FINDMICH frames suck :( } else if (part_it->lenTick()==old_len && !already_done.contains(part_it)) { - MidiPart* new_part = new MidiPart(*(MidiPart*)part_it); - new_part->setLenTick(new_len); - operations.push_back(UndoOp(UndoOp::ModifyPart, part_it, new_part, true, false)); + operations.push_back(UndoOp(UndoOp::ModifyPartLength, part_it, part_it->lenTick(), new_len, true, false)); } part_it=part_it->nextClone(); @@ -1381,11 +1371,7 @@ void expand_parts(int raster) if (len part->second->lenTick()) - { - MidiPart* new_part = new MidiPart(*(MidiPart*)part->second); - new_part->setLenTick(len); - operations.push_back(UndoOp(UndoOp::ModifyPart, part->second, new_part, true, false)); - } + operations.push_back(UndoOp(UndoOp::ModifyPartLength, part->second, part->second->lenTick(), len, true, false)); } MusEGlobal::song->applyOperationGroup(operations); diff --git a/muse2/muse/midiseq.cpp b/muse2/muse/midiseq.cpp index b94e284e..8aa6c289 100644 --- a/muse2/muse/midiseq.cpp +++ b/muse2/muse/midiseq.cpp @@ -119,9 +119,6 @@ void MidiSeq::processMsg(const ThreadMsg* m) case MusECore::SEQM_REMOVE_PART: MusEGlobal::song->cmdRemovePart((Part*)msg->p1); break; - case MusECore::SEQM_CHANGE_PART: - MusEGlobal::song->cmdChangePart((Part*)msg->p1, (Part*)msg->p2, msg->a, msg->b); - break; case MusECore::SEQM_SET_TRACK_OUT_CHAN: diff --git a/muse2/muse/part.cpp b/muse2/muse/part.cpp index c530b1f3..10c7f201 100644 --- a/muse2/muse/part.cpp +++ b/muse2/muse/part.cpp @@ -372,8 +372,6 @@ void addPortCtrlEvents(Event& event, Part* part, bool doClones) { // Traverse and process the clone chain ring until we arrive at the same part again. // The loop is a safety net. - // Update: Due to the varying calls, and order of, incARefcount, (msg)ChangePart, replaceClone, and remove/addPortCtrlEvents, - // we can not rely on the reference count as a safety net in these routines. We will just have to trust the clone chain. Part* p = part; while(1) { @@ -434,8 +432,6 @@ void addPortCtrlEvents(Part* part, bool doClones) { // Traverse and process the clone chain ring until we arrive at the same part again. // The loop is a safety net. - // Update: Due to the varying calls, and order of, incARefcount, (msg)ChangePart, replaceClone, and remove/addPortCtrlEvents, - // we can not rely on the reference count as a safety net in these routines. We will just have to trust the clone chain. Part* p = part; while(1) { @@ -499,8 +495,6 @@ void removePortCtrlEvents(Event& event, Part* part, bool doClones) { // Traverse and process the clone chain ring until we arrive at the same part again. // The loop is a safety net. - // Update: Due to the varying calls, and order of, incARefcount, (msg)ChangePart, replaceClone, and remove/addPortCtrlEvents, - // we can not rely on the reference count as a safety net in these routines. We will just have to trust the clone chain. Part* p = part; while(1) { @@ -555,8 +549,6 @@ void removePortCtrlEvents(Part* part, bool doClones) { // Traverse and process the clone chain ring until we arrive at the same part again. // The loop is a safety net. - // Update: Due to the varying calls, and order of, incARefcount, (msg)ChangePart, replaceClone, and remove/addPortCtrlEvents, - // we can not rely on the reference count as a safety net in these routines. We will just have to trust the clone chain. Part* p = part; while(1) { @@ -850,6 +842,10 @@ void Song::cmdResizePart(Track* track, Part* oPart, unsigned int len, bool doClo EventList* el = nPart->events(); unsigned new_partlength = MusEGlobal::tempomap.deltaTick2frame(oPart->tick(), oPart->tick() + len); + // TODO FINDMICH FIXME this is totally broken. we don't want to remove events just because they're beyond end-of-part. + // we also don't want to auto-resize the last event. + + /* // If new nr of frames is less than previous what can happen is: // - 0 or more events are beginning after the new final position. Those are removed from the part // - The last event begins before new final position and ends after it. If so, it will be resized to end at new part length @@ -865,7 +861,7 @@ void Song::cmdResizePart(Track* track, Part* oPart, unsigned int len, bool doClo } nPart->setLenFrame(new_partlength); // Do not do port controller values and clone parts. - operations.push_back(UndoOp(UndoOp::ModifyPart, oPart, nPart, false, false)); + operations.push_back(UndoOp(UndoOp::Modify***Part, oPart, nPart, false, false)); MusEGlobal::song->applyOperationGroup(operations); } @@ -890,9 +886,9 @@ void Song::cmdResizePart(Track* track, Part* oPart, unsigned int len, bool doClo nPart->setLenFrame(new_partlength); // Do not do port controller values and clone parts. - operations.push_back(UndoOp(UndoOp::ModifyPart, oPart, nPart, false, false)); + operations.push_back(UndoOp(UndoOp::Modify***Part, oPart, nPart, false, false)); MusEGlobal::song->applyOperationGroup(operations); - } + } */ } break; case Track::MIDI: @@ -907,10 +903,8 @@ void Song::cmdResizePart(Track* track, Part* oPart, unsigned int len, bool doClo { if (part_it->lenTick()==orig_len) { - MidiPart* newPart = new MidiPart(*part_it); - newPart->setLenTick(len); // Do port controller values but not clone parts. - operations.push_back(UndoOp(UndoOp::ModifyPart, part_it, newPart, true, false)); + operations.push_back(UndoOp(UndoOp::ModifyPartLength, part_it, part_it->lenTick(), len, true, false)); } part_it=(MidiPart*)part_it->nextClone(); @@ -1032,45 +1026,23 @@ void Song::cmdSplitPart(Track* track, Part* part, int tick) Part* p2; track->splitPart(part, tick, p1, p2); - //MusEGlobal::song->informAboutNewParts(part, p1); // is unneccessary because of ChangePart below + MusEGlobal::song->informAboutNewParts(part, p1); MusEGlobal::song->informAboutNewParts(part, p2); - startUndo(); - // Indicate no undo, and do port controller values but not clone parts. - MusEGlobal::audio->msgChangePart(part, p1, false, true, false); - MusEGlobal::audio->msgAddPart(p2, false); - endUndo(SC_TRACK_MODIFIED | SC_PART_MODIFIED | SC_PART_INSERTED); + Undo operations; + operations.push_back(UndoOp(UndoOp::DeletePart, part)); + operations.push_back(UndoOp(UndoOp::AddPart, p1)); + operations.push_back(UndoOp(UndoOp::AddPart, p2)); + applyOperationGroup(operations); } -//--------------------------------------------------------- -// changePart -//--------------------------------------------------------- - -void Song::changePart(Part* oPart, Part* nPart) - { - nPart->setSn(oPart->sn()); - - Track* oTrack = oPart->track(); - Track* nTrack = nPart->track(); - - oTrack->parts()->remove(oPart); - nTrack->parts()->add(nPart); - - - // Added by T356. - // adjust song len: - unsigned epos = nPart->tick() + nPart->lenTick(); - if (epos > len()) - _len = epos; - - } //--------------------------------------------------------- // cmdGluePart //--------------------------------------------------------- void Song::cmdGluePart(Track* track, Part* oPart) - { + { /* disabled for now, to be deleted // p3.3.54 if(track->type() != Track::WAVE && !track->isMidiTrack()) return; @@ -1126,8 +1098,8 @@ void Song::cmdGluePart(Track* track, Part* oPart) startUndo(); MusEGlobal::audio->msgRemovePart(nextPart, false); // Indicate no undo, and do port controller values but not clone parts. - MusEGlobal::audio->msgChangePart(oPart, nPart, false, true, false); - endUndo(SC_PART_MODIFIED | SC_PART_REMOVED); + MusEGlobal::audio->msgChange***Part(oPart, nPart, false, true, false); + endUndo(SC_PART_MODIFIED | SC_PART_REMOVED); */ } //--------------------------------------------------------- diff --git a/muse2/muse/seqmsg.cpp b/muse2/muse/seqmsg.cpp index fcffc332..61714b98 100644 --- a/muse2/muse/seqmsg.cpp +++ b/muse2/muse/seqmsg.cpp @@ -922,21 +922,6 @@ bool Song::msgRemoveParts() return partSelected; } -//--------------------------------------------------------- -// msgChangePart -//--------------------------------------------------------- - -void Audio::msgChangePart(Part* oldPart, Part* newPart, bool doUndoFlag, bool doCtrls, bool doClones) - { - AudioMsg msg; - msg.id = SEQM_CHANGE_PART; - msg.p1 = oldPart; - msg.p2 = newPart; - msg.a = doCtrls; - msg.b = doClones; - sendMessage(&msg, doUndoFlag); - } - //--------------------------------------------------------- // msgAddEvent //--------------------------------------------------------- diff --git a/muse2/muse/song.cpp b/muse2/muse/song.cpp index 8a7bf39f..d457cb1d 100644 --- a/muse2/muse/song.cpp +++ b/muse2/muse/song.cpp @@ -886,42 +886,23 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start // Round the end up (again) using the Arranger part snap raster value. endTick = AL::sigmap.raster2(endTick, arrangerRaster()); - - removePortCtrlEvents(part, false); // Remove all of the part's port controller values. Don't do clone parts. - - // Clone the part. This doesn't increment aref count, and doesn't chain clones. - // It also gives the new part a new serial number, but it is - // overwritten with the old one by Song::changePart(), below. - Part* newPart = part->clone(); - - newPart->setLenTick(endTick); // Set the new part's length. - changePart(part, newPart); // Change the part. - - part->events()->incARef(-1); // Manually adjust reference counts. HACK! - newPart->events()->incARef(1); - - replaceClone(part, newPart); // Replace the part in the clone chain with the new part. - - // Now add all of the new part's port controller values. Indicate do not do clone parts. - addPortCtrlEvents(newPart, false); - // Create an undo op. Indicate do port controller values but not clone parts. - addUndo(UndoOp(UndoOp::ModifyPart, part, newPart, true, false)); + addUndo(UndoOp(UndoOp::ModifyPartLength, part, part->lenTick(), endTick, true, false)); // FIXME XTICKS! FINDMICHJETZT! updateFlags |= SC_PART_MODIFIED; if (_recMode == REC_REPLACE) { - iEvent si = newPart->events()->lower_bound(startTick - newPart->tick()); - iEvent ei = newPart->events()->lower_bound(newPart->endTick() - newPart->tick()); + iEvent si = part->events()->lower_bound(startTick - part->tick()); + iEvent ei = part->events()->lower_bound(part->endTick() - part->tick()); for (iEvent i = si; i != ei; ++i) { Event event = i->second; // Indicate do port controller values and clone parts. - addUndo(UndoOp(UndoOp::DeleteEvent, event, newPart, true, true)); + addUndo(UndoOp(UndoOp::DeleteEvent, event, part, true, true)); // Remove the event from the new part's port controller values, and do all clone parts. - removePortCtrlEvents(event, newPart, true); + removePortCtrlEvents(event, part, true); } - newPart->events()->erase(si, ei); + part->events()->erase(si, ei); } for (iEvent i = s; i != e; ++i) { @@ -929,13 +910,13 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start event.setTick(event.tick() - partTick); Event e; // Create an undo op. Indicate do port controller values and clone parts. - addUndo(UndoOp(UndoOp::AddEvent, e, event, newPart, true, true)); + addUndo(UndoOp(UndoOp::AddEvent, e, event, part, true, true)); - if(newPart->events()->find(event) == newPart->events()->end()) - newPart->events()->add(event); + if(part->events()->find(event) == part->events()->end()) + part->events()->add(event); // Add the event to the new part's port controller values, and do all clone parts. - addPortCtrlEvents(event, newPart, true); + addPortCtrlEvents(event, part, true); } } else { @@ -1886,7 +1867,6 @@ void Song::processMsg(AudioMsg* msg) updateFlags = SC_EVENT_MODIFIED; break; - // Moved here from MidiSeq::processMsg p4.0.34 case SEQM_ADD_TRACK: insertTrack2(msg->track, msg->ival); break; @@ -1899,9 +1879,6 @@ void Song::processMsg(AudioMsg* msg) case SEQM_REMOVE_PART: cmdRemovePart((Part*)msg->p1); break; - case SEQM_CHANGE_PART: - cmdChangePart((Part*)msg->p1, (Part*)msg->p2, msg->a, msg->b); - break; case SEQM_ADD_TEMPO: addUndo(UndoOp(UndoOp::AddTempo, msg->a, msg->b)); @@ -1979,32 +1956,6 @@ void Song::cmdRemovePart(Part* part) updateFlags = SC_PART_REMOVED; } -//--------------------------------------------------------- -// cmdChangePart -//--------------------------------------------------------- - -void Song::cmdChangePart(Part* oldPart, Part* newPart, bool doCtrls, bool doClones) - { - if(doCtrls) - removePortCtrlEvents(oldPart, doClones); - - changePart(oldPart, newPart); - - addUndo(UndoOp(UndoOp::ModifyPart, oldPart, newPart, doCtrls, doClones)); - - // Changed by T356. Do not decrement ref count if the new part is a clone of the old part, since the event list - // will still be active. - if(oldPart->cevents() != newPart->cevents()) - oldPart->events()->incARef(-1); - - replaceClone(oldPart, newPart); - - if(doCtrls) - addPortCtrlEvents(newPart, doClones); - - updateFlags = SC_PART_MODIFIED; - } - //--------------------------------------------------------- // panic //--------------------------------------------------------- diff --git a/muse2/muse/song.h b/muse2/muse/song.h index f6b1403d..909e54fc 100644 --- a/muse2/muse/song.h +++ b/muse2/muse/song.h @@ -298,12 +298,10 @@ class Song : public QObject { void addPart(Part* part); void removePart(Part* part); - void changePart(Part*, Part*); PartList* getSelectedMidiParts() const; PartList* getSelectedWaveParts() const; bool msgRemoveParts(); - void cmdChangePart(Part* oldPart, Part* newPart, bool doCtrls, bool doClones); void cmdRemovePart(Part* part); void cmdAddPart(Part* part); int arrangerRaster() { return _arrangerRaster; } // Used by Song::cmdAddRecordedWave to snap new wave parts diff --git a/muse2/muse/structure.cpp b/muse2/muse/structure.cpp index 65489cac..ad22b8d3 100644 --- a/muse2/muse/structure.cpp +++ b/muse2/muse/structure.cpp @@ -5,6 +5,7 @@ // // (C) Copyright 1999-2004 Werner Schweer (ws@seh.de) // (C) Copyright 2011 Robert Jonsson (rj@spamatica.se) +// (C) Copyright 2013 Florian Jung (flo93@sourceforge.net) // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -161,19 +162,15 @@ void globalCut(bool onlySelectedTracks) else if ((t < lpos) && ((t+l) > lpos) && ((t+l) <= rpos)) { // remove part tail int len = lpos - t; - Part *nPart; - if (track->isMidiTrack()) - nPart = new MidiPart(*(MidiPart*)part); - else - nPart = new WavePart(*(WavePart*)part); - - nPart->setLenTick(len); - // cut Events in nPart - EventList* el = nPart->events(); - for (iEvent ie = el->lower_bound(len); ie != el->end(); ++ie) - operations.push_back(UndoOp(UndoOp::DeleteEvent,ie->second, nPart, false, false)); - - operations.push_back(UndoOp(UndoOp::ModifyPart,part, nPart, true, true)); + + if (part->nextClone()==part) // no clones + { + // cut Events + EventList* el = part->events(); + for (iEvent ie = el->lower_bound(len); ie != el->end(); ++ie) + operations.push_back(UndoOp(UndoOp::DeleteEvent,ie->second, part, false, false)); + } + operations.push_back(UndoOp(UndoOp::ModifyPartLength, part, part->lenTick(), len, true, true)); } else if ((t < lpos) && ((t+l) > lpos) && ((t+l) > rpos)) { //---------------------- @@ -190,8 +187,9 @@ void globalCut(bool onlySelectedTracks) p1->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it so we must decrement it first :/ p3->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it so we must decrement it first :/ - // Indicate no undo, and do port controller values and clone parts. - operations.push_back(UndoOp(UndoOp::ModifyPart,part, p1, true, true)); + MusEGlobal::song->informAboutNewParts(part,p1,p3); + operations.push_back(UndoOp(UndoOp::DeletePart,part)); + operations.push_back(UndoOp(UndoOp::AddPart,p1)); operations.push_back(UndoOp(UndoOp::AddPart,p3)); } else if ((t >= lpos) && (t < rpos) && (t+l) > rpos) { @@ -203,19 +201,15 @@ void globalCut(bool onlySelectedTracks) delete p1; p2->setTick(lpos); p2->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it so we must decrement it first :/ - operations.push_back(UndoOp(UndoOp::ModifyPart,part, p2, true, true)); + + MusEGlobal::song->informAboutNewParts(part,p2); + operations.push_back(UndoOp(UndoOp::DeletePart,part)); + operations.push_back(UndoOp(UndoOp::AddPart,p2)); } else if (t >= rpos) { // move part to the left - Part *nPart; - if (track->isMidiTrack()) - nPart = new MidiPart(*(MidiPart*)part); - else - nPart = new WavePart(*(WavePart*)part); int nt = part->tick(); - nPart->setTick(nt - (rpos -lpos)); - // Indicate no undo, and do port controller values but not clone parts. - operations.push_back(UndoOp(UndoOp::ModifyPart,part, nPart, true, false)); + operations.push_back(UndoOp(UndoOp::ModifyPartTick,part,part->tick(), nt - (rpos -lpos) )); } } } @@ -268,17 +262,13 @@ Undo movePartsTotheRight(unsigned int startTicks, int moveTicks, bool only_selec p2->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it so we must decrement it first :/ p1->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it so we must decrement it first :/ - operations.push_back(UndoOp(UndoOp::ModifyPart, part, p1, true, true)); + MusEGlobal::song->informAboutNewParts(part,p1,p2); + operations.push_back(UndoOp(UndoOp::DeletePart, part)); + operations.push_back(UndoOp(UndoOp::AddPart, p1)); operations.push_back(UndoOp(UndoOp::AddPart, p2)); } else if (t >= startTicks) { - Part *nPart; - if (track->isMidiTrack()) - nPart = new MidiPart(*(MidiPart*)part); - else - nPart = new WavePart(*(WavePart*)part); - nPart->setTick(t + moveTicks); - operations.push_back(UndoOp(UndoOp::ModifyPart, part, nPart, true, false)); + operations.push_back(UndoOp(UndoOp::ModifyPartTick, part, part->tick(), t + moveTicks)); } } } @@ -323,19 +313,20 @@ Undo partSplitter(unsigned int pos, bool onlySelectedTracks) p1->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it p2->events()->incARef(-1); // so we must decrement it first :/ - //MusEGlobal::song->informAboutNewParts(part, p1); // is unneccessary because of ModifyPart + MusEGlobal::song->informAboutNewParts(part, p1); MusEGlobal::song->informAboutNewParts(part, p2); - operations.push_back(UndoOp(UndoOp::ModifyPart,part, p1, true, false)); + operations.push_back(UndoOp(UndoOp::DeletePart,part)); + operations.push_back(UndoOp(UndoOp::AddPart,p1)); operations.push_back(UndoOp(UndoOp::AddPart,p2)); if (MusEGlobal::debugMsg) { printf("in partSplitter: part1 %d\n",p1->events()->refCount()); printf("in partSplitter: part2 %d\n",p2->events()->refCount()); - } - break; } + break; } } + } return operations; } diff --git a/muse2/muse/undo.cpp b/muse2/muse/undo.cpp index fc6fc1d8..924ba745 100644 --- a/muse2/muse/undo.cpp +++ b/muse2/muse/undo.cpp @@ -50,7 +50,7 @@ const char* UndoOp::typeName() { static const char* name[] = { "AddTrack", "DeleteTrack", - "AddPart", "DeletePart", "ModifyPart", + "AddPart", "DeletePart", "ModifyPartTick", "ModifyPartLength", "ModifyPartLengthFrames", "ModifyPartName", "AddEvent", "DeleteEvent", "ModifyEvent", "AddTempo", "DeleteTempo", "AddSig", "DeleteSig", @@ -77,7 +77,10 @@ void UndoOp::dump() break; case AddPart: case DeletePart: - case ModifyPart: + case ModifyPartTick: + case ModifyPartLength: + case ModifyPartLengthFrames: + case ModifyPartName: break; case AddEvent: case DeleteEvent: @@ -136,11 +139,7 @@ void UndoList::clearDelete() break; case UndoOp::DeletePart: - delete i->oPart; - break; - - case UndoOp::ModifyPart: - delete i->oPart; + delete i->part; break; case UndoOp::ModifyMarker: @@ -176,12 +175,9 @@ void UndoList::clearDelete() break; case UndoOp::AddPart: - delete i->oPart; + delete i->part; break; - case UndoOp::ModifyPart: - delete i->nPart; - break; case UndoOp::ModifyMarker: if (i->realMarker) delete i->realMarker; @@ -295,12 +291,12 @@ void cleanOperationGroup(Undo& group) else processed_tracks.insert(op->track); } - else if ((op->type==UndoOp::ModifyPart) || (op->type==UndoOp::DeletePart)) + else if (op->type==UndoOp::DeletePart) { - if (processed_parts.find(op->oPart)!=processed_parts.end()) + if (processed_parts.find(op->part)!=processed_parts.end()) group.erase(op); else - processed_parts.insert(op->oPart); + processed_parts.insert(op->part); } op=op_; @@ -370,28 +366,33 @@ void Song::doUndo2() break; case UndoOp::AddPart: { - Part* part = i->oPart; + Part* part = i->part; removePart(part); updateFlags |= SC_PART_REMOVED; - i->oPart->events()->incARef(-1); - unchainClone(i->oPart); + i->part->events()->incARef(-1); + unchainClone(i->part); } break; case UndoOp::DeletePart: - addPart(i->oPart); + addPart(i->part); updateFlags |= SC_PART_INSERTED; - i->oPart->events()->incARef(1); - chainClone(i->oPart); + i->part->events()->incARef(1); + chainClone(i->part); break; - case UndoOp::ModifyPart: - if(i->doCtrls) - removePortCtrlEvents(i->nPart, i->doClones); - changePart(i->nPart, i->oPart); - i->nPart->events()->incARef(-1); - i->oPart->events()->incARef(1); - replaceClone(i->nPart, i->oPart); - if(i->doCtrls) - addPortCtrlEvents(i->oPart, i->doClones); + case UndoOp::ModifyPartName: + i->part->setName(i->_oldName); + updateFlags |= SC_PART_MODIFIED; + break; + case UndoOp::ModifyPartTick: // TODO FIXME (?) do port ctrls/clones? + i->part->setTick(i->old_partlen_or_tick); + updateFlags |= SC_PART_MODIFIED; + break; + case UndoOp::ModifyPartLength: // TODO FIXME (?) do port ctrls/clones? + i->part->setLenTick(i->old_partlen_or_tick); + updateFlags |= SC_PART_MODIFIED; + break; + case UndoOp::ModifyPartLengthFrames: // TODO FIXME FINDMICH frames deprecated! do port ctrls/clones? + i->part->setLenFrame(i->old_partlen_or_tick); updateFlags |= SC_PART_MODIFIED; break; case UndoOp::AddEvent: @@ -484,26 +485,31 @@ void Song::doRedo2() } break; case UndoOp::AddPart: - addPart(i->oPart); + addPart(i->part); updateFlags |= SC_PART_INSERTED; - i->oPart->events()->incARef(1); - chainClone(i->oPart); + i->part->events()->incARef(1); + chainClone(i->part); break; case UndoOp::DeletePart: - removePart(i->oPart); + removePart(i->part); updateFlags |= SC_PART_REMOVED; - i->oPart->events()->incARef(-1); - unchainClone(i->oPart); + i->part->events()->incARef(-1); + unchainClone(i->part); break; - case UndoOp::ModifyPart: - if(i->doCtrls) - removePortCtrlEvents(i->oPart, i->doClones); - changePart(i->oPart, i->nPart); - i->nPart->events()->incARef(1); - i->oPart->events()->incARef(-1); - replaceClone(i->oPart, i->nPart); - if(i->doCtrls) - addPortCtrlEvents(i->nPart, i->doClones); + case UndoOp::ModifyPartName: + i->part->setName(i->_newName); + updateFlags |= SC_PART_MODIFIED; + break; + case UndoOp::ModifyPartTick: // TODO FIXME (?) do port ctrls/clones? + i->part->setTick(i->new_partlen_or_tick); + updateFlags |= SC_PART_MODIFIED; + break; + case UndoOp::ModifyPartLength: // TODO FIXME (?) do port ctrls/clones? + i->part->setLenTick(i->new_partlen_or_tick); + updateFlags |= SC_PART_MODIFIED; + break; + case UndoOp::ModifyPartLengthFrames: // TODO FIXME FINDMICH frames deprecated! do port ctrls/clones? + i->part->setLenFrame(i->new_partlen_or_tick); updateFlags |= SC_PART_MODIFIED; break; case UndoOp::AddEvent: @@ -590,10 +596,12 @@ UndoOp::UndoOp(UndoType type_, int n, Track* track_) track = track_; } -UndoOp::UndoOp(UndoType type_, Part* part) +UndoOp::UndoOp(UndoType type_, Part* part, unsigned old_len_or_tick, unsigned new_len_or_tick, bool, bool) { type = type_; - oPart = part; + part = part; + old_partlen_or_tick=old_len_or_tick; + new_partlen_or_tick=new_len_or_tick; } UndoOp::UndoOp(UndoType type_, Event& oev, Event& nev, Part* part_, bool doCtrls_, bool doClones_) @@ -615,15 +623,6 @@ UndoOp::UndoOp(UndoType type_, Event& nev, Part* part_, bool doCtrls_, bool doCl doClones = doClones_; } -UndoOp::UndoOp(UndoType type_, Part* oPart_, Part* nPart_, bool doCtrls_, bool doClones_) - { - type = type_; - oPart = oPart_; - nPart = nPart_; - doCtrls = doCtrls_; - doClones = doClones_; - } - UndoOp::UndoOp(UndoType type_, int c, int ctrl_, int ov, int nv) { type = type_; @@ -649,10 +648,20 @@ UndoOp::UndoOp(UndoType type_, const char* changedFile, const char* changeData, endframe = endframe_; } +UndoOp::UndoOp(UndoOp::UndoType type_, Part* part_, const char* old_name, const char* new_name) +{ + type=type_; + part=part_; + _oldName = new char[strlen(old_name) + 1]; + _newName = new char[strlen(new_name) + 1]; + strcpy(_oldName, old_name); + strcpy(_newName, new_name); +} + UndoOp::UndoOp(UndoOp::UndoType type_, Track* track_, const char* old_name, const char* new_name) { type = type_; - _renamedTrack = track_; + track = track_; _oldName = new char[strlen(old_name) + 1]; _newName = new char[strlen(new_name) + 1]; strcpy(_oldName, old_name); @@ -727,7 +736,7 @@ bool Song::doUndo1() break; case UndoOp::ModifyTrackName: - i->_renamedTrack->setName(i->_oldName); + i->track->setName(i->_oldName); updateFlags |= SC_TRACK_MODIFIED; break; case UndoOp::ModifyClip: @@ -851,7 +860,7 @@ bool Song::doRedo1() removeTrack1(i->track); break; case UndoOp::ModifyTrackName: - i->_renamedTrack->setName(i->_newName); + i->track->setName(i->_newName); updateFlags |= SC_TRACK_MODIFIED; break; case UndoOp::ModifyClip: diff --git a/muse2/muse/undo.h b/muse2/muse/undo.h index 2f582d8e..4fded825 100644 --- a/muse2/muse/undo.h +++ b/muse2/muse/undo.h @@ -46,7 +46,7 @@ extern std::list temporaryWavFiles; //!< Used for storing all tmp-files struct UndoOp { enum UndoType { AddTrack, DeleteTrack, - AddPart, DeletePart, ModifyPart, + AddPart, DeletePart, ModifyPartTick, ModifyPartLength, ModifyPartLengthFrames, /* FINDMICH FIXME frames are to be deprecated */ ModifyPartName, AddEvent, DeleteEvent, ModifyEvent, AddTempo, DeleteTempo, AddSig, DeleteSig, @@ -71,11 +71,9 @@ struct UndoOp { int trackno; }; struct { - Part* oPart; - Part* nPart; - }; - struct { - Part* part; // this part is only relevant for EVENT operations, NOT for part ops! + Part* part; + unsigned old_partlen_or_tick; // FIXME FINDMICHJETZT XTicks!! + unsigned new_partlen_or_tick; }; struct { int channel; @@ -93,17 +91,15 @@ struct UndoOp { Marker* realMarker; Marker* copyMarker; }; - struct { - Track* _renamedTrack; - char* _oldName; - char* _newName; - }; struct { Track* _propertyTrack; int _oldPropValue; int _newPropValue; }; }; + + char* _oldName; + char* _newName; Event oEvent; Event nEvent; bool doCtrls; @@ -115,10 +111,11 @@ struct UndoOp { UndoOp(); UndoOp(UndoType type, int a, int b, int c=0); UndoOp(UndoType type, int n, Track* track); - UndoOp(UndoType type, Part* part); + UndoOp(UndoType type, Part* part, unsigned old_len_or_tick=-1, unsigned new_len_or_tick=-1, bool doCtrls=false, bool doClones=false); // FIXME these bools are UNUSED!! + UndoOp(UndoType type, Part* part, const char* old_name, const char* new_name); UndoOp(UndoType type, Event& oev, Event& nev, Part* part, bool doCtrls, bool doClones); UndoOp(UndoType type, Event& nev, Part* part, bool doCtrls, bool doClones); - UndoOp(UndoType type, Part* oPart, Part* nPart, bool doCtrls, bool doClones); + UndoOp(UndoType type, Part* part, unsigned tick, bool doCtrls, bool doClones); // FIXME FINDMICHJETZT XTicks! UndoOp(UndoType type, int c, int ctrl, int ov, int nv); UndoOp(UndoType type, const char* changedFile, const char* changeData, int startframe, int endframe); UndoOp(UndoType type, Marker* copyMarker, Marker* realMarker); -- cgit v1.2.3 From 4933ccfe7552dc5dbb2921f6583bbeb92dd144b4 Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Fri, 16 Aug 2013 23:04:08 +0200 Subject: Parts have their own, non-shared EventList (still WIP!) removed refcounting in Eventlist Part::events() is now a const EventList& chaining parts now a Part:: member function made Track::events, ::mpevents public instead of using an insane reference-accessor TODO: need a grouping indicator of clones (like the eventlist pointer was used for) --- muse2/muse/arranger/pcanvas.cpp | 78 +++----- muse2/muse/arranger/tlist.cpp | 10 +- muse2/muse/audio.cpp | 10 +- muse2/muse/ctrl/ctrlcanvas.cpp | 5 +- muse2/muse/event.cpp | 2 +- muse2/muse/event.h | 14 +- muse2/muse/eventbase.h | 2 +- muse2/muse/exportmidi.cpp | 16 +- muse2/muse/functions.cpp | 41 ++--- muse2/muse/helper.cpp | 4 +- muse2/muse/importmidi.cpp | 45 ++--- muse2/muse/liste/listedit.cpp | 4 +- muse2/muse/midi.cpp | 23 ++- muse2/muse/midi.h | 2 +- muse2/muse/midiedit/dcanvas.cpp | 44 +++-- muse2/muse/midiedit/dcanvas.h | 4 +- muse2/muse/midiedit/dlist.cpp | 9 +- muse2/muse/midiedit/drumedit.cpp | 8 +- muse2/muse/midiedit/ecanvas.cpp | 3 +- muse2/muse/midiedit/piano.cpp | 3 +- muse2/muse/midiedit/prcanvas.cpp | 7 +- muse2/muse/midiedit/scoreedit.cpp | 7 +- muse2/muse/midievent.h | 2 +- muse2/muse/part.cpp | 369 ++++++++----------------------------- muse2/muse/part.h | 54 +++--- muse2/muse/remote/pyapi.cpp | 10 +- muse2/muse/song.cpp | 98 +++++----- muse2/muse/song.h | 2 +- muse2/muse/songfile.cpp | 17 +- muse2/muse/steprec.cpp | 18 +- muse2/muse/structure.cpp | 17 +- muse2/muse/track.cpp | 58 ++---- muse2/muse/track.h | 12 +- muse2/muse/undo.cpp | 19 +- muse2/muse/undo.h | 4 +- muse2/muse/wave.cpp | 6 +- muse2/muse/waveedit/wavecanvas.cpp | 36 ++-- muse2/muse/waveedit/wavecanvas.h | 4 +- muse2/muse/waveedit/waveview.cpp | 5 +- muse2/muse/waveevent.h | 2 +- muse2/muse/wavetrack.cpp | 36 +--- muse2/muse/widgets/utils.cpp | 4 +- 42 files changed, 371 insertions(+), 743 deletions(-) (limited to 'muse2/muse/audio.cpp') diff --git a/muse2/muse/arranger/pcanvas.cpp b/muse2/muse/arranger/pcanvas.cpp index 5cad107a..860a33ac 100644 --- a/muse2/muse/arranger/pcanvas.cpp +++ b/muse2/muse/arranger/pcanvas.cpp @@ -383,28 +383,17 @@ bool PartCanvas::moveItem(MusECore::Undo& operations, CItem* item, const QPoint& else { MusECore::Part* dpart; - bool clone = (t == MOVE_CLONE || (t == MOVE_COPY && spart->events()->arefCount() > 1)); + bool clone = (t == MOVE_CLONE || (t == MOVE_COPY && spart->hasClones())); // This increments aref count if cloned, and chains clones. // It also gives the new part a new serial number. - dpart = dtrack->newPart(spart, clone); + if (clone) + dpart = spart->createNewClone(); + else + dpart = spart->duplicate(); dpart->setTick(dtick); - if (t == MOVE_COPY && !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); - } - } - 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... - // TODO DELETETHIS: is the above comment still correct (by flo93)? i doubt it! operations.push_back(MusECore::UndoOp(MusECore::UndoOp::AddPart,dpart)); new_partend=(dpart->lenTick() + dpart->tick()); @@ -713,7 +702,7 @@ QMenu* PartCanvas::genItemPopup(CItem* item) act_copy->setShortcut(Qt::CTRL+Qt::Key_C); partPopup->addSeparator(); - int rc = npart->part()->events()->arefCount(); + int rc = npart->part()->nClones(); QString st = QString(tr("s&elect ")); if(rc > 1) st += (QString().setNum(rc) + QString(" ")); @@ -847,16 +836,8 @@ void PartCanvas::itemPopup(CItem* item, int n, const QPoint& pt) case 15: // declone { MusECore::Part* spart = npart->part(); - MusECore::Track* track = npart->track(); - MusECore::Part* dpart = track->newPart(spart, false); - - 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); - } + MusECore::Part* dpart = spart->duplicate(); // dpart will not be member of any clone chain! + Undo operations; operations.push_back(UndoOp(UndoOp::DeletePart, spart)); operations.push_back(UndoOp(UndoOp::AddPart, dpart)); @@ -884,9 +865,8 @@ void PartCanvas::itemPopup(CItem* item, int n, const QPoint& pt) case 17: // File info { MusECore::Part* p = item->part(); - MusECore::EventList* el = p->events(); QString str = tr("Part name: %1\nFiles:").arg(p->name()); - for (MusECore::iEvent e = el->begin(); e != el->end(); ++e) + for (MusECore::ciEvent e = p->events().begin(); e != p->events().end(); ++e) { MusECore::Event event = e->second; MusECore::SndFileR f = event.sndFile(); @@ -905,16 +885,13 @@ void PartCanvas::itemPopup(CItem* item, int n, const QPoint& pt) // Traverse and process the clone chain ring until we arrive at the same part again. // The loop is a safety net. MusECore::Part* p = part; - int j = part->cevents()->arefCount(); - if(j > 0) + + if(part->hasClones()) { - for(int i = 0; i < j; ++i) - { - p->setSelected(true); - p = p->nextClone(); - if(p == part) - break; - } + p->setSelected(true); + for(MusECore::Part* it = p->nextClone(); it!=p; it=it->nextClone()) + it->setSelected(true); + MusEGlobal::song->update(SC_SELECTION); } @@ -1498,7 +1475,6 @@ void PartCanvas::drawItem(QPainter& p, const CItem* item, const QRect& rect) if((unsigned int)to > part->lenTick()) to = part->lenTick(); - bool clone = part->events()->arefCount() > 1; QBrush brush; QRect r = item->bbox(); @@ -1723,12 +1699,11 @@ void PartCanvas::drawItem(QPainter& p, const CItem* item, const QRect& rect) drawWavePart(p, rect, wp, r); else if (mp) { - drawMidiPart(p, rect, mp->events(), (MusECore::MidiTrack*)part->track(), mp, r, mp->tick(), from, to); + drawMidi*** /* FIXME: just give it the mp, not mp->whatever*/Part(p, rect, mp->events(), (MusECore::MidiTrack*)part->track(), mp, r, mp->tick(), from, to); } p.setWorldMatrixEnabled(false); - #if 1 // DELETETHIS remove wrapping #if // // Now draw the borders, using custom segments... // @@ -1756,7 +1731,7 @@ void PartCanvas::drawItem(QPainter& p, const CItem* item, const QRect& rect) penNormal2V.setCosmetic(true); QVector customDashPattern; - if(clone) + if(part->hasClones()) { customDashPattern << 4.0 << 6.0; penSelect1H.setDashPattern(customDashPattern); @@ -1819,8 +1794,6 @@ void PartCanvas::drawItem(QPainter& p, const CItem* item, const QRect& rect) QLine l3(lbx_c, ye_0, rbx_c, ye_0); p.drawLine(l3); // Bottom line - #endif - if (MusEGlobal::config.canvasShowPartType & 1) { // show names // draw name // FN: Set text color depending on part color (black / white) @@ -2140,8 +2113,7 @@ void PartCanvas::drawWavePart(QPainter& p, int h = hh/2; int y = pr.y() + h; - MusECore::EventList* el = wp->events(); - for (MusECore::iEvent e = el->begin(); e != el->end(); ++e) { + for (MusECore::ciEvent e = wp->events().begin(); e != wp->events().end(); ++e) { int cc = hh % 2 ? 0 : 1; MusECore::Event event = e->second; MusECore::SndFileR f = event.sndFile(); @@ -2350,8 +2322,6 @@ void PartCanvas::copy_in_range(MusECore::PartList* pl_) MusECore::Part* p2; track->splitPart(part, lpos, p1, p2); - p1->events()->incARef(-1); - p2->events()->incARef(-1); part=p2; } @@ -2362,8 +2332,6 @@ void PartCanvas::copy_in_range(MusECore::PartList* pl_) MusECore::Part* p2; track->splitPart(part, rpos, p1, p2); - p1->events()->incARef(-1); - p2->events()->incARef(-1); part=p1; } @@ -2459,7 +2427,7 @@ MusECore::Undo PartCanvas::pasteAt(const QString& pt, MusECore::Track* track, un if (tag == "part") { // Read the part. MusECore::Part* p = 0; - p = readXmlPart(xml, track, clone, toTrack); + p = Part::readFromXml(xml, track, clone, toTrack); // If it could not be created... if(!p) @@ -2469,9 +2437,6 @@ MusECore::Undo PartCanvas::pasteAt(const QString& pt, MusECore::Track* track, un break; } - p->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it - // so we must decrement it first :/ - // Increment the number of parts done. ++done; @@ -3045,10 +3010,9 @@ void PartCanvas::drawTopItem(QPainter& p, const QRect& rect) MusECore::MidiTrack *mt = (MusECore::MidiTrack*)track; QRect partRect(startPos,yPos, MusEGlobal::song->cpos()-startPos, track->height()); // probably the wrong rect MusECore::EventList myEventList; - MusECore::MPEventList *el = mt->mpevents(); - if (el->size()) { + if (mt->mpevents.size()) { - for (MusECore::ciMPEvent i = el->begin(); i != el->end(); ++i) { + for (MusECore::ciMPEvent i = mt->mpevents.begin(); i != mt->mpevents.end(); ++i) { MusECore::MidiPlayEvent pe = *i; if (pe.isNote() && !pe.isNoteOff()) { diff --git a/muse2/muse/arranger/tlist.cpp b/muse2/muse/arranger/tlist.cpp index 8535a9f5..b27a48e1 100644 --- a/muse2/muse/arranger/tlist.cpp +++ b/muse2/muse/arranger/tlist.cpp @@ -723,7 +723,7 @@ void TList::ctrlValueFinished() { if (p->second->tick()==0) { - for (MusECore::iEvent ev=p->second->events()->begin(); ev!=p->second->events()->end(); ev++) + for (MusECore::ciEvent ev=p->second->events().begin(); ev!=p->second->events().end(); ev++) { if (ev->second.tick()!=0) break; else if (ev->second.type()==MusECore::Controller && ev->second.dataA()==ctrl_num) @@ -2150,7 +2150,7 @@ void TList::mousePressEvent(QMouseEvent* ev) { if (p->second->tick()==0) { - for (MusECore::iEvent ev=p->second->events()->begin(); ev!=p->second->events()->end(); ev++) + for (MusECore::ciEvent ev=p->second->events().begin(); ev!=p->second->events().end(); ev++) { if (ev->second.tick()!=0) break; else if (ev->second.type()==MusECore::Controller && ev->second.dataA()==ctrl_num) @@ -2550,8 +2550,7 @@ void TList::classesPopupMenu(MusECore::Track* t, int x, int y) MusECore::PartList* pl = t->parts(); MusECore::MidiTrack* m = (MusECore::MidiTrack*) t; for (MusECore::iPart ip = pl->begin(); ip != pl->end(); ++ip) { - MusECore::EventList* el = ip->second->events(); - for (MusECore::iEvent ie = el->begin(); ie != el->end(); ++ie) { + for (MusECore::ciEvent ie = ip->second->events().begin(); ie != ip->second->events().end(); ++ie) { MusECore::Event ev = ie->second; if(ev.type() == MusECore::Note) { @@ -2590,8 +2589,7 @@ void TList::classesPopupMenu(MusECore::Track* t, int x, int y) MusECore::PartList* pl = t->parts(); MusECore::MidiTrack* m = (MusECore::MidiTrack*) t; for (MusECore::iPart ip = pl->begin(); ip != pl->end(); ++ip) { - MusECore::EventList* el = ip->second->events(); - for (MusECore::iEvent ie = el->begin(); ie != el->end(); ++ie) { + for (MusECore::ciEvent ie = ip->second->events().begin(); ie != ip->second->events().end(); ++ie) { MusECore::Event ev = ie->second; if (ev.type() == MusECore::Note) { diff --git a/muse2/muse/audio.cpp b/muse2/muse/audio.cpp index bbc803c5..914ff506 100644 --- a/muse2/muse/audio.cpp +++ b/muse2/muse/audio.cpp @@ -1027,19 +1027,17 @@ void Audio::recordStop() MidiTrackList* ml = MusEGlobal::song->midis(); for (iMidiTrack it = ml->begin(); it != ml->end(); ++it) { MidiTrack* mt = *it; - MPEventList* mpel = mt->mpevents(); - EventList* el = mt->events(); //--------------------------------------------------- // resolve NoteOff events, Controller etc. //--------------------------------------------------- // Do SysexMeta. Do loops. - buildMidiEventList(el, mpel, mt, MusEGlobal::config.division, true, true); - MusEGlobal::song->cmdAddRecordedEvents(mt, el, + buildMidiEventList(&mt->events, mt->mpevents, mt, MusEGlobal::config.division, true, true); + MusEGlobal::song->cmdAddRecordedEvents(mt, mt->events, MusEGlobal::extSyncFlag.value() ? startExternalRecTick : startRecordPos.tick()); - el->clear(); - mpel->clear(); + mt->events.clear(); + mt->mpevents.clear(); } // diff --git a/muse2/muse/ctrl/ctrlcanvas.cpp b/muse2/muse/ctrl/ctrlcanvas.cpp index d5adbc4f..8dd7fa9a 100644 --- a/muse2/muse/ctrl/ctrlcanvas.cpp +++ b/muse2/muse/ctrl/ctrlcanvas.cpp @@ -608,14 +608,13 @@ void CtrlCanvas::updateItems() if (filterTrack && part->track() != curTrack) continue; - MusECore::EventList* el = part->events(); MusECore::MidiCtrlValList* mcvl; partControllers(part, _cnum, 0, 0, 0, &mcvl); unsigned len = part->lenTick(); - for (MusECore::iEvent i = el->begin(); i != el->end(); ++i) + for (MusECore::ciEvent i = part->events().begin(); i != part->events().end(); ++i) { - MusECore::Event e = i->second; + const MusECore::Event& e = i->second; // Do not add events which are past the end of the part. if(e.tick() >= len) break; diff --git a/muse2/muse/event.cpp b/muse2/muse/event.cpp index 1a2d3c6e..73611448 100644 --- a/muse2/muse/event.cpp +++ b/muse2/muse/event.cpp @@ -74,7 +74,7 @@ void EventBase::dump(int n) const // clone //--------------------------------------------------------- -Event Event::clone() +Event Event::clone() const { #ifdef USE_SAMPLERATE return Event(ev->clone(), _audConv); diff --git a/muse2/muse/event.h b/muse2/muse/event.h index 8da37d4f..78ac7f93 100644 --- a/muse2/muse/event.h +++ b/muse2/muse/event.h @@ -73,7 +73,7 @@ class Event { void read(Xml& xml); void write(int a, Xml& xml, const Pos& offset, bool ForceWavePaths = false) const; void dump(int n = 0) const; - Event clone(); + Event clone() const; Event mid(unsigned a, unsigned b); bool isNote() const; @@ -124,7 +124,7 @@ typedef std::multimap > EL; typedef EL::iterator iEvent; typedef EL::reverse_iterator riEvent; typedef EL::const_iterator ciEvent; -typedef std::pair EventRange; +typedef std::pair EventRange; //--------------------------------------------------------- // EventList @@ -132,19 +132,9 @@ typedef std::pair EventRange; //--------------------------------------------------------- class EventList : public EL { - int ref; // number of references to this EventList - int aref; // number of active references (exclude undo list) void deselect(); public: - EventList() { ref = 0; aref = 0; } - ~EventList() {} - - void incRef(int n) { ref += n; } - int refCount() const { return ref; } - void incARef(int n) { aref += n; } - int arefCount() const { return aref; } - iEvent find(const Event&); iEvent add(Event& event); void move(Event& event, unsigned tick); diff --git a/muse2/muse/eventbase.h b/muse2/muse/eventbase.h index 0cb960d9..9e7b2df8 100644 --- a/muse2/muse/eventbase.h +++ b/muse2/muse/eventbase.h @@ -95,7 +95,7 @@ class EventBase : public PosLen { virtual void setSpos(int) { } virtual SndFileR sndFile() const { return 0; } virtual void setSndFile(SndFileR&) { } - virtual EventBase* clone() = 0; + virtual EventBase* clone() const = 0; virtual void readAudio(WavePart* /*part*/, unsigned /*offset*/, float** /*bpp*/, int /*channels*/, int /*nn*/, bool /*doSeek*/, bool /*overwrite*/) { } diff --git a/muse2/muse/exportmidi.cpp b/muse2/muse/exportmidi.cpp index e5cd74e1..aa9b83cc 100644 --- a/muse2/muse/exportmidi.cpp +++ b/muse2/muse/exportmidi.cpp @@ -131,11 +131,11 @@ static void addController(MPEventList* l, int tick, int port, int channel, int a // track can be NULL meaning no concept of drum notes is allowed in init sequences. //--------------------------------------------------------- -static void addEventList(MusECore::EventList* evlist, MusECore::MPEventList* mpevlist, MusECore::MidiTrack* track, MusECore::Part* part, int port, int channel) +static void addEventList(const MusECore::EventList& evlist, MusECore::MPEventList* mpevlist, MusECore::MidiTrack* track, MusECore::Part* part, int port, int channel) { - for (MusECore::iEvent i = evlist->begin(); i != evlist->end(); ++i) + for (MusECore::ciEvent i = evlist.begin(); i != evlist.end(); ++i) { - MusECore::Event ev = i->second; + const MusECore::Event& ev = i->second; int tick = ev.tick(); if(part) tick += part->tick(); @@ -519,8 +519,7 @@ void MusE::exportMidi() MusECore::PartList* parts = track->parts(); for (MusECore::iPart p = parts->begin(); p != parts->end(); ++p) { MusECore::MidiPart* part = (MusECore::MidiPart*) (p->second); - MusECore::EventList* evlist = part->events(); - MusECore::addEventList(evlist, l, track, part, port, channel); + MusECore::addEventList(part->events(), l, track, part, port, channel); } ++i; @@ -529,12 +528,7 @@ void MusE::exportMidi() mf.setDivision(MusEGlobal::config.midiDivision); mf.setTrackList(mtl, i); mf.write(); - - // DELETETHIS 4 ??? or is this still an issue? - // TESTING: Cleanup. I did not valgrind this feature in last memleak fixes, but I suspect it leaked. - //for(MusECore::iMidiFileTrack imft = mtl->begin(); imft != mtl->end(); ++imft) - // delete *imft; - //delete mtl; + } } // namespace MusEGui diff --git a/muse2/muse/functions.cpp b/muse2/muse/functions.cpp index 449461c5..8b978843 100644 --- a/muse2/muse/functions.cpp +++ b/muse2/muse/functions.cpp @@ -142,7 +142,7 @@ map get_events(const set& parts, int range) map events; for (set::iterator part=parts.begin(); part!=parts.end(); part++) - for (iEvent event=(*part)->events()->begin(); event!=(*part)->events()->end(); event++) + for (ciEvent event=(*part)->events().begin(); event!=(*part)->events().end(); event++) if (is_relevant(event->second, *part, range)) events.insert(pair(&event->second, *part)); @@ -784,7 +784,7 @@ bool delete_overlaps(const set& parts, int range) Event& event2=*(it2->first); Part* part2=it2->second; - if ( (part1->events()==part2->events()) && // part1 and part2 are the same or are duplicates + if ( (part1->isCloneOf(part2)) && // part1 and part2 are the same or are duplicates (&event1 != &event2) && // and event1 and event2 aren't the same (deleted_events.find(&event2) == deleted_events.end()) ) //and event2 hasn't been deleted before { @@ -844,7 +844,7 @@ bool legato(const set& parts, int range, int min_len, bool dont_shorten) if (dont_shorten) relevant = relevant && (event2.tick() >= event1.endTick()); - if ( (part1->events()==part2->events()) && // part1 and part2 are the same or are duplicates + if ( (part1->isCloneOf(part2)) && // part1 and part2 are the same or are duplicates relevant && // they're not too near (respect min_len and dont_shorten) (event2.tick()-event1.tick() < len ) ) // that's the nearest relevant following note len=event2.tick()-event1.tick(); @@ -956,7 +956,7 @@ QMimeData* selected_events_to_mime(const set& parts, int range) unsigned start_tick = INT_MAX; //will be the tick of the first event or INT_MAX if no events are there for (set::iterator part=parts.begin(); part!=parts.end(); part++) - for (iEvent ev=(*part)->events()->begin(); ev!=(*part)->events()->end(); ev++) + for (ciEvent ev=(*part)->events().begin(); ev!=(*part)->events().end(); ev++) if (is_relevant(ev->second, *part, range)) if (ev->second.tick() < start_tick) start_tick=ev->second.tick(); @@ -981,7 +981,7 @@ QMimeData* selected_events_to_mime(const set& parts, int range) for (set::iterator part=parts.begin(); part!=parts.end(); part++) { xml.tag(level++, "eventlist part_id=\"%d\"", (*part)->sn()); - for (iEvent ev=(*part)->events()->begin(); ev!=(*part)->events()->end(); ev++) + for (ciEvent ev=(*part)->events().begin(); ev!=(*part)->events().end(); ev++) if (is_relevant(ev->second, *part, range)) ev->second.write(level, xml, -start_tick); xml.etag(--level, "eventlist"); @@ -1158,8 +1158,6 @@ void paste_at(const QString& pt, int pos, int max_distance, bool always_new_part if (create_new_part) { dest_part = dest_track->newPart(); - dest_part->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it - // so we must decrement it first :/ dest_part->setTick(AL::sigmap.raster1(first_paste_tick, config.division)); new_part_map[old_dest_part].insert(dest_part); @@ -1231,7 +1229,7 @@ void paste_at(const QString& pt, int pos, int max_distance, bool always_new_part void select_all(const std::set& parts) { for (set::iterator part=parts.begin(); part!=parts.end(); part++) - for (iEvent ev_it=(*part)->events()->begin(); ev_it!=(*part)->events()->end(); ev_it++) + for (ciEvent ev_it=(*part)->events().begin(); ev_it!=(*part)->events().end(); ev_it++) { Event& event=ev_it->second; event.setSelected(true); @@ -1242,7 +1240,7 @@ void select_all(const std::set& parts) void select_none(const std::set& parts) { for (set::iterator part=parts.begin(); part!=parts.end(); part++) - for (iEvent ev_it=(*part)->events()->begin(); ev_it!=(*part)->events()->end(); ev_it++) + for (ciEvent ev_it=(*part)->events().begin(); ev_it!=(*part)->events().end(); ev_it++) { Event& event=ev_it->second; event.setSelected(false); @@ -1253,7 +1251,7 @@ void select_none(const std::set& parts) void select_invert(const std::set& parts) { for (set::iterator part=parts.begin(); part!=parts.end(); part++) - for (iEvent ev_it=(*part)->events()->begin(); ev_it!=(*part)->events()->end(); ev_it++) + for (ciEvent ev_it=(*part)->events().begin(); ev_it!=(*part)->events().end(); ev_it++) { Event& event=ev_it->second; event.setSelected(!event.selected()); @@ -1265,7 +1263,7 @@ void select_in_loop(const std::set& parts) { select_none(parts); for (set::iterator part=parts.begin(); part!=parts.end(); part++) - for (iEvent ev_it=(*part)->events()->begin(); ev_it!=(*part)->events()->end(); ev_it++) + for (ciEvent ev_it=(*part)->events().begin(); ev_it!=(*part)->events().end(); ev_it++) { Event& event=ev_it->second; event.setSelected((event.tick()>=MusEGlobal::song->lpos() && event.endTick()<=MusEGlobal::song->rpos())); @@ -1277,7 +1275,7 @@ void select_not_in_loop(const std::set& parts) { select_none(parts); for (set::iterator part=parts.begin(); part!=parts.end(); part++) - for (iEvent ev_it=(*part)->events()->begin(); ev_it!=(*part)->events()->end(); ev_it++) + for (diEvent ev_it=(*part)->events().begin(); ev_it!=(*part)->events().end(); ev_it++) { Event& event=ev_it->second; event.setSelected(!(event.tick()>=MusEGlobal::song->lpos() && event.endTick()<=MusEGlobal::song->rpos())); @@ -1299,10 +1297,9 @@ void shrink_parts(int raster) for (iPart part = (*track)->parts()->begin(); part != (*track)->parts()->end(); part++) if (part->second->selected()) { - EventList* events=part->second->events(); unsigned len=0; - for (iEvent ev=events->begin(); ev!=events->end(); ev++) + for (ciEvent ev=part->second->events().begin(); ev!=part->second->events().end(); ev++) if (ev->second.endTick() > len) len=ev->second.endTick(); @@ -1360,10 +1357,9 @@ void expand_parts(int raster) for (iPart part = (*track)->parts()->begin(); part != (*track)->parts()->end(); part++) if (part->second->selected()) { - EventList* events=part->second->events(); unsigned len=part->second->lenTick(); - for (iEvent ev=events->begin(); ev!=events->end(); ev++) + for (ciEvent ev=part->second->events().begin(); ev!=part->second->events().end(); ev++) if (ev->second.endTick() > len) len=ev->second.endTick(); @@ -1405,8 +1401,7 @@ void clean_parts() // erase all events exceeding the longest clone of this part // (i.e., erase all hidden events) or shorten them - EventList* el = part->second->events(); - for (iEvent ev=el->begin(); ev!=el->end(); ev++) + for (ciEvent ev=part->second->events().begin(); ev!=part->second->events().end(); ev++) if (ev->second.tick() >= len) operations.push_back(UndoOp(UndoOp::DeleteEvent, ev->second, part->second, true, true)); else if (ev->second.endTick() > len) @@ -1465,16 +1460,12 @@ bool merge_parts(const set& parts) } // create and prepare the new part - Part* new_part = track->newPart(first_part); + Part* new_part = first_part->duplicateEmpty(); new_part->setTick(begin); new_part->setLenTick(end-begin); - EventList* new_el = new_part->events(); - new_el->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it - // so we must decrement it first :/ - new_el->clear(); - // copy all events from the source parts into the new part + EventList& new_el = new_part->events(); for (set::iterator p_it=parts.begin(); p_it!=parts.end(); p_it++) if ((*p_it)->track()==track) { @@ -1483,7 +1474,7 @@ bool merge_parts(const set& parts) { Event new_event=ev_it->second; new_event.setTick( new_event.tick() + (*p_it)->tick() - new_part->tick() ); - new_el->add(new_event); + new_part->nonconst_events().add(new_event); } } diff --git a/muse2/muse/helper.cpp b/muse2/muse/helper.cpp index efb4ec68..e71be282 100644 --- a/muse2/muse/helper.cpp +++ b/muse2/muse/helper.cpp @@ -941,8 +941,8 @@ int populateMidiCtrlMenu(PopupMenu* menu, MusECore::PartList* part_list, MusECor if (i == sList.end()) { bool used = false; for (MusECore::iPart ip = part_list->begin(); ip != part_list->end(); ++ip) { - MusECore::EventList* el = ip->second->events(); - for (MusECore::iEvent ie = el->begin(); ie != el->end(); ++ie) { + const MusECore::EventList& el = ip->second->events(); + for (MusECore::iEvent ie = el.begin(); ie != el.end(); ++ie) { MusECore::Event e = ie->second; if(e.type() != MusECore::Controller) continue; diff --git a/muse2/muse/importmidi.cpp b/muse2/muse/importmidi.cpp index e22d865e..7cd69095 100644 --- a/muse2/muse/importmidi.cpp +++ b/muse2/muse/importmidi.cpp @@ -249,8 +249,8 @@ bool MusE::importMidi(const QString name, bool merge) // - calculate tick value for internal resolution // for (MusECore::iMidiFileTrack t = etl->begin(); t != etl->end(); ++t) { - MusECore::MPEventList* el = &((*t)->events); - if (el->empty()) + MusECore::MPEventList& el = ((*t)->events); + if (el.empty()) continue; // // if we split the track, SYSEX and META events go into @@ -264,7 +264,7 @@ bool MusE::importMidi(const QString name, bool merge) MusECore::iMPEvent ev; set< pair > already_processed; - for (ev = el->begin(); ev != el->end(); ++ev) + for (ev = el.begin(); ev != el.end(); ++ev) { if (ev->type() != MusECore::ME_SYSEX && ev->type() != MusECore::ME_META) { @@ -288,9 +288,7 @@ bool MusE::importMidi(const QString name, bool merge) track->setOutPort(port); MusECore::MidiPort* mport = &MusEGlobal::midiPorts[port]; - //MusECore::MidiInstrument* instr = mport->instrument(); - MusECore::EventList* mel = track->events(); - buildMidiEventList(mel, el, track, division, first, false); // Don't do loops. + buildMidiEventList(&track->events, el, track, division, first, false); // Don't do loops. first = false; // Comment Added by T356. @@ -305,8 +303,7 @@ bool MusE::importMidi(const QString name, bool merge) { track->setType(MusECore::Track::DRUM); // remap drum pitch with drumOutmap (was: Inmap. flo93 thought this was wrong) - MusECore::EventList* tevents = track->events(); - for (MusECore::iEvent i = tevents->begin(); i != tevents->end(); ++i) { + for (MusECore::iEvent i = track->events.begin(); i != track->events.end(); ++i) { MusECore::Event ev = i->second; if (ev.isNote()) { int pitch = MusEGlobal::drumOutmap[ev.pitch()]; @@ -339,8 +336,7 @@ bool MusE::importMidi(const QString name, bool merge) MusECore::MidiTrack* track = new MusECore::MidiTrack(); track->setOutChannel(0); track->setOutPort(0); - MusECore::EventList* mel = track->events(); - buildMidiEventList(mel, el, track, division, true, false); // Do SysexMeta. Don't do loops. + buildMidiEventList(&track->events, el, track, division, true, false); // Do SysexMeta. Don't do loops. processTrack(track); MusEGlobal::song->insertTrack0(track, -1); } @@ -383,8 +379,8 @@ bool MusE::importMidi(const QString name, bool merge) void MusE::processTrack(MusECore::MidiTrack* track) { - MusECore::EventList* tevents = track->events(); - if (tevents->empty()) + const MusECore::EventList& tevents = track->events; + if (tevents.empty()) return; //--------------------------------------------------- @@ -398,7 +394,7 @@ void MusE::processTrack(MusECore::MidiTrack* track) MusECore::PartList* pl = track->parts(); int lastTick = 0; - for (MusECore::iEvent i = tevents->begin(); i != tevents->end(); ++i) { + for (MusECore::iEvent i = tevents.begin(); i != tevents.end(); ++i) { MusECore::Event event = i->second; int epos = event.tick() + event.lenTick(); if (epos > lastTick) @@ -426,8 +422,8 @@ void MusE::processTrack(MusECore::MidiTrack* track) if (lastOff > x2) { continue; } - MusECore::iEvent i1 = tevents->lower_bound(x1); - MusECore::iEvent i2 = tevents->lower_bound(x2); + MusECore::iEvent i1 = tevents.lower_bound(x1); + MusECore::iEvent i2 = tevents.lower_bound(x2); if (i1 == i2) { // empty? if (st != -1) { @@ -480,28 +476,27 @@ void MusE::processTrack(MusECore::MidiTrack* track) MusECore::MidiPart* part = (MusECore::MidiPart*)(p->second); int stick = part->tick(); int etick = part->tick() + part->lenTick(); - MusECore::iEvent r1 = tevents->lower_bound(stick); - MusECore::iEvent r2 = tevents->lower_bound(etick); + MusECore::iEvent r1 = tevents.lower_bound(stick); + MusECore::iEvent r2 = tevents.lower_bound(etick); int startTick = part->tick(); - MusECore::EventList* el = part->events(); for (MusECore::iEvent i = r1; i != r2; ++i) { MusECore::Event ev = i->second; int ntick = ev.tick() - startTick; ev.setTick(ntick); - el->add(ev); + part->nonconst_events().add(ev); } - tevents->erase(r1, r2); + tevents.erase(r1, r2); } - if (tevents->size()) - printf("-----------events left: %zd\n", tevents->size()); - for (MusECore::iEvent i = tevents->begin(); i != tevents->end(); ++i) { + if (tevents.size()) + printf("-----------events left: %zd\n", tevents.size()); + for (MusECore::ciEvent i = tevents.begin(); i != tevents.end(); ++i) { printf("%d===\n", i->first); i->second.dump(); } // all events should be processed: - if (!tevents->empty()) + if (!tevents.empty()) printf("THIS SHOULD NEVER HAPPEN: not all events processed at the end of MusE::processTrack()!\n"); } @@ -620,7 +615,7 @@ void MusE::importPartToTrack(QString& filename, unsigned tick, MusECore::Track* if (tag == "part") { // Read the part. MusECore::Part* p = 0; - p = readXmlPart(xml, track); + p = Part::readFromXml(xml, track); // If it could not be created... if(!p) { diff --git a/muse2/muse/liste/listedit.cpp b/muse2/muse/liste/listedit.cpp index e1a49842..730ab5d8 100644 --- a/muse2/muse/liste/listedit.cpp +++ b/muse2/muse/liste/listedit.cpp @@ -247,8 +247,8 @@ void ListEdit::songChanged(MusECore::SongChangedFlags_t type) MusECore::MidiPart* part = (MusECore::MidiPart*) (p->second); if (part->sn() == curPartId) curPart = part; - MusECore::EventList* el = part->events(); - for (MusECore::iEvent i = el->begin(); i != el->end(); ++i) { + + for (MusECore::ciEvent i = part->events().begin(); i != part->events().end(); ++i) { EventListItem* item = new EventListItem(liste, i->second, part); for (int col = 0; col < liste->columnCount(); ++col) item->setText(col, item->text(col)); diff --git a/muse2/muse/midi.cpp b/muse2/muse/midi.cpp index 524329b1..d70b132c 100644 --- a/muse2/muse/midi.cpp +++ b/muse2/muse/midi.cpp @@ -198,7 +198,7 @@ QString nameSysex(unsigned int len, const unsigned char* buf) // generally: how to handle incomplete messages //--------------------------------------------------------- -void buildMidiEventList(EventList* del, const MPEventList* el, MidiTrack* track, +void buildMidiEventList(EventList* del, const MPEventList& el, MidiTrack* track, int div, bool addSysexMeta, bool doLoops) { int hbank = 0xff; @@ -211,7 +211,7 @@ void buildMidiEventList(EventList* del, const MPEventList* el, MidiTrack* track, EventList mel; - for (iMPEvent i = el->begin(); i != el->end(); ++i) { + for (iMPEvent i = el.begin(); i != el.end(); ++i) { MidiPlayEvent ev = *i; if (!addSysexMeta && (ev.type() == ME_SYSEX || ev.type() == ME_META)) continue; @@ -305,7 +305,7 @@ void buildMidiEventList(EventList* del, const MPEventList* el, MidiTrack* track, iMPEvent ii = i; ++ii; bool found = false; - for (; ii != el->end(); ++ii) { + for (; ii != el.end(); ++ii) { MidiPlayEvent ev = *ii; if (ev.type() == ME_CONTROLLER) { if (ev.dataA() == CTRL_LDATA) { @@ -471,7 +471,7 @@ void buildMidiEventList(EventList* del, const MPEventList* el, MidiTrack* track, e.setTick(tick); mel.add(e); } - } // i != el->end() + } // i != el.end() //--------------------------------------------------- @@ -625,7 +625,7 @@ void Audio::collectEvents(MusECore::MidiTrack* track, unsigned int cts, unsigned // dont play muted parts if (part->mute()) continue; - EventList* events = part->events(); + const EventList& events = part->events(); unsigned partTick = part->tick(); unsigned partLen = part->lenTick(); int delay = track->delay; @@ -644,8 +644,8 @@ void Audio::collectEvents(MusECore::MidiTrack* track, unsigned int cts, unsigned if(etick > partLen) continue; - iEvent ie = events->lower_bound(stick); - iEvent iend = events->lower_bound(etick); + ciEvent ie = events.lower_bound(stick); + ciEvent iend = events.lower_bound(etick); for (; ie != iend; ++ie) { Event ev = ie->second; @@ -1009,7 +1009,6 @@ void Audio::processMidi() // if (track->recordFlag()) { - MusECore::MPEventList* rl = track->mpevents(); MusECore::MidiPort* tport = &MusEGlobal::midiPorts[port]; RouteList* irl = track->inRoutes(); for(ciRoute r = irl->begin(); r != irl->end(); ++r) @@ -1063,7 +1062,7 @@ void Audio::processMidi() event.setTime(MusEGlobal::tempomap.frame2tick(event.time())); if(recording) - rl->add(event); + track->mpevents.add(event); } dev->setSysexFIFOProcessed(true); } @@ -1252,7 +1251,7 @@ void Audio::processMidi() drumRecEvent.setB(preVelo); drumRecEvent.setPort(port); //rec-event to current port drumRecEvent.setChannel(track->outChannel()); //rec-event to current channel - rl->add(drumRecEvent); + track->mpevents.add(drumRecEvent); } else { @@ -1263,7 +1262,7 @@ void Audio::processMidi() // different port. That must have been wrong - buildMidiEventList would ignore that. Tim. drumRecEvent.setPort(port); //rec-event to current port drumRecEvent.setChannel(track->outChannel()); //rec-event to current channel - rl->add(drumRecEvent); + track->mpevents.add(drumRecEvent); } } else @@ -1277,7 +1276,7 @@ void Audio::processMidi() recEvent.setPort(port); recEvent.setChannel(track->outChannel()); - rl->add(recEvent); + track->mpevents.add(recEvent); } } } diff --git a/muse2/muse/midi.h b/muse2/muse/midi.h index 86b11c97..c0f6e07f 100644 --- a/muse2/muse/midi.h +++ b/muse2/muse/midi.h @@ -126,7 +126,7 @@ QString midiMetaName(int); class MPEventList; class MidiTrack; -extern void buildMidiEventList(EventList* mel, const MPEventList* el, MidiTrack* track, int division, bool addSysexMeta, bool doLoops); +extern void buildMidiEventList(EventList* mel, const MPEventList& el, MidiTrack* track, int division, bool addSysexMeta, bool doLoops); } // namespace MusECore diff --git a/muse2/muse/midiedit/dcanvas.cpp b/muse2/muse/midiedit/dcanvas.cpp index ebe3a6c8..e1f77bef 100644 --- a/muse2/muse/midiedit/dcanvas.cpp +++ b/muse2/muse/midiedit/dcanvas.cpp @@ -516,11 +516,10 @@ void DrumCanvas::newItem(CItem* item, bool noSnap, bool replace) event.setPitch(npitch); // check for existing event // if found change command semantic from insert to delete - MusECore::EventList* el = part->events(); - MusECore::iEvent lower = el->lower_bound(event.tick()); - MusECore::iEvent upper = el->upper_bound(event.tick()); + MusECore::ciEvent lower = part->events().lower_bound(event.tick()); + MusECore::ciEvent upper = part->events().upper_bound(event.tick()); - for (MusECore::iEvent i = lower; i != upper; ++i) { + for (MusECore::ciEvent i = lower; i != upper; ++i) { MusECore::Event ev = i->second; if(!ev.isNote()) continue; @@ -1027,10 +1026,10 @@ void DrumCanvas::mapChanged(int spitch, int dpitch) if (old_style_drummap_mode) { MusECore::Undo operations; - std::vector< std::pair > delete_events; + std::vector< std::pair > delete_events; std::vector< std::pair > add_events; - typedef std::vector< std::pair >::iterator idel_ev; + typedef std::vector< std::pair >::iterator idel_ev; typedef std::vector< std::pair >::iterator iadd_ev; MusECore::MidiTrackList* tracks = MusEGlobal::song->midis(); @@ -1042,9 +1041,9 @@ void DrumCanvas::mapChanged(int spitch, int dpitch) MusECore::MidiPort* mp = &MusEGlobal::midiPorts[curTrack->outPort()]; MusECore::PartList* parts= curTrack->parts(); for (MusECore::iPart part = parts->begin(); part != parts->end(); ++part) { - MusECore::EventList* events = part->second->events(); + const MusECore::EventList& events = part->second->events(); MusECore::Part* thePart = part->second; - for (MusECore::iEvent i = events->begin(); i != events->end(); ++i) { + for (MusECore::ciEvent i = events.begin(); i != events.end(); ++i) { MusECore::Event event = i->second; if(event.type() != MusECore::Controller && event.type() != MusECore::Note) continue; @@ -1058,9 +1057,9 @@ void DrumCanvas::mapChanged(int spitch, int dpitch) } if (pitch == spitch) { - MusECore::Event* spitch_event = &(i->second); - delete_events.push_back(std::pair(thePart, spitch_event)); - MusECore::Event newEvent = spitch_event->clone(); + const MusECore::Event& spitch_event = i->second; + delete_events.push_back(std::pair(thePart, spitch_event)); + MusECore::Event newEvent = spitch_event.clone(); if(drc) newEvent.setA((newEvent.dataA() & ~0xff) | dpitch); else @@ -1068,9 +1067,9 @@ void DrumCanvas::mapChanged(int spitch, int dpitch) add_events.push_back(std::pair(thePart, newEvent)); } else if (pitch == dpitch) { - MusECore::Event* dpitch_event = &(i->second); - delete_events.push_back(std::pair(thePart, dpitch_event)); - MusECore::Event newEvent = dpitch_event->clone(); + const MusECore::Event& dpitch_event = i->second; + delete_events.push_back(std::pair(thePart, dpitch_event)); + MusECore::Event newEvent = dpitch_event.clone(); if(drc) newEvent.setA((newEvent.dataA() & ~0xff) | spitch); else @@ -1083,8 +1082,8 @@ void DrumCanvas::mapChanged(int spitch, int dpitch) for (idel_ev i = delete_events.begin(); i != delete_events.end(); i++) { MusECore::Part* thePart = (*i).first; - MusECore::Event* theEvent = (*i).second; - operations.push_back(MusECore::UndoOp(MusECore::UndoOp::DeleteEvent, *theEvent, thePart, true, false)); + const MusECore::Event& theEvent = (*i).second; + operations.push_back(MusECore::UndoOp(MusECore::UndoOp::DeleteEvent, theEvent, thePart, true, false)); } MusECore::DrumMap dm = MusEGlobal::drumMap[spitch]; @@ -1481,18 +1480,17 @@ void DrumCanvas::setStep(int v) //--------------------------------------------------------- // getEventAtCursorPos //--------------------------------------------------------- -MusECore::Event *DrumCanvas::getEventAtCursorPos() +const MusECore::Event* DrumCanvas::getEventAtCursorPos() { if (_tool != CursorTool) return 0; if (instrument_map[cursorPos.y()].tracks.contains(curPart->track())) { - MusECore::EventList* el = curPart->events(); - MusECore::iEvent lower = el->lower_bound(cursorPos.x()-curPart->tick()); - MusECore::iEvent upper = el->upper_bound(cursorPos.x()-curPart->tick()); + MusECore::ciEvent lower = curPart->events().lower_bound(cursorPos.x()-curPart->tick()); + MusECore::ciEvent upper = curPart->events().upper_bound(cursorPos.x()-curPart->tick()); int curPitch = instrument_map[cursorPos.y()].pitch; - for (MusECore::iEvent i = lower; i != upper; ++i) { - MusECore::Event &ev = i->second; + for (MusECore::ciEvent i = lower; i != upper; ++i) { + const MusECore::Event& ev = i->second; if (ev.isNote() && ev.pitch() == curPitch) return &ev; } @@ -1503,7 +1501,7 @@ MusECore::Event *DrumCanvas::getEventAtCursorPos() //--------------------------------------------------------- // selectCursorEvent //--------------------------------------------------------- -void DrumCanvas::selectCursorEvent(MusECore::Event *ev) +void DrumCanvas::selectCursorEvent(const MusECore::Event* ev) { for (iCItem i = items.begin(); i != items.end(); ++i) { diff --git a/muse2/muse/midiedit/dcanvas.h b/muse2/muse/midiedit/dcanvas.h index 1a1ee546..75c9fca3 100644 --- a/muse2/muse/midiedit/dcanvas.h +++ b/muse2/muse/midiedit/dcanvas.h @@ -167,8 +167,8 @@ class DrumCanvas : public EventCanvas { virtual void modifySelected(NoteInfo::ValType type, int val, bool delta_mode = true); virtual void keyPress(QKeyEvent* event); virtual void keyRelease(QKeyEvent* event); - MusECore::Event *getEventAtCursorPos(); - void selectCursorEvent(MusECore::Event *ev); + const MusECore::Event* getEventAtCursorPos(); + void selectCursorEvent(const MusECore::Event* ev); int pitch_and_track_to_instrument(int pitch, MusECore::Track* track); diff --git a/muse2/muse/midiedit/dlist.cpp b/muse2/muse/midiedit/dlist.cpp index 09b33735..ecfc02ba 100644 --- a/muse2/muse/midiedit/dlist.cpp +++ b/muse2/muse/midiedit/dlist.cpp @@ -208,8 +208,7 @@ void DList::draw(QPainter& p, const QRect& rect) continue; found = true; - MusECore::EventList* el = cur_part->events(); - for(MusECore::iEvent ie = el->begin(); ie != el->end(); ++ie) + for(MusECore::ciEvent ie = cur_part->events().begin(); ie != cur_part->events().end(); ++ie) { MusECore::Event e = ie->second; if(e.type() != MusECore::Controller) @@ -303,14 +302,14 @@ void DList::draw(QPainter& p, const QRect& rect) continue; found = true; - MusECore::EventList* el = cur_part->events(); + const MusECore::EventList& el = cur_part->events(); //MusECore::PartList* part_list = dcanvas->drumEdit()->parts(); //for(MusECore::ciPart ip = part_list->cbegin(); ip != part_list->cend(); ++ip) { //MusECore::Part* part = ip->second; ///if(part->track() != - //MusECore::EventList* el = part->events(); - for(MusECore::iEvent ie = el->begin(); ie != el->end(); ++ie) + //const MusECore::EventList& el = part->events(); + for(MusECore::ciEvent ie = el.begin(); ie != el.end(); ++ie) { MusECore::Event e = ie->second; if(e.type() != MusECore::Controller) diff --git a/muse2/muse/midiedit/drumedit.cpp b/muse2/muse/midiedit/drumedit.cpp index a93ad01e..175287cb 100644 --- a/muse2/muse/midiedit/drumedit.cpp +++ b/muse2/muse/midiedit/drumedit.cpp @@ -1850,8 +1850,8 @@ void DrumEdit::hideUnusedInstruments() for (MusECore::ciPart p = parts()->begin(); p != parts()->end(); ++p) if (p->second->track() == track) { - const EventList* el = p->second->cevents(); - for (ciEvent ev=el->begin(); ev!=el->end(); ev++) + const EventList& el = p->second->events(); + for (ciEvent ev=el.begin(); ev!=el.end(); ev++) hide[ev->second.pitch()]=false; } @@ -1883,8 +1883,8 @@ void DrumEdit::hideEmptyInstruments() for (MusECore::ciPart p = parts()->begin(); p != parts()->end(); ++p) if (p->second->track() == track) { - const EventList* el = p->second->cevents(); - for (ciEvent ev=el->begin(); ev!=el->end(); ev++) + const EventList& el = p->second->events(); + for (ciEvent ev=el.begin(); ev!=el.end(); ev++) hide[ev->second.pitch()]=false; } diff --git a/muse2/muse/midiedit/ecanvas.cpp b/muse2/muse/midiedit/ecanvas.cpp index 4ae702f1..d70cc50c 100644 --- a/muse2/muse/midiedit/ecanvas.cpp +++ b/muse2/muse/midiedit/ecanvas.cpp @@ -192,8 +192,7 @@ void EventCanvas::songChanged(MusECore::SongChangedFlags_t flags) if (etick > end_tick) end_tick = etick; - MusECore::EventList* el = part->events(); - for (MusECore::iEvent i = el->begin(); i != el->end(); ++i) { + for (MusECore::ciEvent i = part->events().begin(); i != part->events().end(); ++i) { MusECore::Event e = i->second; // Do not add events which are past the end of the part. if(e.tick() > len) diff --git a/muse2/muse/midiedit/piano.cpp b/muse2/muse/midiedit/piano.cpp index 40d93910..17553baa 100644 --- a/muse2/muse/midiedit/piano.cpp +++ b/muse2/muse/midiedit/piano.cpp @@ -570,8 +570,7 @@ void Piano::draw(QPainter& p, const QRect& r) int num = cl->num(); int pitch = num & 0x7f; bool used = false; - MusECore::EventList* el = cur_part->events(); - for (MusECore::ciEvent ie = el->begin(); ie != el->end(); ++ie) + for (MusECore::ciEvent ie = cur_part->events().begin(); ie != cur_part->events().end(); ++ie) { MusECore::Event e = ie->second; if(e.type() != MusECore::Controller) diff --git a/muse2/muse/midiedit/prcanvas.cpp b/muse2/muse/midiedit/prcanvas.cpp index 92ed3758..1d8039bb 100644 --- a/muse2/muse/midiedit/prcanvas.cpp +++ b/muse2/muse/midiedit/prcanvas.cpp @@ -635,11 +635,10 @@ void PianoCanvas::pianoCmd(int cmd) if (part == 0) break; - MusECore::EventList* el = part->events(); MusECore::Undo operations; std::list elist; - for (MusECore::iEvent e = el->lower_bound(pos[0] - part->tick()); e != el->end(); ++e) + for (MusECore::ciEvent e = part->events().lower_bound(pos[0] - part->tick()); e != part->events().end(); ++e) elist.push_back((MusECore::Event)e->second); for (std::list::iterator i = elist.begin(); i != elist.end(); ++i) { MusECore::Event event = *i; @@ -663,10 +662,8 @@ void PianoCanvas::pianoCmd(int cmd) break; MusECore::Undo operations; - MusECore::EventList* el = part->events(); - std::list elist; - for (MusECore::iEvent e = el->lower_bound(pos[0]); e != el->end(); ++e) + for (MusECore::ciEvent e = part->events().lower_bound(pos[0]); e != part->events().end(); ++e) elist.push_back((MusECore::Event)e->second); for (std::list::iterator i = elist.begin(); i != elist.end(); ++i) { MusECore::Event event = *i; diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp index 543e86aa..c1666a78 100644 --- a/muse2/muse/midiedit/scoreedit.cpp +++ b/muse2/muse/midiedit/scoreedit.cpp @@ -1787,11 +1787,10 @@ void staff_t::create_appropriate_eventlist() for (set::const_iterator part_it=parts.begin(); part_it!=parts.end(); part_it++) { MusECore::Part* part=*part_it; - MusECore::EventList* el=part->events(); - for (MusECore::iEvent it=el->begin(); it!=el->end(); it++) + for (MusECore::ciEvent it=part->events().begin(); it!=part->events().end(); it++) { - MusECore::Event& event=it->second; + const MusECore::Event& event=it->second; if ( ( event.isNote() && !event.isNoteOff() && // (event.endTick() <= part->lenTick()) ) && @@ -4508,7 +4507,7 @@ void ScoreCanvas::deselect_all() set all_parts=get_all_parts(); for (set::iterator part=all_parts.begin(); part!=all_parts.end(); part++) - for (MusECore::iEvent event=(*part)->events()->begin(); event!=(*part)->events()->end(); event++) + for (MusECore::ciEvent event=(*part)->events().begin(); event!=(*part)->events().end(); event++) event->second.setSelected(false); MusEGlobal::song->update(SC_SELECTION); diff --git a/muse2/muse/midievent.h b/muse2/muse/midievent.h index a63fede2..30f0d84f 100644 --- a/muse2/muse/midievent.h +++ b/muse2/muse/midievent.h @@ -36,7 +36,7 @@ class MidiEventBase : public EventBase { int a, b, c; // pitch, velo-on, velo-off EvData edata; - virtual EventBase* clone() { return new MidiEventBase(*this); } + virtual EventBase* clone() const { return new MidiEventBase(*this); } public: MidiEventBase(EventType t); diff --git a/muse2/muse/part.cpp b/muse2/muse/part.cpp index 10c7f201..7e99fa2b 100644 --- a/muse2/muse/part.cpp +++ b/muse2/muse/part.cpp @@ -22,6 +22,7 @@ // //========================================================= +#include #include #include @@ -39,209 +40,52 @@ namespace MusECore { int Part::snGen=0; -//--------------------------------------------------------- -// unchainClone -//--------------------------------------------------------- -void unchainClone(Part* p) +void Part::unchainClone() { - chainCheckErr(p); + chainCheckErr(this); // FIXME proper assert! + + if (_backupClone) printf("THIS SHOULD NEVER HAPPEN: Part::unchainClone() called, but _backupClone was non-NULL\n"); + + _backupClone=_prevClone; // Unchain the part. - p->prevClone()->setNextClone(p->nextClone()); - p->nextClone()->setPrevClone(p->prevClone()); + _prevClone->_nextClone = _nextClone; + _nextClone->_prevClone = _prevClone; // Isolate the part. - p->setPrevClone(p); - p->setNextClone(p); + _prevClone = this; + _nextClone = this; } -//--------------------------------------------------------- -// chainClone -// The quick way - if part to chain to is known... -//--------------------------------------------------------- - -void chainClone(Part* p1, Part* p2) +void Part::chainClone(Part* p) { - chainCheckErr(p1); - - // Make sure the part to be chained is unchained first. - p2->prevClone()->setNextClone(p2->nextClone()); - p2->nextClone()->setPrevClone(p2->prevClone()); + // FIXME assertion - // Link the part to be chained. - p2->setPrevClone(p1); - p2->setNextClone(p1->nextClone()); + this->unchainClone(); - // Re-link the existing part. - p1->nextClone()->setPrevClone(p2); - p1->setNextClone(p2); -} - -//--------------------------------------------------------- -// chainCloneInternal -// No error check, so it can be called by replaceClone() -//--------------------------------------------------------- - -void chainCloneInternal(Part* p) -{ - Track* t = p->track(); - Part* p1 = 0; + // Make our links to the chain + this->_prevClone = p; + this->_nextClone = p->nextClone; - // Look for a part with the same event list, that we can chain to. - // It's faster if track type is known... + // Make the chain's links to us + this->_nextClone->_prevClone = this; + p->_nextClone = this; - if(!t || (t && t->isMidiTrack())) - { - MidiTrack* mt = 0; - MidiTrackList* mtl = MusEGlobal::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) - { - 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)) - { - MusECore::WaveTrack* wt = 0; - MusECore::WaveTrackList* wtl = MusEGlobal::song->waves(); - for(MusECore::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); -} - -//--------------------------------------------------------- -// chainClone -// The slow way - if part to chain to is not known... -//--------------------------------------------------------- - -void chainClone(Part* p) -{ - chainCheckErr(p); - chainCloneInternal(p); + // Synchronize this->_events to p->_events + this->_events = p->_events; } -//--------------------------------------------------------- -// replaceClone -//--------------------------------------------------------- - -// this replaces p1 by p2. p1 is isolated, and p2 takes its place instead. -void replaceClone(Part* p1, Part* p2) +void Part::rechainClone() { - chainCheckErr(p1); - - // Make sure the replacement part is unchained first. - p2->prevClone()->setNextClone(p2->nextClone()); - p2->nextClone()->setPrevClone(p2->prevClone()); - - // If the two parts share the same event list, then this MUST - // be a straight forward replacement operation. Continue on. - // If not, and either part has more than one ref count, then do this... - if(p1->cevents() != p2->cevents()) - { - bool ret = false; - // If the part to be replaced is a single uncloned part, [DELETETHIS 4 this seems outdated=wrong to me] - // and the replacement part is not, then this operation - // MUST be an undo of a de-cloning of a cloned part. - //if(p1->cevents()->refCount() <= 1 && p2->cevents()->refCount() > 1) - if(p2->cevents()->refCount() > 1) - { - // Chain the replacement part. We don't know the chain it came from, - // so we use the slow method. - chainCloneInternal(p2); - //return; DELETETHIS - ret = true; - } + assert(_backupClone); - // If the replacement part is a single uncloned part, DELETETHIS same as above - // and the part to be replaced is not, then this operation - // MUST be a de-cloning of a cloned part. - //if(p1->cevents()->refCount() > 1 && p2->cevents()->refCount() <= 1) - if(p1->cevents()->refCount() > 1) - { - // Unchain the part to be replaced. - p1->prevClone()->setNextClone(p1->nextClone()); - p1->nextClone()->setPrevClone(p1->prevClone()); - // Isolate the part. - p1->setPrevClone(p1); - p1->setNextClone(p1); - ret = true; - } - - // Was the operation handled? - if(ret) - return; - // Note that two parts here with different event lists, each with more than one - // reference count, would be an error. It's not done anywhere in muse. But just - // to be sure, four lines above were changed to allow that condition. - // If each of the two different event lists, has only one ref count, we - // handle it like a regular replacement, below... - } - - // If the part to be replaced is a clone not a single lone part, re-link its neighbours to the replacement part... - if(p1->prevClone() != p1) - { - p1->prevClone()->setNextClone(p2); - p2->setPrevClone(p1->prevClone()); - } - else - p2->setPrevClone(p2); - - if(p1->nextClone() != p1) - { - p1->nextClone()->setPrevClone(p2); - p2->setNextClone(p1->nextClone()); - } - else - p2->setNextClone(p2); - - // Isolate the replaced part. - p1->setNextClone(p1); - p1->setPrevClone(p1); + this->chainClone(_backupClone); + _backupClone = NULL; } +// FIXME FINDMICHJETZT TODO: weg damit! + //--------------------------------------------------------- // unchainTrackParts //--------------------------------------------------------- @@ -441,9 +285,8 @@ void addPortCtrlEvents(Part* part, bool doClones) MidiTrack* mt = (MidiTrack*)t; MidiPort* mp = &MusEGlobal::midiPorts[mt->outPort()]; int ch = mt->outChannel(); - const EventList* el = p->cevents(); unsigned len = p->lenTick(); - for(ciEvent ie = el->begin(); ie != el->end(); ++ie) + for(ciEvent ie = p->events().begin(); ie != p->events().end(); ++ie) { const Event& ev = ie->second; // Added by T356. Do not add events which are past the end of the part. @@ -558,8 +401,7 @@ void removePortCtrlEvents(Part* part, bool doClones) MidiTrack* mt = (MidiTrack*)t; MidiPort* mp = &MusEGlobal::midiPorts[mt->outPort()]; int ch = mt->outChannel(); - const EventList* el = p->cevents(); - for(ciEvent ie = el->begin(); ie != el->end(); ++ie) + for(ciEvent ie = p->events().begin(); ie != p->events().end(); ++ie) { const Event& ev = ie->second; @@ -606,7 +448,8 @@ void removePortCtrlEvents(Part* part, bool doClones) iEvent Part::addEvent(Event& p) { - return _events->add(p); + assert(!hasClones()); + return _events.add(p); } //--------------------------------------------------------- @@ -638,66 +481,43 @@ Part* PartList::find(int idx) return 0; } -//--------------------------------------------------------- -// Part -//--------------------------------------------------------- - -Part::Part(const Part& p) : PosLen(p) -{ - _sn=p._sn; - _name=p._name; - _selected=p._selected; - _mute=p._mute; - _colorIndex=p._colorIndex; - _hiddenEvents=p._hiddenEvents; - _track=p._track; - _events=p._events; - _prevClone=p._prevClone; - _nextClone=p._nextClone; - - _events->incRef(1); -} - Part::Part(Track* t) { _hiddenEvents = NoEventsHidden; _prevClone = this; _nextClone = this; + _backupClone = NULL; setSn(newSn()); _track = t; _selected = false; _mute = false; _colorIndex = 0; - _events = new EventList; - _events->incRef(1); - _events->incARef(1); } -Part::Part(Track* t, EventList* ev) - { - _hiddenEvents = NoEventsHidden; - _prevClone = this; - _nextClone = this; - setSn(newSn()); - _track = t; - _selected = false; - _mute = false; - _colorIndex = 0; - _events = ev; - _events->incRef(1); - _events->incARef(1); - } + +/* FINDMICHJETZT FIXME! +Part* Part::duplicate() const +{ + Part* dup = duplicateEmpty(); -//--------------------------------------------------------- -// MidiPart -// copy constructor -//--------------------------------------------------------- + // copy the eventlist; duplicate each Event(Ptr!). + for (MusECore::ciEvent i = _events.begin(); i != _events.end(); ++i) + dup->_events.add(i->second.clone()) + + return dup; +} -MidiPart::MidiPart(const MidiPart& p) : Part(p) +Part* Part::duplicateEmpty() const { - _prevClone = this; - _nextClone = this; -} + MidiPart* part = new MidiPart(this->_track); + part->setName(name()); + part->setColorIndex(colorIndex()); + + *(PosLen*)part = *(PosLen*)this; + part->setMute(mute()); + + return part; +} */ //--------------------------------------------------------- @@ -716,16 +536,6 @@ WavePart::WavePart(WaveTrack* t, EventList* ev) setType(FRAMES); } -//--------------------------------------------------------- -// WavePart -// copy constructor -//--------------------------------------------------------- - -WavePart::WavePart(const WavePart& p) : Part(p) -{ - _prevClone = this; - _nextClone = this; -} //--------------------------------------------------------- @@ -733,19 +543,15 @@ WavePart::WavePart(const WavePart& p) : Part(p) //--------------------------------------------------------- Part::~Part() - { +{ if (_prevClone!=this || _nextClone!=this) { if (MusEGlobal::debugMsg) { fprintf(stderr, "Part isn't unchained in ~Part()! Unchaining now...\n"); } - unchainClone(this); - } - - _events->incRef(-1); - if (_events->refCount() <= 0) - delete _events; - } + unchainClone(); + } +} //--------------------------------------------------------- @@ -838,14 +644,14 @@ void Song::cmdResizePart(Track* track, Part* oPart, unsigned int len, bool doClo switch(track->type()) { case Track::WAVE: { - MusECore::WavePart* nPart = new MusECore::WavePart(*(MusECore::WavePart*)oPart); - EventList* el = nPart->events(); - unsigned new_partlength = MusEGlobal::tempomap.deltaTick2frame(oPart->tick(), oPart->tick() + len); - // TODO FINDMICH FIXME this is totally broken. we don't want to remove events just because they're beyond end-of-part. // we also don't want to auto-resize the last event. /* + MusECore::WavePart* nPart = new MusECore::WavePart(*(MusECore::WavePart*)oPart); + EventList* el = nPart->events(); + unsigned new_partlength = MusEGlobal::tempomap.deltaTick2frame(oPart->tick(), oPart->tick() + len); + // If new nr of frames is less than previous what can happen is: // - 0 or more events are beginning after the new final position. Those are removed from the part // - The last event begins before new final position and ends after it. If so, it will be resized to end at new part length @@ -924,7 +730,7 @@ void Song::cmdResizePart(Track* track, Part* oPart, unsigned int len, bool doClo // create two new parts p1 and p2 //--------------------------------------------------------- -void Track::splitPart(Part* part, int tickpos, Part*& p1, Part*& p2) +void Part::splitPart(int tickpos, Part*& p1, Part*& p2) { int l1 = 0; // len of first new part (ticks or samples) int l2 = 0; // len of second new part @@ -933,14 +739,14 @@ void Track::splitPart(Part* part, int tickpos, Part*& p1, Part*& p2) switch (type()) { case WAVE: - l1 = samplepos - part->frame(); - l2 = part->lenFrame() - l1; + l1 = samplepos - frame(); + l2 = lenFrame() - l1; break; case MIDI: case DRUM: case NEW_DRUM: - l1 = tickpos - part->tick(); - l2 = part->lenTick() - l1; + l1 = tickpos - tick(); + l2 = lenTick() - l1; break; default: return; @@ -949,11 +755,9 @@ void Track::splitPart(Part* part, int tickpos, Part*& p1, Part*& p2) if (l1 <= 0 || l2 <= 0) return; - p1 = newPart(part); // new left part - p2 = newPart(part); // new right part + p1 = this->duplicateEmpty(); // new left part + p2 = this->duplicateEmpty(); // new right part - // Added by Tim. p3.3.6 - switch (type()) { case WAVE: p1->setLenFrame(l1); @@ -973,28 +777,24 @@ void Track::splitPart(Part* part, int tickpos, Part*& p1, Part*& p2) p2->setSn(p2->newSn()); - EventList* se = part->events(); - EventList* de1 = p1->events(); - EventList* de2 = p2->events(); - if (type() == WAVE) { - int ps = part->frame(); + int ps = this->frame(); int d1p1 = p1->frame(); int d2p1 = p1->endFrame(); int d1p2 = p2->frame(); int d2p2 = p2->endFrame(); - for (iEvent ie = se->begin(); ie != se->end(); ++ie) { + for (iEvent ie = _events.begin(); ie != _events.end(); ++ie) { Event event = ie->second; int s1 = event.frame() + ps; int s2 = event.endFrame() + ps; if ((s2 > d1p1) && (s1 < d2p1)) { Event si = event.mid(d1p1 - ps, d2p1 - ps); - de1->add(si); + p1->_events.add(si); } if ((s2 > d1p2) && (s1 < d2p2)) { Event si = event.mid(d1p2 - ps, d2p2 - ps); - de2->add(si); + p2->_events.add(si); } } } @@ -1004,10 +804,10 @@ void Track::splitPart(Part* part, int tickpos, Part*& p1, Part*& p2) int t = event.tick(); if (t >= l1) { event.move(-l1); - de2->add(event); + p2->_events.add(event); } else - de1->add(event); + p1->_events.add(event); } } } @@ -1134,21 +934,6 @@ void MidiPart::dump(int n) const printf("MidiPart\n"); } -//--------------------------------------------------------- -// clone -//--------------------------------------------------------- - -MidiPart* MidiPart::clone() const - { - return new MidiPart(*this); - } - - -WavePart* WavePart::clone() const - { - return new WavePart(*this); - } - //--------------------------------------------------------- // hasHiddenEvents // Returns combination of HiddenEventsType enum. @@ -1159,7 +944,7 @@ int MidiPart::hasHiddenEvents() unsigned len = lenTick(); // TODO: For now, we don't support events before the left border, only events past the right border. - for(iEvent ev=events()->begin(); ev!=events()->end(); ev++) + for(ciEvent ev=_events.begin(); ev!=_events.end(); ev++) { if(ev->second.endTick() > len) { @@ -1181,7 +966,7 @@ int WavePart::hasHiddenEvents() unsigned len = lenFrame(); // TODO: For now, we don't support events before the left border, only events past the right border. - for(iEvent ev=events()->begin(); ev!=events()->end(); ev++) + for(ciEvent ev=_events.begin(); ev!=_events.end(); ev++) { if(ev->second.endFrame() > len) { diff --git a/muse2/muse/part.h b/muse2/muse/part.h index 357ec1db..a9241807 100644 --- a/muse2/muse/part.h +++ b/muse2/muse/part.h @@ -60,12 +60,8 @@ typedef CloneList::iterator iClone; class Part : public PosLen { public: enum HiddenEventsType { NoEventsHidden = 0, LeftEventsHidden, RightEventsHidden }; - - // @@@@@@@@@@@ IMPORTANT @@@@@@@@@@@@ - // @@ when adding member variables @@ - // @@ here, don't forget to update @@ - // @@ the copy-constructor! @@ - // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + static Part* readFromXml(Xml&, Track*, bool doClone = false, bool toTrack = true); private: static int snGen; @@ -78,22 +74,23 @@ class Part : public PosLen { protected: Track* _track; - EventList* _events; + EventList _events; Part* _prevClone; Part* _nextClone; + Part* _backupClone; // when a part gets removed, it's still there; and for undo-ing the remove, it must know about where it was clone-chained to. int _hiddenEvents; // Combination of HiddenEventsType. - + public: Part(Track*); - Part(Track*, EventList*); - Part(const Part& p); virtual ~Part(); + virtual Part* duplicate() = 0; + virtual Part* duplicateEmpty() = 0; + virtual Part* createNewClone() = 0; + int sn() { return _sn; } void setSn(int n) { _sn = n; } int newSn() { return snGen++; } - virtual Part* clone() const = 0; - const QString& name() const { return _name; } void setName(const QString& s) { _name = s; } bool selected() const { return _selected; } @@ -102,15 +99,19 @@ class Part : public PosLen { void setMute(bool b) { _mute = b; } Track* track() const { return _track; } void setTrack(Track*t) { _track = t; } - EventList* events() const { return _events; } - const EventList* cevents() const { return _events; } + const EventList& events() const { return _events; } + EventList& nonconst_events() { return _events; } int colorIndex() const { return _colorIndex; } void setColorIndex(int idx) { _colorIndex = idx; } + bool hasClones() { return _prevClone!=this || _nextClone!=this; } + int nClones(); Part* prevClone() { return _prevClone; } Part* nextClone() { return _nextClone; } - void setPrevClone(Part* p) { _prevClone = p; } - void setNextClone(Part* p) { _nextClone = p; } + + void unchainClone(); + void chainClone(Part* p); // *this is made a sibling of p! p is not touched (except for its clone-chain), whereas this->events will get altered + void rechainClone(); // re-chains the part to the same clone chain it was unchained before // Returns combination of HiddenEventsType enum. virtual int hasHiddenEvents() = 0; @@ -118,7 +119,7 @@ class Part : public PosLen { // call this after hasHiddenEvents(). int cachedHasHiddenEvents() const { return _hiddenEvents; } - iEvent addEvent(Event& p); + iEvent addEvent(Event& p); // DEPRECATED. requires the part to be NOT a clone. FIXME remove! virtual void write(int, Xml&, bool isCopy = false, bool forceWavePaths = false) const; @@ -134,10 +135,12 @@ class MidiPart : public Part { public: MidiPart(MidiTrack* t) : Part((Track*)t) {} - MidiPart(MidiTrack* t, EventList* ev) : Part((Track*)t, ev) {} - MidiPart(const MidiPart& p); virtual ~MidiPart() {} - virtual MidiPart* clone() const; + virtual MidiPart* duplicate(); + virtual MidiPart* duplicateEmpty(); + virtual MidiPart* createNewClone(); + + MidiTrack* track() const { return (MidiTrack*)Part::track(); } // Returns combination of HiddenEventsType enum. int hasHiddenEvents(); @@ -154,13 +157,15 @@ class WavePart : public Part { // p3.3.31 AudioConvertMap _converters; - + public: WavePart(WaveTrack* t); WavePart(WaveTrack* t, EventList* ev); - WavePart(const WavePart& p); virtual ~WavePart() {} - virtual WavePart* clone() const; + virtual WavePart* duplicate(); + virtual WavePart* duplicateEmpty(); + virtual WavePart* createNewClone(); + WaveTrack* track() const { return (WaveTrack*)Part::track(); } // Returns combination of HiddenEventsType enum. int hasHiddenEvents(); @@ -191,10 +196,8 @@ class PartList : public std::multimap > { } }; -extern void chainClone(Part* p); extern void chainClone(Part* p1, Part* p2); extern void unchainClone(Part* p); -extern void replaceClone(Part* p1, Part* p2); extern void chainCheckErr(Part* p); extern void unchainTrackParts(Track* t, bool decRefCount); extern void chainTrackParts(Track* t, bool incRefCount); @@ -202,7 +205,6 @@ extern void addPortCtrlEvents(Part* part, bool doClones); extern void addPortCtrlEvents(Event& event, Part* part, bool doClones); extern void removePortCtrlEvents(Part* part, bool doClones); extern void removePortCtrlEvents(Event& event, Part* part, bool doClones); -extern Part* readXmlPart(Xml&, Track*, bool doClone = false, bool toTrack = true); } // namespace MusECore diff --git a/muse2/muse/remote/pyapi.cpp b/muse2/muse/remote/pyapi.cpp index 7e03fa0e..7d03e36b 100644 --- a/muse2/muse/remote/pyapi.cpp +++ b/muse2/muse/remote/pyapi.cpp @@ -199,9 +199,9 @@ PyObject* getParts(PyObject*, PyObject* args) Py_DECREF(pstrtick2); // Pack midi events into list before wrapping it all up - EventList* events = mpart->events(); + const EventList& events = mpart->events(); PyObject* pyevents = Py_BuildValue("[]"); - for (ciEvent e = events->begin(); e != events->end(); e++) { + for (ciEvent e = events.begin(); e != events.end(); e++) { PyObject* pyevent = PyDict_New(); // The event structure - a dictionary with keys 'type','tick','data' const Event& event = e->second; @@ -331,7 +331,7 @@ bool addPyPartEventsToMusePart(MidiPart* npart, PyObject* part) event.setC(data[2]); event.setTick(etick); event.setLenTick(elen); - npart->events()->add(event); + npart->nonconst_events().add(event); } else printf("Unhandled event type from python: %s\n", type.c_str()); @@ -404,12 +404,12 @@ PyObject* modifyPart(PyObject*, PyObject* part) npart->setLenTick(opart->lenTick()); npart->setSn(opart->sn()); - for (iEvent e = opart->events()->begin(); e != opart->events()->end(); e++) { + for (ciEvent e = opart->events().begin(); e != opart->events().end(); e++) { Event& event = e->second; if (event.type() == Note || event.type() == Controller) continue; - npart->events()->add(event); + npart->nonconst_events()->add(event); } addPyPartEventsToMusePart(npart, part); diff --git a/muse2/muse/song.cpp b/muse2/muse/song.cpp index d457cb1d..a9b9a892 100644 --- a/muse2/muse/song.cpp +++ b/muse2/muse/song.cpp @@ -577,15 +577,15 @@ bool Song::addEvent(Event& event, Part* part) { // Return false if the event is already found. // (But allow a port controller value, above, in case it is not already stored.) - if(part->events()->find(event) != part->events()->end()) + if(part->events().find(event) != part->events().end()) { // This can be normal for some (redundant) operations. if(MusEGlobal::debugMsg) - printf("Song::addEvent event already found in part:%s size:%zd\n", part->name().toLatin1().constData(), part->events()->size()); + printf("Song::addEvent event already found in part:%s size:%zd\n", part->name().toLatin1().constData(), part->events().size()); return false; } - part->events()->add(event); + part->nonconst_events().add(event); return true; } @@ -595,18 +595,18 @@ bool Song::addEvent(Event& event, Part* part) void Song::changeEvent(Event& oldEvent, Event& newEvent, Part* part) { - iEvent i = part->events()->find(oldEvent); + iEvent i = part->nonconst_events().find(oldEvent); - if (i == part->events()->end()) { + if (i == part->nonconst_events().end()) { // This can be normal for some (redundant) operations. if(MusEGlobal::debugMsg) - printf("Song::changeEvent event not found in part:%s size:%zd\n", part->name().toLatin1().constData(), part->events()->size()); + printf("Song::changeEvent event not found in part:%s size:%zd\n", part->name().toLatin1().constData(), part->nonconst_events().size()); // no "return;" because: Allow it to add the new event. (And remove the old one from the midi port controller!) (tim) } else - part->events()->erase(i); + part->nonconst_events().erase(i); - part->events()->add(newEvent); + part->nonconst_events().add(newEvent); } //--------------------------------------------------------- @@ -615,14 +615,14 @@ void Song::changeEvent(Event& oldEvent, Event& newEvent, Part* part) void Song::deleteEvent(Event& event, Part* part) { - iEvent ev = part->events()->find(event); - if (ev == part->events()->end()) { + iEvent ev = part->nonconst_events().find(event); + if (ev == part->nonconst_events().end()) { // This can be normal for some (redundant) operations. if(MusEGlobal::debugMsg) - printf("Song::deleteEvent event not found in part:%s size:%zd\n", part->name().toLatin1().constData(), part->events()->size()); + printf("Song::deleteEvent event not found in part:%s size:%zd\n", part->name().toLatin1().constData(), part->nonconst_events().size()); return; } - part->events()->erase(ev); + part->nonconst_events().erase(ev); } //--------------------------------------------------------- @@ -717,17 +717,10 @@ void Song::changeAllPortDrumCtrlEvents(bool add, bool drumonly) for(ciPart ip = pl->begin(); ip != pl->end(); ++ip) { MidiPart* part = (MidiPart*)(ip->second); - const EventList* el = part->cevents(); - // unsigned len = part->lenTick(); // Commented out by flo, see below - for(ciEvent ie = el->begin(); ie != el->end(); ++ie) + for(ciEvent ie = part->events().begin(); ie != part->events().end(); ++ie) { const Event& ev = ie->second; - // Added by T356. Do not handle events which are past the end of the part. - // Commented out by flo: yes, DO handle them! these are "hidden events" - // which may be revealed later again! - // if(ev.tick() >= len) - // break; - + if(ev.type() != Controller) continue; @@ -780,30 +773,30 @@ void Song::changeACEvent(AudioTrack* t, int acid, int frame, int newFrame, doubl // add recorded Events into part //--------------------------------------------------------- -void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned startTick) +void Song::cmdAddRecordedEvents(MidiTrack* mt, const EventList& events, unsigned startTick) { - if (events->empty()) { + if (events.empty()) { if (MusEGlobal::debugMsg) printf("no events recorded\n"); return; } - iEvent s; - iEvent e; + ciEvent s; + ciEvent e; unsigned endTick; if((MusEGlobal::audio->loopCount() > 0 && startTick > lPos().tick()) || (punchin() && startTick < lPos().tick())) { startTick = lpos(); - s = events->lower_bound(startTick); + s = events.lower_bound(startTick); } else { - s = events->begin(); + s = events.begin(); } // search for last noteOff: endTick = 0; - for (iEvent i = events->begin(); i != events->end(); ++i) { + for (ciEvent i = events.begin(); i != events.end(); ++i) { Event ev = i->second; unsigned l = ev.endTick(); if (l > endTick) @@ -813,10 +806,10 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start if((MusEGlobal::audio->loopCount() > 0) || (punchout() && endTick > rPos().tick()) ) { endTick = rpos(); - e = events->lower_bound(endTick); + e = events.lower_bound(endTick); } else - e = events->end(); + e = events.end(); if (startTick > endTick) { if (MusEGlobal::debugMsg) @@ -856,14 +849,14 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start part->setLenTick(endTick - startTick); part->setName(mt->name()); // copy events - for (iEvent i = s; i != e; ++i) { + for (ciEvent i = s; i != e; ++i) { Event old = i->second; Event event = old.clone(); event.setTick(old.tick() - startTick); // addEvent also adds port controller values. So does msgAddPart, below. Let msgAddPart handle them. //addEvent(event, part); - if(part->events()->find(event) == part->events()->end()) - part->events()->add(event); + if(part->events().find(event) == part->events().end()) + part->nonconst_events().add(event); } MusEGlobal::audio->msgAddPart(part); updateFlags |= SC_PART_INSERTED; @@ -892,8 +885,8 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start if (_recMode == REC_REPLACE) { - iEvent si = part->events()->lower_bound(startTick - part->tick()); - iEvent ei = part->events()->lower_bound(part->endTick() - part->tick()); + iEvent si = part->nonconst_events().lower_bound(startTick - part->tick()); + iEvent ei = part->nonconst_events().lower_bound(part->endTick() - part->tick()); for (iEvent i = si; i != ei; ++i) { Event event = i->second; @@ -902,7 +895,7 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start // Remove the event from the new part's port controller values, and do all clone parts. removePortCtrlEvents(event, part, true); } - part->events()->erase(si, ei); + part->nonconst_events().erase(si, ei); } for (iEvent i = s; i != e; ++i) { @@ -912,8 +905,8 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start // Create an undo op. Indicate do port controller values and clone parts. addUndo(UndoOp(UndoOp::AddEvent, e, event, part, true, true)); - if(part->events()->find(event) == part->events()->end()) - part->events()->add(event); + if(part->nonconst_events().find(event) == part->nonconst_events().end()) + part->nonconst_events().add(event); // Add the event to the new part's port controller values, and do all clone parts. addPortCtrlEvents(event, part, true); @@ -921,8 +914,8 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start } else { if (_recMode == REC_REPLACE) { - iEvent si = part->events()->lower_bound(startTick - part->tick()); - iEvent ei = part->events()->lower_bound(endTick - part->tick()); + iEvent si = part->nonconst_events().lower_bound(startTick - part->tick()); + iEvent ei = part->nonconst_events().lower_bound(endTick - part->tick()); for (iEvent i = si; i != ei; ++i) { Event event = i->second; @@ -931,7 +924,7 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start // Remove the event from the part's port controller values, and do all clone parts. removePortCtrlEvents(event, part, true); } - part->events()->erase(si, ei); + part->nonconst_events().erase(si, ei); } for (iEvent i = s; i != e; ++i) { Event event = i->second; @@ -941,8 +934,8 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start // Indicate that controller values and clone parts were handled. addUndo(UndoOp(UndoOp::AddEvent, event, part, true, true)); - if(part->events()->find(event) == part->events()->end()) - part->events()->add(event); + if(part->nonconst_events().find(event) == part->nonconst_events().end()) + part->nonconst_events().add(event); // Add the event to the part's port controller values, and do all clone parts. addPortCtrlEvents(event, part, true); @@ -1951,8 +1944,7 @@ void Song::cmdRemovePart(Part* part) { removePart(part); addUndo(UndoOp(UndoOp::DeletePart, part)); - part->events()->incARef(-1); - unchainClone(part); + part->unchainClone(); updateFlags = SC_PART_REMOVED; } @@ -2331,7 +2323,7 @@ void Song::recordEvent(MidiTrack* mt, Event& event) unsigned tick = event.tick(); PartList* pl = mt->parts(); - MidiPart* part = 0; + const MidiPart* part = 0; iPart ip; for (ip = pl->begin(); ip != pl->end(); ++ip) { part = (MidiPart*)(ip->second); @@ -2343,14 +2335,14 @@ void Song::recordEvent(MidiTrack* mt, Event& event) updateFlags |= SC_EVENT_INSERTED; if (ip == pl->end()) { // create new part - part = new MidiPart(mt); + MidiPart* part = new MidiPart(mt); int startTick = roundDownBar(tick); int endTick = roundUpBar(tick + 1); part->setTick(startTick); part->setLenTick(endTick - startTick); part->setName(mt->name()); event.move(-startTick); - part->events()->add(event); + part->nonconst_events().add(event); MusEGlobal::audio->msgAddPart(part); return; } @@ -2361,8 +2353,8 @@ void Song::recordEvent(MidiTrack* mt, Event& event) Event ev; if(event.type() == Controller) { - EventRange range = part->events()->equal_range(tick); - for(iEvent i = range.first; i != range.second; ++i) + EventRange range = part->events().equal_range(tick); + for(ciEvent i = range.first; i != range.second; ++i) { ev = i->second; if(ev.type() == Controller && ev.dataA() == event.dataA()) @@ -2653,7 +2645,7 @@ int Song::execMidiAutomationCtlPopup(MidiTrack* track, MidiPart* part, const QPo unsigned partEnd = partStart + part->lenTick(); if(tick >= partStart && tick < partEnd) { - EventRange range = part->events()->equal_range(tick - partStart); + EventRange range = part->events().equal_range(tick - partStart); for(iEvent i = range.first; i != range.second; ++i) { ev = i->second; @@ -2733,7 +2725,7 @@ int Song::execMidiAutomationCtlPopup(MidiTrack* track, MidiPart* part, const QPo part->setLenTick(endTick - startTick); part->setName(mt->name()); e.setTick(tick - startTick); - part->events()->add(e); + part->nonconst_events().add(e); // Allow undo. MusEGlobal::audio->msgAddPart(part); } @@ -3387,7 +3379,7 @@ void Song::executeScript(const char* scriptfile, PartList* parts, int quant, boo fprintf(fp, "BEATLEN %d\n", AL::sigmap.ticksBeat(0)); fprintf(fp, "QUANTLEN %d\n", quant); - for (iEvent e = part->events()->begin(); e != part->events()->end(); e++) { + for (ciEvent e = part->events().begin(); e != part->events().end(); e++) { Event ev = e->second; if (ev.isNote()) diff --git a/muse2/muse/song.h b/muse2/muse/song.h index 909e54fc..91745c96 100644 --- a/muse2/muse/song.h +++ b/muse2/muse/song.h @@ -276,7 +276,7 @@ class Song : public QObject { //----------------------------------------- void cmdAddRecordedWave(WaveTrack* track, Pos, Pos); - void cmdAddRecordedEvents(MidiTrack*, EventList*, unsigned); + void cmdAddRecordedEvents(MidiTrack*, const EventList&, unsigned); bool addEvent(Event&, Part*); void changeEvent(Event&, Event&, Part*); void deleteEvent(Event&, Part*); diff --git a/muse2/muse/songfile.cpp b/muse2/muse/songfile.cpp index 9a583996..9b52791a 100644 --- a/muse2/muse/songfile.cpp +++ b/muse2/muse/songfile.cpp @@ -167,10 +167,10 @@ void Scale::read(Xml& xml) } //--------------------------------------------------------- -// readXmlPart +// Part::readFromXml //--------------------------------------------------------- -Part* readXmlPart(Xml& xml, Track* track, bool doClone, bool toTrack) +Part* Part::readFromXml(Xml& xml, Track* track, bool doClone, bool toTrack) { int id = -1; Part* npart = 0; @@ -347,7 +347,7 @@ Part* readXmlPart(Xml& xml, Track* track, bool doClone, bool toTrack) } else { - npart->events()->add(e); + npart->_events.add(e); } } else // ...Otherwise a clone was created, so we don't need the events. @@ -395,7 +395,6 @@ Part* readXmlPart(Xml& xml, Track* track, bool doClone, bool toTrack) void Part::write(int level, Xml& xml, bool isCopy, bool forceWavePaths) const { - const EventList* el = cevents(); int id = -1; uuid_t uuid; uuid_clear(uuid); @@ -406,7 +405,7 @@ void Part::write(int level, Xml& xml, bool isCopy, bool forceWavePaths) const { for(iClone i = MusEGlobal::cloneList.begin(); i != MusEGlobal::cloneList.end(); ++i) { - if(i->cp->cevents() == el) + if(i->cp->isCloneOf(this)) { uuid_copy(uuid, i->uuid); dumpEvents = false; @@ -422,11 +421,11 @@ void Part::write(int level, Xml& xml, bool isCopy, bool forceWavePaths) const } else { - if (el->arefCount() > 1) + if (this->hasClones()) { for (iClone i = MusEGlobal::cloneList.begin(); i != MusEGlobal::cloneList.end(); ++i) { - if (i->cp->cevents() == el) + if (i->cp->isCloneOf(this)) { id = i->id; dumpEvents = false; @@ -455,7 +454,7 @@ void Part::write(int level, Xml& xml, bool isCopy, bool forceWavePaths) const else xml.nput(level, "arefCount() > 1) + if(hasClones()) xml.nput(" isclone=\"1\""); xml.put(">"); level++; @@ -476,7 +475,7 @@ void Part::write(int level, Xml& xml, bool isCopy, bool forceWavePaths) const if (_mute) xml.intTag(level, "mute", _mute); if (dumpEvents) { - for (ciEvent e = el->begin(); e != el->end(); ++e) + for (ciEvent e = events().begin(); e != events().end(); ++e) e->second.write(level, xml, *this, forceWavePaths); } xml.etag(level, "part"); diff --git a/muse2/muse/steprec.cpp b/muse2/muse/steprec.cpp index 723fe650..466c4e21 100644 --- a/muse2/muse/steprec.cpp +++ b/muse2/muse/steprec.cpp @@ -76,10 +76,10 @@ void StepRec::record(Part* part, int pitch, int len, int step, int velo, bool ct chord_timer->stop(); // extend len of last note? - EventList* events = part->events(); + const EventList& events = part->events(); if (ctrl) { - for (iEvent i = events->begin(); i != events->end(); ++i) + for (iEvent i = events.begin(); i != events.end(); ++i) { Event ev = i->second; if (ev.isNote() && ev.pitch() == pitch && ((ev.tick() + ev.lenTick() + part->tick()) == tick)) @@ -106,8 +106,8 @@ void StepRec::record(Part* part, int pitch, int len, int step, int velo, bool ct // if we would find a note after part->lenTick(), the above "if" // avoids this. this has to be avoided because then part->hasHiddenEvents() is true // which results in forbidding any action beyond its end - EventRange range = events->equal_range(tick - part->tick()); - for (iEvent i = range.first; i != range.second; ++i) + EventRange range = events.equal_range(tick - part->tick()); + for (ciEvent i = range.first; i != range.second; ++i) { Event ev = i->second; if (ev.isNote() && ev.pitch() == pitch) @@ -161,18 +161,18 @@ void StepRec::record(Part* part, int pitch, int len, int step, int velo, bool ct // extend len of last note(s) using std::set; - set extend_set; - EventList* events = part->events(); - for (iEvent i = events->begin(); i != events->end(); ++i) + set extend_set; + const EventList& events = part->events(); + for (iEvent i = events.begin(); i != events.end(); ++i) { Event& ev = i->second; if (ev.isNote() && note_held_down[ev.pitch()] && ((ev.tick() + ev.lenTick() + part->tick()) == tick)) extend_set.insert(&ev); } - for (set::iterator it=extend_set.begin(); it!=extend_set.end(); it++) + for (set::iterator it=extend_set.begin(); it!=extend_set.end(); it++) { - Event& ev=**it; + const Event& ev=**it; Event e = ev.clone(); e.setLenTick(ev.lenTick() + len); operations.push_back(UndoOp(UndoOp::ModifyEvent,e, ev, part, false, false)); diff --git a/muse2/muse/structure.cpp b/muse2/muse/structure.cpp index ad22b8d3..98763a4a 100644 --- a/muse2/muse/structure.cpp +++ b/muse2/muse/structure.cpp @@ -166,8 +166,8 @@ void globalCut(bool onlySelectedTracks) if (part->nextClone()==part) // no clones { // cut Events - EventList* el = part->events(); - for (iEvent ie = el->lower_bound(len); ie != el->end(); ++ie) + const EventList& el = part->events(); + for (iEvent ie = el.lower_bound(len); ie != el.end(); ++ie) operations.push_back(UndoOp(UndoOp::DeleteEvent,ie->second, part, false, false)); } operations.push_back(UndoOp(UndoOp::ModifyPartLength, part, part->lenTick(), len, true, true)); @@ -184,8 +184,6 @@ void globalCut(bool onlySelectedTracks) track->splitPart(part, rpos, p2, p3); delete p2; p3->setTick(lpos); - p1->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it so we must decrement it first :/ - p3->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it so we must decrement it first :/ MusEGlobal::song->informAboutNewParts(part,p1,p3); operations.push_back(UndoOp(UndoOp::DeletePart,part)); @@ -200,7 +198,6 @@ void globalCut(bool onlySelectedTracks) track->splitPart(part, rpos, p1, p2); delete p1; p2->setTick(lpos); - p2->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it so we must decrement it first :/ MusEGlobal::song->informAboutNewParts(part,p2); operations.push_back(UndoOp(UndoOp::DeletePart,part)); @@ -259,8 +256,6 @@ Undo movePartsTotheRight(unsigned int startTicks, int moveTicks, bool only_selec Part* p2; track->splitPart(part, startTicks, p1, p2); p2->setTick(startTicks+moveTicks); - p2->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it so we must decrement it first :/ - p1->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it so we must decrement it first :/ MusEGlobal::song->informAboutNewParts(part,p1,p2); operations.push_back(UndoOp(UndoOp::DeletePart, part)); @@ -310,19 +305,11 @@ Undo partSplitter(unsigned int pos, bool onlySelectedTracks) Part* p2; track->splitPart(part, pos, p1, p2); - p1->events()->incARef(-1); // the later MusEGlobal::song->applyOperationGroup() will increment it - p2->events()->incARef(-1); // so we must decrement it first :/ - MusEGlobal::song->informAboutNewParts(part, p1); MusEGlobal::song->informAboutNewParts(part, p2); operations.push_back(UndoOp(UndoOp::DeletePart,part)); operations.push_back(UndoOp(UndoOp::AddPart,p1)); operations.push_back(UndoOp(UndoOp::AddPart,p2)); - if (MusEGlobal::debugMsg) - { - printf("in partSplitter: part1 %d\n",p1->events()->refCount()); - printf("in partSplitter: part2 %d\n",p2->events()->refCount()); - } break; } } diff --git a/muse2/muse/track.cpp b/muse2/muse/track.cpp index bced64d6..7bb516bb 100644 --- a/muse2/muse/track.cpp +++ b/muse2/muse/track.cpp @@ -66,9 +66,9 @@ void addPortCtrlEvents(MidiTrack* t) for(ciPart ip = pl->begin(); ip != pl->end(); ++ip) { Part* part = ip->second; - const EventList* el = part->cevents(); + const EventList& el = part->events(); unsigned len = part->lenTick(); - for(ciEvent ie = el->begin(); ie != el->end(); ++ie) + for(ciEvent ie = el.begin(); ie != el.end(); ++ie) { const Event& ev = ie->second; // Added by T356. Do not add events which are past the end of the part. @@ -116,8 +116,8 @@ void removePortCtrlEvents(MidiTrack* t) for(ciPart ip = pl->begin(); ip != pl->end(); ++ip) { Part* part = ip->second; - const EventList* el = part->cevents(); - for(ciEvent ie = el->begin(); ie != el->end(); ++ie) + const EventList& el = part->events(); + for(ciEvent ie = el.begin(); ie != el.end(); ++ie) { const Event& ev = ie->second; @@ -468,8 +468,6 @@ MidiTrack::MidiTrack() : Track(MIDI) { init(); - _events = new EventList; - _mpevents = new MPEventList; clefType=trebleClef; _drummap=new DrumMap[128]; @@ -481,9 +479,6 @@ MidiTrack::MidiTrack() MidiTrack::MidiTrack(const MidiTrack& mt, int flags) : Track(mt, flags) { - _events = new EventList; - _mpevents = new MPEventList; - _drummap=new DrumMap[128]; _drummap_hidden=new bool[128]; @@ -592,27 +587,11 @@ void MidiTrack::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); } @@ -628,8 +607,6 @@ void MidiTrack::assign(const Track& t, int flags) MidiTrack::~MidiTrack() { - delete _events; - delete _mpevents; delete [] _drummap; delete [] _drummap_hidden; @@ -810,7 +787,7 @@ void MidiTrack::setInPortAndChannelMask(unsigned int portmask, int chanmask) Part* MidiTrack::newPart(Part*p, bool clone) { - MidiPart* part = clone ? new MidiPart(this, p->events()) : new MidiPart(this); + MidiPart* part = clone ? p->createNewClone() : new MidiPart(this); if (p) { part->setName(p->name()); part->setColorIndex(p->colorIndex()); @@ -819,10 +796,6 @@ Part* MidiTrack::newPart(Part*p, bool clone) part->setMute(p->mute()); } - if(clone) - //p->chainClone(part); - chainClone(p, part); - return part; } @@ -933,10 +906,7 @@ void MidiTrack::read(Xml& xml) else if (tag == "compression") compression = xml.parseInt(); else if (tag == "part") { - //Part* p = newPart(); - //p->read(xml); - Part* p = 0; - p = readXmlPart(xml, this); + Part* p = Part::readFromXml(xml, this); if(p) parts()->add(p); } @@ -1251,7 +1221,7 @@ int MidiTrack::getFirstControllerValue(int ctrl, int def) { Part* part=pit->second; if (part->tick() > tick) break; // ignore this and the rest. we won't find anything new. - for (iEvent eit=part->events()->begin(); eit!=part->events()->end(); eit++) + for (ciEvent eit=part->events().begin(); eit!=part->events().end(); eit++) { if (eit->first+part->tick() >= tick) break; if (eit->first > part->lenTick()) break; // ignore events past the end of the part @@ -1275,7 +1245,7 @@ int MidiTrack::getControllerChangeAtTick(unsigned tick, int ctrl, int def) Part* part=pit->second; if (part->tick() > tick) break; // ignore this and the rest. we'd find nothing any more if (part->endTick() < tick) continue; // ignore only this. - for (iEvent eit=part->events()->begin(); eit!=part->events()->end(); eit++) + for (ciEvent eit=part->events().begin(); eit!=part->events().end(); eit++) { if (eit->first+part->tick() > tick) break; // we won't find anything in this part from now on. if (eit->first > part->lenTick()) break; // ignore events past the end of the part @@ -1301,7 +1271,7 @@ unsigned MidiTrack::getControllerValueLifetime(unsigned tick, int ctrl) Part* part=pit->second; if (part->tick() > result) break; // ignore this and the rest. we won't find anything new. if (part->endTick() < tick) continue; // ignore only this part, we won't find anything there. - for (iEvent eit=part->events()->begin(); eit!=part->events()->end(); eit++) + for (ciEvent eit=part->events().begin(); eit!=part->events().end(); eit++) { if (eit->first+part->tick() >= result) break; if (eit->first > part->lenTick()) break; // ignore events past the end of the part diff --git a/muse2/muse/track.h b/muse2/muse/track.h index 664364ba..2e8f3af5 100644 --- a/muse2/muse/track.h +++ b/muse2/muse/track.h @@ -32,6 +32,7 @@ #include "wave.h" // for SndFileR #include "part.h" +#include "mpevent.h" #include "key.h" #include "node.h" #include "route.h" @@ -41,7 +42,6 @@ #include "controlfifo.h" namespace MusECore { -class MPEventList; class Pipeline; class PluginI; class SynthI; @@ -212,8 +212,11 @@ class MidiTrack : public Track { int _outChannel; bool _recEcho; // For midi (and audio). Whether to echo incoming record events to output device. - EventList* _events; // tmp Events during midi import - MPEventList* _mpevents; // tmp Events druring recording + public: + EventList events; // tmp Events during midi import + MPEventList mpevents; // tmp Events druring recording + + private: static bool _isVisible; clefTypes clefType; @@ -255,9 +258,6 @@ class MidiTrack : public Track { virtual bool setRecordFlag1(bool f) { _recordFlag = f; return true;} virtual void setRecordFlag2(bool) {} - EventList* events() const { return _events; } - MPEventList* mpevents() const { return _mpevents; } - virtual void read(Xml&); virtual void write(int, Xml&) const; diff --git a/muse2/muse/undo.cpp b/muse2/muse/undo.cpp index 5081f86c..747914e1 100644 --- a/muse2/muse/undo.cpp +++ b/muse2/muse/undo.cpp @@ -350,7 +350,7 @@ void Song::doUndo2() removeTrack2(i->track); updateFlags |= SC_TRACK_REMOVED; break; - case UndoOp::DeleteTrack: + case UndoOp::DeleteTrack: // FINDMICHJETZT FIXME TODO: DeletePart on all parts, only empty tracks may be deleted! this removes the necessarity of unchainTrackParts... insertTrack2(i->track, i->trackno); chainTrackParts(i->track, true); @@ -371,15 +371,14 @@ void Song::doUndo2() Part* part = i->part; removePart(part); updateFlags |= SC_PART_REMOVED; - i->part->events()->incARef(-1); - unchainClone(i->part); + Part* i->part->nextClone(); + i->part->unchainClone(); } break; case UndoOp::DeletePart: addPart(i->part); updateFlags |= SC_PART_INSERTED; - i->part->events()->incARef(1); - chainClone(i->part); + i->part->rechainClone(); break; case UndoOp::ModifyPartName: i->part->setName(i->_oldName); @@ -489,14 +488,12 @@ void Song::doRedo2() case UndoOp::AddPart: addPart(i->part); updateFlags |= SC_PART_INSERTED; - i->part->events()->incARef(1); - chainClone(i->part); + i->part->rechainClone(); break; case UndoOp::DeletePart: removePart(i->part); updateFlags |= SC_PART_REMOVED; - i->part->events()->incARef(-1); - unchainClone(i->part); + i->part->unchainClone(); break; case UndoOp::ModifyPartName: i->part->setName(i->_newName); @@ -612,7 +609,7 @@ UndoOp::UndoOp(UndoType type_, Part* part_, unsigned old_len_or_tick, unsigned n new_partlen_or_tick=new_len_or_tick; } -UndoOp::UndoOp(UndoType type_, Event& oev, Event& nev, Part* part_, bool doCtrls_, bool doClones_) +UndoOp::UndoOp(UndoType type_, const Event& oev, const Event& nev, Part* part_, bool doCtrls_, bool doClones_) { assert(type_==ModifyEvent); assert(part_); @@ -625,7 +622,7 @@ UndoOp::UndoOp(UndoType type_, Event& oev, Event& nev, Part* part_, bool doCtrls doClones = doClones_; } -UndoOp::UndoOp(UndoType type_, Event& nev, Part* part_, bool doCtrls_, bool doClones_) +UndoOp::UndoOp(UndoType type_, const Event& nev, Part* part_, bool doCtrls_, bool doClones_) { assert(type_==DeleteEvent || type_==AddEvent); assert(part_); diff --git a/muse2/muse/undo.h b/muse2/muse/undo.h index a0b9c935..570fd5ab 100644 --- a/muse2/muse/undo.h +++ b/muse2/muse/undo.h @@ -113,8 +113,8 @@ struct UndoOp { UndoOp(UndoType type, int n, Track* track); UndoOp(UndoType type, Part* part, unsigned old_len_or_tick=-1, unsigned new_len_or_tick=-1, bool doCtrls=false, bool doClones=false); // FIXME these bools are UNUSED!!. XTICKS! UndoOp(UndoType type, Part* part, const char* old_name, const char* new_name); - UndoOp(UndoType type, Event& oev, Event& nev, Part* part, bool doCtrls, bool doClones); - UndoOp(UndoType type, Event& nev, Part* part, bool doCtrls, bool doClones); + UndoOp(UndoType type, const Event& oev, const Event& nev, Part* part, bool doCtrls, bool doClones); + UndoOp(UndoType type, const Event& nev, Part* part, bool doCtrls, bool doClones); UndoOp(UndoType type, const char* changedFile, const char* changeData, int startframe, int endframe); UndoOp(UndoType type, Marker* copyMarker, Marker* realMarker); UndoOp(UndoType type, Track* track, const char* old_name, const char* new_name); diff --git a/muse2/muse/wave.cpp b/muse2/muse/wave.cpp index 8c647685..73e4d837 100644 --- a/muse2/muse/wave.cpp +++ b/muse2/muse/wave.cpp @@ -826,11 +826,11 @@ bool SndFile::checkCopyOnWrite() PartList* pl = (*it)->parts(); for(ciPart ip = pl->begin(); ip != pl->end(); ++ip) { - EventList* el = ip->second->events(); + const EventList& el = ip->second->events(); // We are looking for active independent non-clone parts - if(el->arefCount() > 1) + if(ip->second->hasClones()) continue; - for(ciEvent ie = el->begin(); ie != el->end(); ++ie) + for(ciEvent ie = el.begin(); ie != el.end(); ++ie) { if(ie->second.type() != Wave) continue; diff --git a/muse2/muse/waveedit/wavecanvas.cpp b/muse2/muse/waveedit/wavecanvas.cpp index 95ecd250..5bbe2f1f 100644 --- a/muse2/muse/waveedit/wavecanvas.cpp +++ b/muse2/muse/waveedit/wavecanvas.cpp @@ -79,7 +79,7 @@ namespace MusEGui { // WEvent //--------------------------------------------------------- -WEvent::WEvent(MusECore::Event& e, MusECore::Part* p, int height) : MusEGui::CItem(e, p) +WEvent::WEvent(const MusECore::Event& e, MusECore::Part* p, int height) : MusEGui::CItem(e, p) { unsigned frame = e.frame() + p->frame(); setPos(QPoint(frame, 0)); @@ -93,7 +93,7 @@ WEvent::WEvent(MusECore::Event& e, MusECore::Part* p, int height) : MusEGui::CIt // addItem //--------------------------------------------------------- -CItem* WaveCanvas::addItem(MusECore::Part* part, MusECore::Event& event) +CItem* WaveCanvas::addItem(MusECore::Part* part, const MusECore::Event& event) { if (signed(event.frame())<0) { printf("ERROR: trying to add event before current part!\n"); @@ -183,9 +183,8 @@ void WaveCanvas::songChanged(MusECore::SongChangedFlags_t flags) if (esample > endSample) endSample = esample; - MusECore::EventList* el = part->events(); - for (MusECore::iEvent i = el->begin(); i != el->end(); ++i) { - MusECore::Event e = i->second; + for (MusECore::ciEvent i = part->events().begin(); i != part->events().end(); ++i) { + const MusECore::Event& e = i->second; // Do not add events which are past the end of the part. if(e.frame() > len) break; @@ -578,9 +577,9 @@ void WaveCanvas::draw(QPainter& p, const QRect& r) if(ci->isSelected()) list4.push_back(ci); // Draw clone parts, and parts with hidden events, in front of others all except selected. - //else if(ci->event().empty() && (ci->part()->events()->arefCount() > 1 || ci->part()->cachedHasHiddenEvents())) + //else if(ci->event().empty() && (ci->part()->hasClones() || ci->part()->cachedHasHiddenEvents())) // Draw clone parts in front of others all except selected. - //else if(ci->event().empty() && (ci->part()->events()->arefCount() > 1)) + //else if(ci->event().empty() && ci->part()->hasClones()) // list3.push_back(ci); else // Draw unselected parts. @@ -1327,9 +1326,9 @@ MusECore::Undo WaveCanvas::moveCanvasItems(MusEGui::CItemList& items, int /*dp*/ MusECore::Part* opart = ip2c->first; if (opart->hasHiddenEvents()) { - forbidden=true; - break; - } + forbidden=true; + break; + } } @@ -1686,11 +1685,11 @@ void WaveCanvas::waveCmd(int cmd) if (part == 0) break; - MusECore::EventList* el = part->events(); + const MusECore::EventList& el = part->events(); MusECore::Undo operations; std::list elist; - for (MusECore::iEvent e = el->lower_bound(pos[0] - part->tick()); e != el->end(); ++e) + for (MusECore::ciEvent e = el.lower_bound(pos[0] - part->tick()); e != el.end(); ++e) elist.push_back((MusECore::Event)e->second); for (std::list::iterator i = elist.begin(); i != elist.end(); ++i) { MusECore::Event event = *i; @@ -1714,10 +1713,10 @@ void WaveCanvas::waveCmd(int cmd) break; MusECore::Undo operations; - MusECore::EventList* el = part->events(); + const MusECore::EventList& el = part->events(); std::list elist; - for (MusECore::iEvent e = el->lower_bound(pos[0]); e != el->end(); ++e) + for (MusECore::ciEvent e = el.lower_bound(pos[0]); e != el.end(); ++e) elist.push_back((MusECore::Event)e->second); for (std::list::iterator i = elist.begin(); i != elist.end(); ++i) { MusECore::Event event = *i; @@ -1927,11 +1926,11 @@ void WaveCanvas::cmd(int cmd) tempPart->setPos(MusEGlobal::song->lpos()); tempPart->setLenTick(MusEGlobal::song->rpos() - MusEGlobal::song->lpos()); // loop through the events and set them accordingly - for (MusECore::iEvent iWaveEvent = origPart->events()->begin(); iWaveEvent != origPart->events()->end(); iWaveEvent++) + for (MusECore::ciEvent iWaveEvent = origPart->events().begin(); iWaveEvent != origPart->events().end(); iWaveEvent++) { // TODO: handle multiple events correctly, // the math for subsequent events isn't correct - MusECore::Event &ev = iWaveEvent->second; + const MusECore::Event& ev = iWaveEvent->second; MusECore::Event *newEvent = new MusECore::Event(ev.clone()); newEvent->setSpos(ev.spos() + frameDistance); newEvent->setLenTick(MusEGlobal::song->rpos() - MusEGlobal::song->lpos()); @@ -1993,10 +1992,9 @@ MusECore::WaveSelectionList WaveCanvas::getSelection(unsigned startpos, unsigned MusECore::WavePart* wp = (MusECore::WavePart*)(ip->second); unsigned part_offset = wp->frame(); - MusECore::EventList* el = wp->events(); - //printf("eventlist length=%d\n",el->size()); + const MusECore::EventList& el = wp->events(); - for (MusECore::iEvent e = el->begin(); e != el->end(); ++e) { + for (MusECore::ciEvent e = el.begin(); e != el.end(); ++e) { MusECore::Event event = e->second; if (event.empty()) continue; diff --git a/muse2/muse/waveedit/wavecanvas.h b/muse2/muse/waveedit/wavecanvas.h index 10f75291..63979915 100644 --- a/muse2/muse/waveedit/wavecanvas.h +++ b/muse2/muse/waveedit/wavecanvas.h @@ -64,7 +64,7 @@ namespace MusEGui { class WEvent : public CItem { public: - WEvent(MusECore::Event& e, MusECore::Part* p, int height); + WEvent(const MusECore::Event& e, MusECore::Part* p, int height); }; //--------------------------------------------------------- @@ -124,7 +124,7 @@ class WaveCanvas : public EventCanvas { virtual void dragEnterEvent(QDragEnterEvent* event); virtual void dragMoveEvent(QDragMoveEvent*); virtual void dragLeaveEvent(QDragLeaveEvent*); - virtual CItem* addItem(MusECore::Part*, MusECore::Event&); + virtual CItem* addItem(MusECore::Part*, const MusECore::Event&); int y2pitch(int) const; int pitch2y(int) const; diff --git a/muse2/muse/waveedit/waveview.cpp b/muse2/muse/waveedit/waveview.cpp index 3e3ea057..2cb63dc5 100644 --- a/muse2/muse/waveedit/waveview.cpp +++ b/muse2/muse/waveedit/waveview.cpp @@ -119,9 +119,8 @@ void WaveView::pdraw(QPainter& p, const QRect& rr) int channels = wp->track()->channels(); int px = wp->frame(); - MusECore::EventList* el = wp->events(); - for (MusECore::iEvent e = el->begin(); e != el->end(); ++e) { - MusECore::Event event = e->second; + for (MusECore::ciEvent e = wp->events().begin(); e != wp->events().end(); ++e) { + const MusECore::Event event& = e->second; if (event.empty()) continue; MusECore::SndFileR f = event.sndFile(); diff --git a/muse2/muse/waveevent.h b/muse2/muse/waveevent.h index e814fe3d..e539342c 100644 --- a/muse2/muse/waveevent.h +++ b/muse2/muse/waveevent.h @@ -44,7 +44,7 @@ class WaveEventBase : public EventBase { int _spos; // start sample position in WaveFile bool deleted; - virtual EventBase* clone(); + virtual EventBase* clone() const; public: WaveEventBase(EventType t); diff --git a/muse2/muse/wavetrack.cpp b/muse2/muse/wavetrack.cpp index 363f8966..4faaca43 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(); @@ -205,7 +188,7 @@ void WaveTrack::read(Xml& xml) case Xml::TagStart: if (tag == "part") { Part* p = 0; - p = readXmlPart(xml, this); + p = Part::readFromXml(xml, this); if(p) parts()->add(p); } @@ -231,7 +214,7 @@ 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 = clone ? p->createNewClone() : new WavePart(this); if (p) { part->setName(p->name()); part->setColorIndex(p->colorIndex()); @@ -240,9 +223,6 @@ Part* WaveTrack::newPart(Part*p, bool clone) part->setMute(p->mute()); } - if(clone) - chainClone(p, part); - return part; } diff --git a/muse2/muse/widgets/utils.cpp b/muse2/muse/widgets/utils.cpp index ab1d74fd..0cb10a20 100644 --- a/muse2/muse/widgets/utils.cpp +++ b/muse2/muse/widgets/utils.cpp @@ -532,7 +532,7 @@ int get_paste_len() if (tag == "part") { Part* p = 0; - p = readXmlPart(xml, NULL, false, false); + p = Part::readFromXml(xml, NULL, false, false); if (p) { @@ -542,7 +542,7 @@ int get_paste_len() if (p->endTick() > end_tick) end_tick=p->endTick(); - unchainClone(p); + p->unchainClone(); delete p; } } -- cgit v1.2.3 From f4dfc97fd054142591d8302ab2008a446627c234 Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Thu, 22 Aug 2013 15:42:12 +0200 Subject: removed unused seq/audio-messages. more orphans --- muse2/muse/audio.cpp | 39 +--------- muse2/muse/audio.h | 32 +------- muse2/muse/midiseq.cpp | 22 ------ muse2/muse/seqmsg.cpp | 160 -------------------------------------- muse2/muse/widgets/mtrackinfo.cpp | 12 --- 5 files changed, 3 insertions(+), 262 deletions(-) (limited to 'muse2/muse/audio.cpp') diff --git a/muse2/muse/audio.cpp b/muse2/muse/audio.cpp index 914ff506..4eabe8ac 100644 --- a/muse2/muse/audio.cpp +++ b/muse2/muse/audio.cpp @@ -81,31 +81,21 @@ const char* seqMsgList[] = { "SEQM_ADD_PART", "SEQM_REMOVE_PART", "SEQM_ADD_EVENT", "SEQM_REMOVE_EVENT", "SEQM_CHANGE_EVENT", "SEQM_ADD_TEMPO", "SEQM_SET_TEMPO", "SEQM_REMOVE_TEMPO", "SEQM_ADD_SIG", "SEQM_REMOVE_SIG", + "SEQM_ADD_KEY", "SEQM_REMOVE_KEY", "SEQM_SET_GLOBAL_TEMPO", "SEQM_UNDO", "SEQM_REDO", "SEQM_RESET_DEVICES", "SEQM_INIT_DEVICES", "SEQM_PANIC", "SEQM_MIDI_LOCAL_OFF", - "SEQM_SET_MIDI_DEVICE", "SEQM_PLAY_MIDI_EVENT", "SEQM_SET_HW_CTRL_STATE", "SEQM_SET_HW_CTRL_STATES", - "SEQM_SET_TRACK_OUT_PORT", - "SEQM_SET_TRACK_OUT_CHAN", "SEQM_SET_TRACK_AUTO_TYPE", - "SEQM_REMAP_PORT_DRUM_CTL_EVS", - "SEQM_CHANGE_ALL_PORT_DRUM_CTL_EVS", - "SEQM_SCAN_ALSA_MIDI_PORTS", "SEQM_SET_AUX", "SEQM_UPDATE_SOLO_STATES", - //"MIDI_SHOW_INSTR_GUI", DELETETHIS - //"MIDI_SHOW_INSTR_NATIVE_GUI", DELETETHIS "AUDIO_RECORD", "AUDIO_ROUTEADD", "AUDIO_ROUTEREMOVE", "AUDIO_REMOVEROUTES", - //"AUDIO_VOL", "AUDIO_PAN", DELETETHIS "AUDIO_ADDPLUGIN", - "AUDIO_SET_SEG_SIZE", "AUDIO_SET_PREFADER", "AUDIO_SET_CHANNELS", - //"AUDIO_SET_PLUGIN_CTRL_VAL", DELETETHIS "AUDIO_SWAP_CONTROLLER_IDX", "AUDIO_CLEAR_CONTROLLER_EVENTS", "AUDIO_SEEK_PREV_AC_EVENT", @@ -688,17 +678,6 @@ void Audio::processMsg(AudioMsg* msg) MusEGlobal::midiLearnCtrl = -1; break; - case AUDIO_SET_SEG_SIZE: - MusEGlobal::segmentSize = msg->ival; - MusEGlobal::sampleRate = msg->iival; -#if 0 //TODO or DELETETHIS ? - audioOutput.MusEGlobal::segmentSizeChanged(); - for (int i = 0; i < mixerGroups; ++i) - audioGroups[i].MusEGlobal::segmentSizeChanged(); - for (iSynthI ii = synthiInstances.begin(); ii != synthiInstances.end();++ii) - (*ii)->MusEGlobal::segmentSizeChanged(); -#endif - break; case SEQM_RESET_DEVICES: for (int i = 0; i < MIDI_PORTS; ++i) @@ -735,16 +714,6 @@ void Audio::processMsg(AudioMsg* msg) port->setHwCtrlStates(msg->a, msg->b, msg->c, msg->ival); } break; - case SEQM_SCAN_ALSA_MIDI_PORTS: - alsaScanMidiPorts(); - break; - //DELETETHIS 6 - //case MIDI_SHOW_INSTR_GUI: - // MusEGlobal::midiSeq->msgUpdatePollFd(); - // break; - //case MIDI_SHOW_INSTR_NATIVE_GUI: - // MusEGlobal::midiSeq->msgUpdatePollFd(); - // break; case SEQM_ADD_TEMPO: case SEQM_REMOVE_TEMPO: case SEQM_SET_GLOBAL_TEMPO: @@ -762,12 +731,6 @@ void Audio::processMsg(AudioMsg* msg) frameOffset = syncFrame - samplePos; } break; - case SEQM_SET_TRACK_OUT_CHAN: - case SEQM_SET_TRACK_OUT_PORT: - case SEQM_REMAP_PORT_DRUM_CTL_EVS: - case SEQM_CHANGE_ALL_PORT_DRUM_CTL_EVS: - MusEGlobal::midiSeq->sendMsg(msg); - break; case SEQM_SET_TRACK_AUTO_TYPE: msg->track->setAutomationType(AutomationType(msg->ival)); diff --git a/muse2/muse/audio.h b/muse2/muse/audio.h index e8d22f78..4b81bb2a 100644 --- a/muse2/muse/audio.h +++ b/muse2/muse/audio.h @@ -70,27 +70,16 @@ enum { SEQM_UNDO, SEQM_REDO, SEQM_RESET_DEVICES, SEQM_INIT_DEVICES, SEQM_PANIC, SEQM_MIDI_LOCAL_OFF, - SEQM_SET_MIDI_DEVICE, SEQM_PLAY_MIDI_EVENT, SEQM_SET_HW_CTRL_STATE, SEQM_SET_HW_CTRL_STATES, - SEQM_SET_TRACK_OUT_PORT, - SEQM_SET_TRACK_OUT_CHAN, SEQM_SET_TRACK_AUTO_TYPE, - SEQM_REMAP_PORT_DRUM_CTL_EVS, - SEQM_CHANGE_ALL_PORT_DRUM_CTL_EVS, - SEQM_SCAN_ALSA_MIDI_PORTS, SEQM_SET_AUX, SEQM_UPDATE_SOLO_STATES, - //MIDI_SHOW_INSTR_GUI, DELETETHIS - //MIDI_SHOW_INSTR_NATIVE_GUI, DELETETHIS AUDIO_RECORD, AUDIO_ROUTEADD, AUDIO_ROUTEREMOVE, AUDIO_REMOVEROUTES, - //AUDIO_VOL, AUDIO_PAN, DELETETHIS AUDIO_ADDPLUGIN, - AUDIO_SET_SEG_SIZE, AUDIO_SET_PREFADER, AUDIO_SET_CHANNELS, - //AUDIO_SET_PLUGIN_CTRL_VAL, DELETETHIS AUDIO_SWAP_CONTROLLER_IDX, AUDIO_CLEAR_CONTROLLER_EVENTS, AUDIO_SEEK_PREV_AC_EVENT, @@ -240,19 +229,16 @@ class Audio { void msgAddEvent(Event&, Part*, bool u = true, bool doCtrls = true, bool doClones = false); void msgDeleteEvent(Event&, Part*, bool u = true, bool doCtrls = true, bool doClones = false); void msgChangeEvent(Event&, Event&, Part*, bool u = true, bool doCtrls = true, bool doClones = false); - void msgScanAlsaMidiPorts(); void msgAddTempo(int tick, int tempo, bool doUndoFlag = true); void msgSetTempo(int tick, int tempo, bool doUndoFlag = true); + void msgDeleteTempo(int tick, int tempo, bool doUndoFlag = true); void msgUpdateSoloStates(); void msgSetAux(AudioTrack*, int, double); void msgSetGlobalTempo(int val); - void msgDeleteTempo(int tick, int tempo, bool doUndoFlag = true); void msgAddSig(int tick, int z, int n, bool doUndoFlag = true); void msgRemoveSig(int tick, int z, int n, bool doUndoFlag = true); void msgAddKey(int tick, int key, bool doUndoFlag = true); void msgRemoveKey(int tick, int key, bool doUndoFlag = true); - //void msgShowInstrumentGui(MidiInstrument*, bool); DELETETHIS - //void msgShowInstrumentNativeGui(MidiInstrument*, bool); DELETETHIS void msgPanic(); void sendMsg(AudioMsg*); bool sendMessage(AudioMsg* m, bool doUndo); @@ -263,15 +249,8 @@ class Audio { void msgAddRoute(Route, Route); void msgAddRoute1(Route, Route); void msgAddPlugin(AudioTrack*, int idx, PluginI* plugin); - void msgSetMute(AudioTrack*, bool val); - //void msgSetVolume(AudioTrack*, double val); DELETETHIS - //void msgSetPan(AudioTrack*, double val); DELETETHIS - void msgAddSynthI(SynthI* synth); - void msgRemoveSynthI(SynthI* synth); - void msgSetSegSize(int, int); void msgSetPrefader(AudioTrack*, int); void msgSetChannels(AudioTrack*, int); - void msgSetOff(AudioTrack*, bool); void msgSetRecord(AudioTrack*, bool); void msgUndo(); void msgRedo(); @@ -280,7 +259,6 @@ class Audio { void msgResetMidiDevices(); void msgIdle(bool); void msgBounce(); - //void msgSetPluginCtrlVal(AudioTrack*, int /*param*/, double /*val*/); DELETETHIS void msgSwapControllerIDX(AudioTrack*, int, int); void msgClearControllerEvents(AudioTrack*, int); void msgSeekPrevACEvent(AudioTrack*, int); @@ -292,17 +270,11 @@ class Audio { void msgSetSolo(Track*, bool); void msgSetHwCtrlState(MidiPort*, int, int, int); void msgSetHwCtrlStates(MidiPort*, int, int, int, int); - void msgSetTrackOutChannel(MidiTrack*, int); - void msgSetTrackOutPort(MidiTrack*, int); void msgSetTrackAutomationType(Track*, int); - void msgRemapPortDrumCtlEvents(int, int, int, int); - void msgChangeAllPortDrumCtrlEvents(bool, bool); void msgSetSendMetronome(AudioTrack*, bool); void msgStartMidiLearn(); - void msgPlayMidiEvent(const MidiPlayEvent* event); - void rescanAlsaPorts(); - + void midiPortsChanged(); const Pos& pos() const { return _pos; } diff --git a/muse2/muse/midiseq.cpp b/muse2/muse/midiseq.cpp index a2cb5c35..f6463d59 100644 --- a/muse2/muse/midiseq.cpp +++ b/muse2/muse/midiseq.cpp @@ -99,28 +99,6 @@ void MidiSeq::processMsg(const ThreadMsg* m) break; - case MusECore::SEQM_SET_TRACK_OUT_CHAN: - { - MidiTrack* track = (MidiTrack*)(msg->p1); - track->setOutChanAndUpdate(msg->a); - } - break; - case MusECore::SEQM_SET_TRACK_OUT_PORT: - { - MidiTrack* track = (MidiTrack*)(msg->p1); - track->setOutPortAndUpdate(msg->a); - } - break; - case MusECore::SEQM_REMAP_PORT_DRUM_CTL_EVS: - MusEGlobal::song->remapPortDrumCtrlEvents(msg->ival, msg->a, msg->b, msg->c); - break; - case MusECore::SEQM_CHANGE_ALL_PORT_DRUM_CTL_EVS: - MusEGlobal::song->changeAllPortDrumCtrlEvents((bool)msg->a, (bool)msg->b); - break; - case MusECore::SEQM_SET_MIDI_DEVICE: - ((MidiPort*)(msg->p1))->setMidiDevice((MidiDevice*)(msg->p2)); - updatePollFd(); - break; case MusECore::SEQM_IDLE: idle = msg->a; break; diff --git a/muse2/muse/seqmsg.cpp b/muse2/muse/seqmsg.cpp index 61714b98..4a51e7ce 100644 --- a/muse2/muse/seqmsg.cpp +++ b/muse2/muse/seqmsg.cpp @@ -319,38 +319,6 @@ void Audio::msgSetRecord(AudioTrack* node, bool val) sendMsg(&msg); } -/* DELETETHIS 34 -//--------------------------------------------------------- -// msgSetVolume -//--------------------------------------------------------- - -void Audio::msgSetVolume(AudioTrack* src, double val) - { - AudioMsg msg; - msg.id = AUDIO_VOL; - msg.snode = src; - msg.dval = val; - sendMsg(&msg); - //muse->arranger->controllerChanged(src); - MusEGlobal::song->controllerChange(src); - } - -//--------------------------------------------------------- -// msgSetPan -//--------------------------------------------------------- - -void Audio::msgSetPan(AudioTrack* node, double val) - { - AudioMsg msg; - msg.id = AUDIO_PAN; - msg.snode = node; - msg.dval = val; - sendMsg(&msg); - //muse->arranger->controllerChanged(node); - MusEGlobal::song->controllerChange(node); - } -*/ - //--------------------------------------------------------- // msgSetPrefader //--------------------------------------------------------- @@ -492,26 +460,6 @@ void Audio::msgSetChannels(AudioTrack* node, int n) sendMsg(&msg); } -/* DELETETHIS 20 -//--------------------------------------------------------- -// msgSetPluginCtrlVal -//--------------------------------------------------------- - -void Audio::msgSetPluginCtrlVal(AudioTrack* track, int param, double val) -{ - AudioMsg msg; - - msg.id = AUDIO_SET_PLUGIN_CTRL_VAL; - msg.ival = param; - msg.dval = val; - //msg.plugin = plugin; - msg.snode = track; - sendMsg(&msg); - //muse->arranger->controllerChanged(track); - MusEGlobal::song->controllerChange(track); -} -*/ - //--------------------------------------------------------- // msgSwapControllerIDX //--------------------------------------------------------- @@ -646,18 +594,6 @@ void Audio::msgSetSolo(Track* track, bool val) sendMsg(&msg); } -//--------------------------------------------------------- -// msgSetSegSize -//--------------------------------------------------------- - -void Audio::msgSetSegSize(int bs, int sr) - { - AudioMsg msg; - msg.id = AUDIO_SET_SEG_SIZE; - msg.ival = bs; - msg.iival = sr; - sendMsg(&msg); - } //--------------------------------------------------------- // msgSeek @@ -714,38 +650,6 @@ void Audio::msgPlay(bool val) } } -/* DELETETHIS 31 -//--------------------------------------------------------- -// msgShowInstrumentGui -//--------------------------------------------------------- - -void Audio::msgShowInstrumentGui(MidiInstrument* instr, bool val) - { - instr->showGui(val); - // No need for this - it called msgUpdatePollFd which has nothing - // to do with showing a gui. - //AudioMsg msg; - //msg.id = MIDI_SHOW_INSTR_GUI; - //msg.p1 = instr; - //msg.a = val; - //sendMessage(&msg, false); - } - -//--------------------------------------------------------- -// msgShowInstrumentNativeGui -//--------------------------------------------------------- - -void Audio::msgShowInstrumentNativeGui(MidiInstrument* instr, bool val) - { - instr->showNativeGui(val); - //AudioMsg msg; - //msg.id = MIDI_SHOW_INSTR_NATIVE_GUI; - //msg.p1 = instr; - //msg.a = val; - //sendMessage(&msg, false); - } -*/ - //--------------------------------------------------------- // msgAddTrack //--------------------------------------------------------- @@ -1075,16 +979,6 @@ void Audio::msgRemoveKey(int tick, int key, bool doUndoFlag) sendMessage(&msg, doUndoFlag); } -//--------------------------------------------------------- -// msgScanAlsaMidiPorts -//--------------------------------------------------------- - -void Audio::msgScanAlsaMidiPorts() - { - AudioMsg msg; - msg.id = SEQM_SCAN_ALSA_MIDI_PORTS; - sendMessage(&msg, false); - } //--------------------------------------------------------- // msgResetMidiDevices @@ -1269,32 +1163,6 @@ void Audio::msgSetHwCtrlStates(MidiPort* port, int ch, int ctrl, int val, int la sendMessage(&msg, false); } -//--------------------------------------------------------- -// msgSetTrackOutChannel -//--------------------------------------------------------- - -void Audio::msgSetTrackOutChannel(MidiTrack* track, int ch) -{ - AudioMsg msg; - msg.id = SEQM_SET_TRACK_OUT_CHAN; - msg.p1 = track; - msg.a = ch; - sendMessage(&msg, false); -} - -//--------------------------------------------------------- -// msgSetTrackOutPort -//--------------------------------------------------------- - -void Audio::msgSetTrackOutPort(MidiTrack* track, int port) -{ - AudioMsg msg; - msg.id = SEQM_SET_TRACK_OUT_PORT; - msg.p1 = track; - msg.a = port; - sendMessage(&msg, false); -} - //--------------------------------------------------------- // msgSetTrackAutomationType //--------------------------------------------------------- @@ -1308,34 +1176,6 @@ void Audio::msgSetTrackAutomationType(Track* track, int type) sendMessage(&msg, false); } -//--------------------------------------------------------- -// msgRemapPortDrumCtlEvents -//--------------------------------------------------------- - -void Audio::msgRemapPortDrumCtlEvents(int mapidx, int newnote, int newchan, int newport) -{ - AudioMsg msg; - msg.id = SEQM_REMAP_PORT_DRUM_CTL_EVS; - msg.ival = mapidx; - msg.a = newnote; - msg.b = newchan; - msg.c = newport; - sendMessage(&msg, false); -} - -//--------------------------------------------------------- -// msgChangeAllPortDrumCtlEvents -//--------------------------------------------------------- - -void Audio::msgChangeAllPortDrumCtrlEvents(bool add, bool drumonly) -{ - AudioMsg msg; - msg.id = SEQM_CHANGE_ALL_PORT_DRUM_CTL_EVS; - msg.a = (int)add; - msg.b = (int)drumonly; - sendMessage(&msg, false); -} - //--------------------------------------------------------- // msgSetSendMetronome //--------------------------------------------------------- diff --git a/muse2/muse/widgets/mtrackinfo.cpp b/muse2/muse/widgets/mtrackinfo.cpp index 09d45577..a73eb212 100644 --- a/muse2/muse/widgets/mtrackinfo.cpp +++ b/muse2/muse/widgets/mtrackinfo.cpp @@ -682,18 +682,11 @@ void MidiTrackInfo::iOutputChannelChanged(int channel) MusECore::MidiTrack* track = (MusECore::MidiTrack*)selected; if (channel != track->outChannel()) { ++_blockHeartbeatCount; - // Changed by T356. - //track->setOutChannel(channel); MusEGlobal::audio->msgIdle(true); - //audio->msgSetTrackOutChannel(track, channel); track->setOutChanAndUpdate(channel); MusEGlobal::audio->msgIdle(false); - // may result in adding/removing mixer strip: - //MusEGlobal::song->update(-1); - //MusEGlobal::song->update(SC_MIDI_TRACK_PROP); MusEGlobal::audio->msgUpdateSoloStates(); // p4.0.14 - //MusEGlobal::song->update(SC_MIDI_TRACK_PROP | SC_ROUTE); // MusEGlobal::song->update(SC_MIDI_TRACK_PROP); // --_blockHeartbeatCount; } @@ -714,16 +707,11 @@ void MidiTrackInfo::iOutputPortChanged(int index) if (port_num == track->outPort()) return; ++_blockHeartbeatCount; - // Changed by T356. - //track->setOutPort(port_num); MusEGlobal::audio->msgIdle(true); - //audio->msgSetTrackOutPort(track, port_num); track->setOutPortAndUpdate(port_num); MusEGlobal::audio->msgIdle(false); - //MusEGlobal::song->update(SC_MIDI_TRACK_PROP); MusEGlobal::audio->msgUpdateSoloStates(); // p4.0.14 - //MusEGlobal::song->update(SC_MIDI_TRACK_PROP | SC_ROUTE); // MusEGlobal::song->update(SC_MIDI_TRACK_PROP); // --_blockHeartbeatCount; } -- cgit v1.2.3 From 2f26bcd6a94124721d8c946f55d3f360147f1f58 Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Sun, 1 Sep 2013 11:55:38 +0200 Subject: applyOperationGroup is no more a hack :) --- muse2/muse/audio.cpp | 2 +- muse2/muse/audio.h | 9 ++++-- muse2/muse/seqmsg.cpp | 39 ++++++++++++++--------- muse2/muse/song.cpp | 34 +++++++++++++++------ muse2/muse/song.h | 14 ++++----- muse2/muse/undo.cpp | 85 +++++++++++++++++++-------------------------------- muse2/muse/undo.h | 2 ++ 7 files changed, 97 insertions(+), 88 deletions(-) (limited to 'muse2/muse/audio.cpp') diff --git a/muse2/muse/audio.cpp b/muse2/muse/audio.cpp index 4eabe8ac..f7caa6a0 100644 --- a/muse2/muse/audio.cpp +++ b/muse2/muse/audio.cpp @@ -83,7 +83,7 @@ const char* seqMsgList[] = { "SEQM_ADD_TEMPO", "SEQM_SET_TEMPO", "SEQM_REMOVE_TEMPO", "SEQM_ADD_SIG", "SEQM_REMOVE_SIG", "SEQM_ADD_KEY", "SEQM_REMOVE_KEY", "SEQM_SET_GLOBAL_TEMPO", - "SEQM_UNDO", "SEQM_REDO", + "SEQM_REVERT_OPERATION_GROUP", "SEQM_EXECUTE_OPERATION_GROUP", "SEQM_RESET_DEVICES", "SEQM_INIT_DEVICES", "SEQM_PANIC", "SEQM_MIDI_LOCAL_OFF", "SEQM_PLAY_MIDI_EVENT", diff --git a/muse2/muse/audio.h b/muse2/muse/audio.h index 4b81bb2a..044760ac 100644 --- a/muse2/muse/audio.h +++ b/muse2/muse/audio.h @@ -52,6 +52,7 @@ class Part; class PluginI; class SynthI; class Track; +class Undo; //--------------------------------------------------------- // AudioMsgId @@ -67,7 +68,7 @@ enum { SEQM_ADD_TEMPO, SEQM_SET_TEMPO, SEQM_REMOVE_TEMPO, SEQM_ADD_SIG, SEQM_REMOVE_SIG, SEQM_ADD_KEY, SEQM_REMOVE_KEY, SEQM_SET_GLOBAL_TEMPO, - SEQM_UNDO, SEQM_REDO, + SEQM_REVERT_OPERATION_GROUP, SEQM_EXECUTE_OPERATION_GROUP, SEQM_RESET_DEVICES, SEQM_INIT_DEVICES, SEQM_PANIC, SEQM_MIDI_LOCAL_OFF, SEQM_PLAY_MIDI_EVENT, @@ -121,6 +122,7 @@ struct AudioMsg : public ThreadMsg { // this should be an union char port, channel, ctrl; int a, b, c; Pos pos; + Undo* operations; }; class AudioOutput; @@ -221,6 +223,9 @@ class Audio { void msgSeek(const Pos&); void msgPlay(bool val); + void msgExecuteOperationGroup(Undo&); // calls exe1, then calls exe2 in audio context, then calls exe3 + void msgRevertOperationGroup(Undo&); // similar. + void msgRemoveTrack(Track*, bool u = true); void msgRemoveTracks(); void msgMoveTrack(int idx1, int dx2, bool u = true); @@ -252,8 +257,6 @@ class Audio { void msgSetPrefader(AudioTrack*, int); void msgSetChannels(AudioTrack*, int); void msgSetRecord(AudioTrack*, bool); - void msgUndo(); - void msgRedo(); void msgLocalOff(); void msgInitMidiDevices(bool force = true); void msgResetMidiDevices(); diff --git a/muse2/muse/seqmsg.cpp b/muse2/muse/seqmsg.cpp index 4a51e7ce..3b914fda 100644 --- a/muse2/muse/seqmsg.cpp +++ b/muse2/muse/seqmsg.cpp @@ -606,26 +606,37 @@ void Audio::msgSeek(const Pos& pos) } //--------------------------------------------------------- -// msgUndo +// msgExecuteOperationGroup //--------------------------------------------------------- -void Audio::msgUndo() - { - AudioMsg msg; - msg.id = SEQM_UNDO; - sendMsg(&msg); - } +void Audio::msgExecuteOperationGroup(Undo& operations) +{ + MusEGlobal::song->executeOperationGroup1(operations); + + AudioMsg msg; + msg.id = SEQM_EXECUTE_OPERATION_GROUP; + msg.operations=&operations; + sendMsg(&msg); + + MusEGlobal::song->executeOperationGroup3(operations); +} //--------------------------------------------------------- -// msgRedo +// msgRevertOperationGroup //--------------------------------------------------------- -void Audio::msgRedo() - { - AudioMsg msg; - msg.id = SEQM_REDO; - sendMsg(&msg); - } +void Audio::msgRevertOperationGroup(Undo& operations) +{ + MusEGlobal::song->revertOperationGroup1(operations); + + + AudioMsg msg; + msg.id = SEQM_REVERT_OPERATION_GROUP; + msg.operations=&operations; + sendMsg(&msg); + + MusEGlobal::song->revertOperationGroup3(operations); +} //--------------------------------------------------------- // msgPlay diff --git a/muse2/muse/song.cpp b/muse2/muse/song.cpp index 3cf1960d..e18dfc01 100644 --- a/muse2/muse/song.cpp +++ b/muse2/muse/song.cpp @@ -1756,10 +1756,16 @@ void Song::endMsgCmd() void Song::undo() { updateFlags = 0; - if (doUndo1()) + + Undo& opGroup = undoList->back(); + + if (opGroup.empty()) return; - MusEGlobal::audio->msgUndo(); - doUndo3(); + + MusEGlobal::audio->msgRevertOperationGroup(opGroup); + + undoList->pop_back(); + MusEGlobal::redoAction->setEnabled(true); MusEGlobal::undoAction->setEnabled(!undoList->empty()); setUndoRedoText(); @@ -1768,6 +1774,7 @@ void Song::undo() MusEGlobal::audio->msgUpdateSoloStates(); emit songChanged(updateFlags); + emit sigDirty(); } //--------------------------------------------------------- @@ -1777,10 +1784,16 @@ void Song::undo() void Song::redo() { updateFlags = 0; - if (doRedo1()) + + Undo& opGroup = redoList->back(); + + if (opGroup.empty()) return; - MusEGlobal::audio->msgRedo(); - doRedo3(); + + MusEGlobal::audio->msgExecuteOperationGroup(opGroup); + + redoList->pop_back(); + MusEGlobal::undoAction->setEnabled(true); MusEGlobal::redoAction->setEnabled(!redoList->empty()); setUndoRedoText(); @@ -1789,6 +1802,7 @@ void Song::redo() MusEGlobal::audio->msgUpdateSoloStates(); emit songChanged(updateFlags); + emit sigDirty(); } //--------------------------------------------------------- @@ -1802,11 +1816,11 @@ void Song::processMsg(AudioMsg* msg) case SEQM_UPDATE_SOLO_STATES: updateSoloStates(); break; - case SEQM_UNDO: - doUndo2(); + case SEQM_EXECUTE_OPERATION_GROUP: + executeOperationGroup2(*msg->operations); break; - case SEQM_REDO: - doRedo2(); + case SEQM_REVERT_OPERATION_GROUP: + revertOperationGroup2(*msg->operations); break; case SEQM_MOVE_TRACK: if (msg->a > msg->b) { diff --git a/muse2/muse/song.h b/muse2/muse/song.h index bc1aa9a1..c62f1c08 100644 --- a/muse2/muse/song.h +++ b/muse2/muse/song.h @@ -356,7 +356,7 @@ class Song : public QObject { void updateSoloStates(); //----------------------------------------- - // undo, redo + // undo, redo, operation groups //----------------------------------------- void startUndo(); @@ -364,12 +364,12 @@ class Song : public QObject { void undoOp(UndoOp::UndoType type, const char* changedFile, const char* changeData, int startframe, int endframe); - bool doUndo1(); - void doUndo2(); - void doUndo3(); - bool doRedo1(); - void doRedo2(); - void doRedo3(); + void executeOperationGroup1(Undo& operations); + void executeOperationGroup2(Undo& operations); + void executeOperationGroup3(Undo& operations); + void revertOperationGroup1(Undo& operations); + void revertOperationGroup2(Undo& operations); + void revertOperationGroup3(Undo& operations); void addUndo(UndoOp i); void setUndoRedoText(); diff --git a/muse2/muse/undo.cpp b/muse2/muse/undo.cpp index fdb24dad..6d22d440 100644 --- a/muse2/muse/undo.cpp +++ b/muse2/muse/undo.cpp @@ -211,9 +211,9 @@ void UndoList::clearDelete() void Song::startUndo() { redoList->clearDelete(); // redo must be invalidated when a new undo is started - MusEGlobal::redoAction->setEnabled(false); + MusEGlobal::redoAction->setEnabled(false); setUndoRedoText(); - + undoList->push_back(Undo()); updateFlags = 0; undoMode = true; @@ -355,23 +355,19 @@ bool Song::applyOperationGroup(Undo& group, bool doUndo) if (!group.empty()) { prepareOperationGroup(group); - //this is a HACK! but it works :) (added by flo93) - redoList->push_back(group); - redo(); - if (!doUndo) - { - undoList->pop_back(); - MusEGlobal::undoAction->setEnabled(!undoList->empty()); - setUndoRedoText(); - } - else - { - redoList->clearDelete(); // redo must be invalidated when a new undo is started - MusEGlobal::redoAction->setEnabled(false); - setUndoRedoText(); - } + if (doUndo) + startUndo(); + + MusEGlobal::audio->msgExecuteOperationGroup(group); + + // append all elements from "group" to the end of undoList->back(). + Undo& curUndo = undoList->back(); + curUndo.insert(curUndo.end(), group.begin(), group.end()); + if (doUndo) + endUndo(0); + return doUndo; } else @@ -381,14 +377,13 @@ bool Song::applyOperationGroup(Undo& group, bool doUndo) //--------------------------------------------------------- -// doUndo2 +// revertOperationGroup2 // real time part //--------------------------------------------------------- -void Song::doUndo2() +void Song::revertOperationGroup2(Undo& operations) { - Undo& u = undoList->back(); - for (riUndoOp i = u.rbegin(); i != u.rend(); ++i) { + for (riUndoOp i = operations.rbegin(); i != operations.rend(); ++i) { Track* editable_track = const_cast(i->track); // uncomment if needed Track* editable_property_track = const_cast(i->_propertyTrack); Part* editable_part = const_cast(i->part); @@ -503,13 +498,12 @@ void Song::doUndo2() } //--------------------------------------------------------- -// Song::doRedo2 +// Song::executeOperationGroup2 //--------------------------------------------------------- -void Song::doRedo2() +void Song::executeOperationGroup2(Undo& operations) { - Undo& u = redoList->back(); - for (iUndoOp i = u.begin(); i != u.end(); ++i) { + for (iUndoOp i = operations.begin(); i != operations.end(); ++i) { Track* editable_track = const_cast(i->track); // uncomment if needed Track* editable_property_track = const_cast(i->_propertyTrack); Part* editable_part = const_cast(i->part); @@ -789,17 +783,14 @@ void Song::addUndo(UndoOp i) } //--------------------------------------------------------- -// doUndo1 +// revertOperationGroup1 // non realtime context // return true if nothing to do //--------------------------------------------------------- -bool Song::doUndo1() +void Song::revertOperationGroup1(Undo& operations) { - if (undoList->empty()) - return true; - Undo& u = undoList->back(); - for (riUndoOp i = u.rbegin(); i != u.rend(); ++i) { + for (riUndoOp i = operations.rbegin(); i != operations.rend(); ++i) { Track* editable_track = const_cast(i->track); Track* editable_property_track = const_cast(i->_propertyTrack); Part* editable_part = const_cast(i->part); @@ -886,18 +877,17 @@ bool Song::doUndo1() break; } } - return false; + return; } //--------------------------------------------------------- -// doUndo3 +// revertOperationGroup3 // non realtime context //--------------------------------------------------------- -void Song::doUndo3() +void Song::revertOperationGroup3(Undo& operations) { - Undo& u = undoList->back(); - for (riUndoOp i = u.rbegin(); i != u.rend(); ++i) { + for (riUndoOp i = operations.rbegin(); i != operations.rend(); ++i) { Track* editable_track = const_cast(i->track); // uncomment if needed Track* editable_property_track = const_cast(i->_propertyTrack); // uncomment if needed Part* editable_part = const_cast(i->part); @@ -926,23 +916,17 @@ void Song::doUndo3() break; } } - redoList->push_back(u); // put item on redo list - undoList->pop_back(); - emit sigDirty(); } //--------------------------------------------------------- -// doRedo1 +// executeOperationGroup1 // non realtime context // return true if nothing to do //--------------------------------------------------------- -bool Song::doRedo1() +void Song::executeOperationGroup1(Undo& operations) { - if (redoList->empty()) - return true; - Undo& u = redoList->back(); - for (iUndoOp i = u.begin(); i != u.end(); ++i) { + for (iUndoOp i = operations.begin(); i != operations.end(); ++i) { Track* editable_track = const_cast(i->track); Track* editable_property_track = const_cast(i->_propertyTrack); Part* editable_part = const_cast(i->part); @@ -1025,18 +1009,16 @@ bool Song::doRedo1() break; } } - return false; } //--------------------------------------------------------- -// doRedo3 +// executeOperationGroup3 // non realtime context //--------------------------------------------------------- -void Song::doRedo3() +void Song::executeOperationGroup3(Undo& operations) { - Undo& u = redoList->back(); - for (iUndoOp i = u.begin(); i != u.end(); ++i) { + for (iUndoOp i = operations.begin(); i != operations.end(); ++i) { Track* editable_track = const_cast(i->track); // uncomment if needed Track* editable_property_track = const_cast(i->_propertyTrack); // uncomment if needed Part* editable_part = const_cast(i->part); @@ -1064,9 +1046,6 @@ void Song::doRedo3() break; } } - undoList->push_back(u); // put item on undo list - redoList->pop_back(); - emit sigDirty(); } diff --git a/muse2/muse/undo.h b/muse2/muse/undo.h index f0bf35fc..f27dbcc3 100644 --- a/muse2/muse/undo.h +++ b/muse2/muse/undo.h @@ -132,6 +132,8 @@ class Undo : public std::list { typedef Undo::iterator iUndoOp; typedef Undo::reverse_iterator riUndoOp; +typedef Undo::const_iterator ciUndoOp; +typedef Undo::const_reverse_iterator criUndoOp; class UndoList : public std::list { protected: -- cgit v1.2.3 From 5043dec335ff43074e0cb7ece5d0635d2f430d4e Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Sun, 1 Sep 2013 15:47:38 +0200 Subject: replaced some SEQM_... by OpGroups. Cleanup. --- muse2/muse/arranger/arrangerview.cpp | 4 +- muse2/muse/arranger/pcanvas.cpp | 9 +- muse2/muse/arranger/tlist.cpp | 23 +--- muse2/muse/audio.cpp | 6 +- muse2/muse/audio.h | 26 ++--- muse2/muse/functions.cpp | 79 +++++++++++++ muse2/muse/functions.h | 3 + muse2/muse/midiedit/dcanvas.cpp | 11 +- muse2/muse/mixer/strip.cpp | 6 +- muse2/muse/part.cpp | 156 +++---------------------- muse2/muse/seqmsg.cpp | 119 ++----------------- muse2/muse/song.cpp | 217 +---------------------------------- muse2/muse/song.h | 33 ++---- muse2/muse/synth.cpp | 6 +- muse2/muse/wave.cpp | 5 +- 15 files changed, 159 insertions(+), 544 deletions(-) (limited to 'muse2/muse/audio.cpp') diff --git a/muse2/muse/arranger/arrangerview.cpp b/muse2/muse/arranger/arrangerview.cpp index 7974369a..ecedd968 100644 --- a/muse2/muse/arranger/arrangerview.cpp +++ b/muse2/muse/arranger/arrangerview.cpp @@ -519,14 +519,14 @@ void ArrangerView::cmd(int cmd) arranger->cmd(Arranger::CMD_INSERT_EMPTYMEAS); break; case CMD_DELETE: - if (!MusEGlobal::song->msgRemoveParts()) //automatically does undo if neccessary and returns true then + if (!MusECore::delete_selected_parts()) { QMessageBox::StandardButton btn = QMessageBox::warning( this,tr("Remove track(s)"),tr("Are you sure you want to remove this track(s)?"), QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Ok); if (btn == QMessageBox::Cancel) - break; //msgRemoveParts() returned false -> no parts to remove? + break; MusEGlobal::song->startUndo(); MusEGlobal::audio->msgRemoveTracks(); //TODO FINDME this could still be speeded up! MusEGlobal::song->endUndo(SC_TRACK_REMOVED); diff --git a/muse2/muse/arranger/pcanvas.cpp b/muse2/muse/arranger/pcanvas.cpp index a280d58b..57645a97 100644 --- a/muse2/muse/arranger/pcanvas.cpp +++ b/muse2/muse/arranger/pcanvas.cpp @@ -668,12 +668,11 @@ bool PartCanvas::deleteItem(CItem* i) void PartCanvas::splitItem(CItem* item, const QPoint& pt) { NPart* np = (NPart*) item; - MusECore::Track* t = np->track(); MusECore::Part* p = np->part(); int x = pt.x(); if (x < 0) x = 0; - MusEGlobal::song->cmdSplitPart(t, p, AL::sigmap.raster(x, *_raster)); + split_part(p,AL::sigmap.raster(x, *_raster)); } //--------------------------------------------------------- @@ -683,9 +682,7 @@ void PartCanvas::splitItem(CItem* item, const QPoint& pt) void PartCanvas::glueItem(CItem* item) { NPart* np = (NPart*) item; - MusECore::Track* t = np->track(); - MusECore::Part* p = np->part(); - MusEGlobal::song->cmdGluePart(t, p); + merge_with_next_part(np->part()); } //--------------------------------------------------------- @@ -1116,7 +1113,7 @@ void PartCanvas::keyPress(QKeyEvent* event) if (getCurrentDrag()) return; - MusEGlobal::song->msgRemoveParts(); + MusECore::delete_selected_parts(); return; } else if (key == shortcuts[SHRT_POS_DEC].key) { diff --git a/muse2/muse/arranger/tlist.cpp b/muse2/muse/arranger/tlist.cpp index b27a48e1..7ebcad4d 100644 --- a/muse2/muse/arranger/tlist.cpp +++ b/muse2/muse/arranger/tlist.cpp @@ -75,6 +75,8 @@ #include "dssihost.h" #endif +using MusECore::UndoOp; + namespace MusEGui { static const int MIN_TRACKHEIGHT = 20; @@ -599,13 +601,10 @@ void TList::returnPressed() } } - MusEGlobal::song->startUndo(); - MusEGlobal::song->addUndo(MusECore::UndoOp(MusECore::UndoOp::ModifyTrackName, + MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::ModifyTrackName, editTrack, editTrack->name().toLatin1().constData(), editor->text().toLatin1().constData())); - editTrack->setName(editor->text()); - MusEGlobal::song->endUndo(-1); //uagh, why "-1", why no proper flags? } } @@ -640,16 +639,10 @@ void TList::chanValueFinished() channel = 0; if(channel != mt->outChannel()) { - MusEGlobal::song->startUndo(); - MusEGlobal::song->addUndo(MusECore::UndoOp(MusECore::UndoOp::ModifyTrackChannel, + MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::ModifyTrackChannel, editTrack, mt->outChannel(), channel)); - MusEGlobal::audio->msgIdle(true); - mt->setOutChanAndUpdate(channel); - MusEGlobal::audio->msgIdle(false); - MusEGlobal::audio->msgUpdateSoloStates(); - MusEGlobal::song->endUndo(SC_MIDI_TRACK_PROP); } } } @@ -667,13 +660,10 @@ void TList::chanValueFinished() n = 1; if(n != at->channels()) { - MusEGlobal::song->startUndo(); - MusEGlobal::song->addUndo(MusECore::UndoOp(MusECore::UndoOp::ModifyTrackChannel, + MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::ModifyTrackChannel, editTrack, at->channels(), n)); - MusEGlobal::audio->msgSetChannels(at, n); - MusEGlobal::song->endUndo(SC_CHANNELS); } } } @@ -1962,8 +1952,7 @@ void TList::mousePressEvent(QMouseEvent* ev) { switch (n) { case 1001: // delete track - MusEGlobal::song->removeTrack0(t); - MusEGlobal::audio->msgUpdateSoloStates(); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::DeleteTrack, MusEGlobal::song->tracks()->index(t), t)); break; case 1002: // show track comment diff --git a/muse2/muse/audio.cpp b/muse2/muse/audio.cpp index f7caa6a0..f399a24c 100644 --- a/muse2/muse/audio.cpp +++ b/muse2/muse/audio.cpp @@ -76,12 +76,8 @@ void initAudio() extern double curTime(); const char* seqMsgList[] = { - "SEQM_ADD_TRACK", "SEQM_REMOVE_TRACK", - "SEQM_MOVE_TRACK", - "SEQM_ADD_PART", "SEQM_REMOVE_PART", - "SEQM_ADD_EVENT", "SEQM_REMOVE_EVENT", "SEQM_CHANGE_EVENT", "SEQM_ADD_TEMPO", "SEQM_SET_TEMPO", "SEQM_REMOVE_TEMPO", "SEQM_ADD_SIG", "SEQM_REMOVE_SIG", - "SEQM_ADD_KEY", "SEQM_REMOVE_KEY", + "SEQM_ADD_KEY", "SEQM_REMOVE_KEY", "SEQM_SET_GLOBAL_TEMPO", "SEQM_REVERT_OPERATION_GROUP", "SEQM_EXECUTE_OPERATION_GROUP", "SEQM_RESET_DEVICES", "SEQM_INIT_DEVICES", "SEQM_PANIC", diff --git a/muse2/muse/audio.h b/muse2/muse/audio.h index 044760ac..e1a90485 100644 --- a/muse2/muse/audio.h +++ b/muse2/muse/audio.h @@ -61,10 +61,6 @@ class Undo; //--------------------------------------------------------- enum { - SEQM_ADD_TRACK, SEQM_REMOVE_TRACK, - SEQM_MOVE_TRACK, - SEQM_ADD_PART, SEQM_REMOVE_PART, - SEQM_ADD_EVENT, SEQM_REMOVE_EVENT, SEQM_CHANGE_EVENT, SEQM_ADD_TEMPO, SEQM_SET_TEMPO, SEQM_REMOVE_TEMPO, SEQM_ADD_SIG, SEQM_REMOVE_SIG, SEQM_ADD_KEY, SEQM_REMOVE_KEY, SEQM_SET_GLOBAL_TEMPO, @@ -226,18 +222,18 @@ class Audio { void msgExecuteOperationGroup(Undo&); // calls exe1, then calls exe2 in audio context, then calls exe3 void msgRevertOperationGroup(Undo&); // similar. - void msgRemoveTrack(Track*, bool u = true); void msgRemoveTracks(); - void msgMoveTrack(int idx1, int dx2, bool u = true); - void msgAddPart(Part*, bool u = true); - void msgRemovePart(Part*, bool u = true); - void msgAddEvent(Event&, Part*, bool u = true, bool doCtrls = true, bool doClones = false); - void msgDeleteEvent(Event&, Part*, bool u = true, bool doCtrls = true, bool doClones = false); - void msgChangeEvent(Event&, Event&, Part*, bool u = true, bool doCtrls = true, bool doClones = false); - void msgAddTempo(int tick, int tempo, bool doUndoFlag = true); - void msgSetTempo(int tick, int tempo, bool doUndoFlag = true); - void msgDeleteTempo(int tick, int tempo, bool doUndoFlag = true); - void msgUpdateSoloStates(); + void msgRemoveTrack(Track*, bool u = true); // only does applyOperation + void msgMoveTrack(int idx1, int dx2, bool u = true); // only does applyOperation + void msgAddPart(Part*, bool u = true); // only does applyOperation + void msgRemovePart(Part*, bool u = true); // only does applyOperation + void msgAddEvent(Event&, Part*, bool u = true, bool doCtrls = true, bool doClones = false); // only does applyOperation + void msgDeleteEvent(Event&, Part*, bool u = true, bool doCtrls = true, bool doClones = false); // only does applyOperation + void msgChangeEvent(Event&, Event&, Part*, bool u = true, bool doCtrls = true, bool doClones = false); // only does applyOperation + void msgAddTempo(int tick, int tempo, bool doUndoFlag = true); // only does applyOperation + void msgSetTempo(int tick, int tempo, bool doUndoFlag = true); // FIXME FINDMICHJETZT TODO! + void msgDeleteTempo(int tick, int tempo, bool doUndoFlag = true); // only does applyOperation + void msgUpdateSoloStates(); // TODO and below void msgSetAux(AudioTrack*, int, double); void msgSetGlobalTempo(int val); void msgAddSig(int tick, int z, int n, bool doUndoFlag = true); diff --git a/muse2/muse/functions.cpp b/muse2/muse/functions.cpp index 380d9718..f13736b9 100644 --- a/muse2/muse/functions.cpp +++ b/muse2/muse/functions.cpp @@ -1422,6 +1422,40 @@ void clean_parts() MusEGlobal::song->applyOperationGroup(operations); } + +bool merge_with_next_part(const Part* oPart) +{ + const Track* track = oPart->track(); + + if(track->type() != Track::WAVE && !track->isMidiTrack()) + return false; + + const PartList* pl = track->cparts(); + const Part* nextPart = 0; + + for (ciPart ip = pl->begin(); ip != pl->end(); ++ip) + { + if (ip->second == oPart) + { + ++ip; + if (ip == pl->end()) + return false; + nextPart = ip->second; + break; + } + } + + if (nextPart) + { + set parts; + parts.insert(oPart); + parts.insert(nextPart); + return merge_parts(parts); + } + else + return false; +} + bool merge_selected_parts() { set temp = get_all_selected_parts(); @@ -1494,4 +1528,49 @@ bool merge_parts(const set& parts) return MusEGlobal::song->applyOperationGroup(operations); } +bool split_part(const Part* part, int tick) +{ + int l1 = tick - part->tick(); + int l2 = part->lenTick() - l1; + if (l1 <= 0 || l2 <= 0) + return false; + Part* p1; + Part* p2; + part->splitPart(tick, p1, p2); + + MusEGlobal::song->informAboutNewParts(part, p1); + MusEGlobal::song->informAboutNewParts(part, p2); + + Undo operations; + operations.push_back(UndoOp(UndoOp::DeletePart, part)); + operations.push_back(UndoOp(UndoOp::AddPart, p1)); + operations.push_back(UndoOp(UndoOp::AddPart, p2)); + return MusEGlobal::song->applyOperationGroup(operations); +} + +bool delete_selected_parts() +{ + Undo operations; + bool partSelected = false; + + TrackList* tl = MusEGlobal::song->tracks(); + + for (iTrack it = tl->begin(); it != tl->end(); ++it) + { + PartList* pl = (*it)->parts(); + for (iPart ip = pl->begin(); ip != pl->end(); ++ip) + { + if (ip->second->selected()) + { + operations.push_back(UndoOp(UndoOp::DeletePart,ip->second)); + partSelected = true; + } + } + } + + MusEGlobal::song->applyOperationGroup(operations); + + return partSelected; +} + } // namespace MusECore diff --git a/muse2/muse/functions.h b/muse2/muse/functions.h index 9493caf7..28e178da 100644 --- a/muse2/muse/functions.h +++ b/muse2/muse/functions.h @@ -105,8 +105,11 @@ void shrink_parts(int raster=-1); //negative values mean "config.division" void expand_parts(int raster=-1); void schedule_resize_all_same_len_clone_parts(const Part* part, unsigned new_len, Undo& operations); void clean_parts(); +bool merge_with_next_part(const Part* part); bool merge_selected_parts(); bool merge_parts(const std::set& parts); +bool split_part(const Part* part, int tick); +bool delete_selected_parts(); // internal QMimeData* file_to_mimedata(FILE *datafile, QString mimeType); diff --git a/muse2/muse/midiedit/dcanvas.cpp b/muse2/muse/midiedit/dcanvas.cpp index 893694c3..ba18d8a3 100644 --- a/muse2/muse/midiedit/dcanvas.cpp +++ b/muse2/muse/midiedit/dcanvas.cpp @@ -1212,8 +1212,7 @@ void DrumCanvas::resizeEvent(QResizeEvent* ev) void DrumCanvas::modifySelected(NoteInfo::ValType type, int val, bool delta_mode) { QList< QPair > already_done; - MusEGlobal::audio->msgIdle(true); - MusEGlobal::song->startUndo(); + MusECore::Undo operations; for (iCItem i = items.begin(); i != items.end(); ++i) { if (!(i->second->isSelected())) continue; @@ -1302,14 +1301,12 @@ void DrumCanvas::modifySelected(NoteInfo::ValType type, int val, bool delta_mode } break; } - MusEGlobal::song->changeEvent(event, newEvent, part); - // Indicate do not do port controller values and clone parts. - MusEGlobal::song->addUndo(MusECore::UndoOp(MusECore::UndoOp::ModifyEvent, newEvent, event, part, false, false)); + + operations.push_back(MusECore::UndoOp(MusECore::UndoOp::ModifyEvent, newEvent, event, part, false, false)); already_done.append(QPair(part->clonemaster_sn(), event)); } - MusEGlobal::song->endUndo(SC_EVENT_MODIFIED); - MusEGlobal::audio->msgIdle(false); + MusEGlobal::song->applyOperationGroup(operations); } //--------------------------------------------------------- diff --git a/muse2/muse/mixer/strip.cpp b/muse2/muse/mixer/strip.cpp index 06ee9443..cf4be792 100644 --- a/muse2/muse/mixer/strip.cpp +++ b/muse2/muse/mixer/strip.cpp @@ -42,6 +42,9 @@ #include "meter.h" #include "utils.h" #include "icons.h" +#include "undo.h" + +using MusECore::UndoOp; namespace MusEGui { @@ -340,8 +343,7 @@ void Strip::mousePressEvent(QMouseEvent* ev) QFrame::mousePressEvent(ev); return; } - MusEGlobal::song->removeTrack0(track); - MusEGlobal::audio->msgUpdateSoloStates(); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::DeleteTrack, MusEGlobal::song->tracks()->index(track), track)); ev->accept(); return; } diff --git a/muse2/muse/part.cpp b/muse2/muse/part.cpp index c46e7ab9..82427d28 100644 --- a/muse2/muse/part.cpp +++ b/muse2/muse/part.cpp @@ -609,59 +609,24 @@ void Song::cmdResizePart(Track* track, Part* oPart, unsigned int len, bool doClo switch(track->type()) { case Track::WAVE: { - // TODO FINDMICH FIXME this is totally broken. we don't want to remove events just because they're beyond end-of-part. - // we also don't want to auto-resize the last event. + Undo operations; + + unsigned orig_len=oPart->lenFrame(); + WavePart* part_it=(WavePart*)oPart; + do + { + if (part_it->lenFrame()==orig_len) + { + // Do port controller values but not clone parts. + operations.push_back(UndoOp(UndoOp::ModifyPartLengthFrames, part_it, part_it->lenFrame(), len, true, false)); + } + + part_it=(WavePart*)part_it->nextClone(); + } while (doClones && (part_it != (WavePart*)oPart)); - /* - MusECore::WavePart* nPart = new MusECore::WavePart(*(MusECore::WavePart*)oPart); - EventList* el = nPart->events(); - unsigned new_partlength = MusEGlobal::tempomap.deltaTick2frame(oPart->tick(), oPart->tick() + len); - - // If new nr of frames is less than previous what can happen is: - // - 0 or more events are beginning after the new final position. Those are removed from the part - // - The last event begins before new final position and ends after it. If so, it will be resized to end at new part length - if (new_partlength < oPart->lenFrame()) { - Undo operations; - - for (iEvent i = el->begin(); i != el->end(); i++) { - Event e = i->second; - unsigned event_startframe = e.frame(); - unsigned event_endframe = event_startframe + e.lenFrame(); - if (event_endframe < new_partlength) - continue; - } - nPart->setLenFrame(new_partlength); - // Do not do port controller values and clone parts. - operations.push_back(UndoOp(UndoOp::Modify***Part, oPart, nPart, false, false)); - - MusEGlobal::song->applyOperationGroup(operations); - } - // If the part is expanded there can be no additional events beginning after the previous final position - // since those are removed if the part has been shrunk at some time (see above) - // The only thing we need to check is the final event: If it has data after the previous final position, - // we'll expand that event - else { - Undo operations; - if(!el->empty()) - { - iEvent i = el->end(); - i--; - Event last = i->second; - MusECore::SndFileR file = last.sndFile(); - if (file.isNull()) - return; - Event newEvent = last.clone(); - // Do not do port controller values and clone parts. - operations.push_back(UndoOp(UndoOp::ModifyEvent, newEvent, last, nPart, false, false)); - } - - nPart->setLenFrame(new_partlength); - // Do not do port controller values and clone parts. - operations.push_back(UndoOp(UndoOp::Modify***Part, oPart, nPart, false, false)); - MusEGlobal::song->applyOperationGroup(operations); - } */ - } + MusEGlobal::song->applyOperationGroup(operations); break; + } case Track::MIDI: case Track::DRUM: case Track::NEW_DRUM: @@ -775,95 +740,6 @@ void Part::splitPart(int tickpos, Part*& p1, Part*& p2) const } } -//--------------------------------------------------------- -// cmdSplitPart -//--------------------------------------------------------- - -void Song::cmdSplitPart(Track* track, Part* part, int tick) - { - int l1 = tick - part->tick(); - int l2 = part->lenTick() - l1; - if (l1 <= 0 || l2 <= 0) - return; - Part* p1; - Part* p2; - part->splitPart(tick, p1, p2); - - MusEGlobal::song->informAboutNewParts(part, p1); - MusEGlobal::song->informAboutNewParts(part, p2); - - Undo operations; - operations.push_back(UndoOp(UndoOp::DeletePart, part)); - operations.push_back(UndoOp(UndoOp::AddPart, p1)); - operations.push_back(UndoOp(UndoOp::AddPart, p2)); - applyOperationGroup(operations); - } - - -//--------------------------------------------------------- -// cmdGluePart -//--------------------------------------------------------- - -void Song::cmdGluePart(Track* track, Part* oPart) - { /* disabled for now, to be deleted - // p3.3.54 - if(track->type() != Track::WAVE && !track->isMidiTrack()) - return; - - PartList* pl = track->parts(); - Part* nextPart = 0; - - for (iPart ip = pl->begin(); ip != pl->end(); ++ip) { - if (ip->second == oPart) { - ++ip; - if (ip == pl->end()) - return; - nextPart = ip->second; - break; - } - } - - Part* nPart = track->newPart(oPart); - nPart->setLenTick(nextPart->tick() + nextPart->lenTick() - oPart->tick()); - - // populate nPart with Events from oPart and nextPart - - EventList* sl1 = oPart->events(); - EventList* dl = nPart->events(); - - for (iEvent ie = sl1->begin(); ie != sl1->end(); ++ie) - dl->add(ie->second); - - EventList* sl2 = nextPart->events(); - - if(track->type() == Track::WAVE) - { - int frameOffset = nextPart->frame() - oPart->frame(); - for (iEvent ie = sl2->begin(); ie != sl2->end(); ++ie) - { - Event event = ie->second.clone(); - event.setFrame(event.frame() + frameOffset); - dl->add(event); - } - } - else - if(track->isMidiTrack()) - { - int tickOffset = nextPart->tick() - oPart->tick(); - for (iEvent ie = sl2->begin(); ie != sl2->end(); ++ie) - { - Event event = ie->second.clone(); - event.setTick(event.tick() + tickOffset); - dl->add(event); - } - } - - startUndo(); - MusEGlobal::audio->msgRemovePart(nextPart, false); - // Indicate no undo, and do port controller values but not clone parts. - MusEGlobal::audio->msgChange***Part(oPart, nPart, false, true, false); - endUndo(SC_PART_MODIFIED | SC_PART_REMOVED); */ - } //--------------------------------------------------------- // dump diff --git a/muse2/muse/seqmsg.cpp b/muse2/muse/seqmsg.cpp index 3b914fda..3dca4d44 100644 --- a/muse2/muse/seqmsg.cpp +++ b/muse2/muse/seqmsg.cpp @@ -661,24 +661,7 @@ void Audio::msgPlay(bool val) } } -//--------------------------------------------------------- -// msgAddTrack -//--------------------------------------------------------- -void Song::msgInsertTrack(Track* track, int idx, bool doUndoFlag) - { - AudioMsg msg; - msg.id = SEQM_ADD_TRACK; - msg.track = track; - msg.ival = idx; - if (doUndoFlag) { - MusEGlobal::song->startUndo(); - addUndo(UndoOp(UndoOp::AddTrack, idx, track)); - } - MusEGlobal::audio->sendMsg(&msg); - if (doUndoFlag) - endUndo(SC_TRACK_INSERTED); - } //--------------------------------------------------------- // msgRemoveTrack @@ -686,10 +669,7 @@ void Song::msgInsertTrack(Track* track, int idx, bool doUndoFlag) void Audio::msgRemoveTrack(Track* track, bool doUndoFlag) { - AudioMsg msg; - msg.id = SEQM_REMOVE_TRACK; - msg.track = track; - sendMessage(&msg, doUndoFlag); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::DeleteTrack, MusEGlobal::song->tracks()->index(track), track)); } //--------------------------------------------------------- @@ -749,23 +729,6 @@ void Audio::msgRemoveTracks() } -/* DELETETHIS 18 -//--------------------------------------------------------- -// msgChangeTrack -// oldTrack - copy of the original track befor modification -// newTrack - modified original track -//--------------------------------------------------------- - -void Audio::msgChangeTrack(Track* oldTrack, Track* newTrack, bool doUndoFlag) - { - AudioMsg msg; - msg.id = SEQM_CHANGE_TRACK; - msg.p1 = oldTrack; - msg.p2 = newTrack; - sendMessage(&msg, doUndoFlag); - } -*/ - //--------------------------------------------------------- // msgMoveTrack // move track idx1 to slot idx2 @@ -778,11 +741,7 @@ void Audio::msgMoveTrack(int idx1, int idx2, bool doUndoFlag) int n = MusEGlobal::song->tracks()->size(); if (idx1 >= n || idx2 >= n) // sanity check return; - AudioMsg msg; - msg.id = SEQM_MOVE_TRACK; - msg.a = idx1; - msg.b = idx2; - sendMessage(&msg, doUndoFlag); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::SwapTrack, idx1, idx2), doUndoFlag); } //--------------------------------------------------------- @@ -791,10 +750,7 @@ void Audio::msgMoveTrack(int idx1, int idx2, bool doUndoFlag) void Audio::msgAddPart(Part* part, bool doUndoFlag) { - AudioMsg msg; - msg.id = SEQM_ADD_PART; - msg.p1 = part; - sendMessage(&msg, doUndoFlag); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::AddPart, part), doUndoFlag); } //--------------------------------------------------------- @@ -803,39 +759,9 @@ void Audio::msgAddPart(Part* part, bool doUndoFlag) void Audio::msgRemovePart(Part* part, bool doUndoFlag) { - AudioMsg msg; - msg.id = SEQM_REMOVE_PART; - msg.p1 = part; - sendMessage(&msg, doUndoFlag); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::DeletePart, part), doUndoFlag); } -//--------------------------------------------------------- -// msgRemoveParts -// remove selected parts; return true if any part was -// removed -//--------------------------------------------------------- - -bool Song::msgRemoveParts() - { - Undo operations; - bool partSelected = false; - - TrackList* tl = MusEGlobal::song->tracks(); - - for (iTrack it = tl->begin(); it != tl->end(); ++it) { - PartList* pl = (*it)->parts(); - for (iPart ip = pl->begin(); ip != pl->end(); ++ip) { - if (ip->second->selected()) { - operations.push_back(UndoOp(UndoOp::DeletePart,ip->second)); - partSelected = true; - } - } - } - - MusEGlobal::song->applyOperationGroup(operations); - - return partSelected; - } //--------------------------------------------------------- // msgAddEvent @@ -843,13 +769,7 @@ bool Song::msgRemoveParts() void Audio::msgAddEvent(Event& event, Part* part, bool doUndoFlag, bool doCtrls, bool doClones) { - AudioMsg msg; - msg.id = SEQM_ADD_EVENT; - msg.ev1 = event; - msg.p2 = part; - msg.a = doCtrls; - msg.b = doClones; - sendMessage(&msg, doUndoFlag); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::AddEvent, event,part, doCtrls, doClones), doUndoFlag); } //--------------------------------------------------------- @@ -858,13 +778,7 @@ void Audio::msgAddEvent(Event& event, Part* part, bool doUndoFlag, bool doCtrls, void Audio::msgDeleteEvent(Event& event, Part* part, bool doUndoFlag, bool doCtrls, bool doClones) { - AudioMsg msg; - msg.id = SEQM_REMOVE_EVENT; - msg.ev1 = event; - msg.p2 = part; - msg.a = doCtrls; - msg.b = doClones; - sendMessage(&msg, doUndoFlag); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::DeleteEvent, event,part, doCtrls, doClones), doUndoFlag); } //--------------------------------------------------------- @@ -873,14 +787,7 @@ void Audio::msgDeleteEvent(Event& event, Part* part, bool doUndoFlag, bool doCtr void Audio::msgChangeEvent(Event& oe, Event& ne, Part* part, bool doUndoFlag, bool doCtrls, bool doClones) { - AudioMsg msg; - msg.id = SEQM_CHANGE_EVENT; - msg.ev1 = oe; - msg.ev2 = ne; - msg.p3 = part; - msg.a = doCtrls; - msg.b = doClones; - sendMessage(&msg, doUndoFlag); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::ModifyEvent, ne,oe, part, doCtrls, doClones), doUndoFlag); } //--------------------------------------------------------- @@ -889,11 +796,7 @@ void Audio::msgChangeEvent(Event& oe, Event& ne, Part* part, bool doUndoFlag, bo void Audio::msgAddTempo(int tick, int tempo, bool doUndoFlag) { - AudioMsg msg; - msg.id = SEQM_ADD_TEMPO; - msg.a = tick; - msg.b = tempo; - sendMessage(&msg, doUndoFlag); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::AddTempo, tick, tempo), doUndoFlag); } //--------------------------------------------------------- @@ -927,11 +830,7 @@ void Audio::msgSetGlobalTempo(int val) void Audio::msgDeleteTempo(int tick, int tempo, bool doUndoFlag) { - AudioMsg msg; - msg.id = SEQM_REMOVE_TEMPO; - msg.a = tick; - msg.b = tempo; - sendMessage(&msg, doUndoFlag); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::DeleteTempo, tick, tempo), doUndoFlag); } //--------------------------------------------------------- diff --git a/muse2/muse/song.cpp b/muse2/muse/song.cpp index e18dfc01..7e6c08d0 100644 --- a/muse2/muse/song.cpp +++ b/muse2/muse/song.cpp @@ -434,7 +434,8 @@ void Song::duplicateTracks() QString track_name; int idx; int trackno = tl.size(); - MusEGlobal::song->startUndo(); + + Undo operations; for(TrackList::reverse_iterator it = tl.rbegin(); it != tl.rend(); ++it) { Track* track = *it; @@ -444,114 +445,23 @@ void Song::duplicateTracks() for(int cp = 0; cp < copies; ++cp) { - // There are two ways to copy a track now. Using the copy constructor or using new + assign(). - // Tested: Both ways seem OK. Prefer copy constructors for simplicity. But new + assign() may be - // required for fine-grained control over initializing various track types. - // - - // Set to 0 to use the copy constructor. Set to 1 to use new + assign(). - // DELETETHIS is this still necessary to keep around? - // also consider removing and adding a hint to a revision number instead - #if 0 - - Track* new_track = 0; - int lastAuxIdx = _auxs.size(); - switch(track->type()) - { - case Track::AUDIO_SOFTSYNTH: // TODO: Handle synths. p4.0.47 - // ((AudioTrack*)new_track)->addAuxSend(lastAuxIdx); DELETETHIS? - break; - - case Track::MIDI: - new_track = new MidiTrack(); - new_track->setType(Track::MIDI); - break; - case Track::DRUM: - new_track = new MidiTrack(); - new_track->setType(Track::DRUM); - //((MidiTrack*)new_track)->setOutChannel(9); DELETETHIS? - break; - case Track::WAVE: - new_track = new MusECore::WaveTrack(); - //((AudioTrack*)new_track)->addAuxSend(lastAuxIdx); DELETETHIS? - break; - case Track::AUDIO_OUTPUT: - new_track = new AudioOutput(); - break; - case Track::AUDIO_GROUP: - new_track = new AudioGroup(); - //((AudioTrack*)new_track)->addAuxSend(lastAuxIdx); DELETETHIS? - break; - case Track::AUDIO_AUX: - new_track = new AudioAux(); - break; - case Track::AUDIO_INPUT: - new_track = new AudioInput(); - //((AudioTrack*)new_track)->addAuxSend(lastAuxIdx); DELETETHIS? - break; - default: - printf("Song::duplicateTracks: Illegal type %d\n", track->type()); - break; - } - - if(new_track) - { - new_track->assign(*track, flags); - #else - { Track* new_track = track->clone(flags); - #endif //new_track->setDefaultName(track_name); // Handled in class now. idx = trackno + cp; - insertTrack1(new_track, idx); - addUndo(MusECore::UndoOp(MusECore::UndoOp::AddTrack, idx, new_track)); - msgInsertTrack(new_track, idx, false); // No undo. - insertTrack3(new_track, idx); - } + operations.push_back(MusECore::UndoOp(MusECore::UndoOp::AddTrack, idx, new_track)); } } --trackno; } - MusECore::SongChangedFlags_t update_flags = SC_TRACK_INSERTED; - if(flags & (Track::ASSIGN_ROUTES | Track::ASSIGN_DEFAULT_ROUTES)) - update_flags |= SC_ROUTE; - MusEGlobal::song->endUndo(update_flags); + MusEGlobal::song->applyOperationGroup(operations); MusEGlobal::audio->msgUpdateSoloStates(); } -//--------------------------------------------------------- -// cmdRemoveTrack -//--------------------------------------------------------- -void Song::cmdRemoveTrack(Track* track) - { - int idx = _tracks.index(track); - addUndo(UndoOp(UndoOp::DeleteTrack, idx, track)); - removeTrack2(track); - updateFlags |= SC_TRACK_REMOVED; - } -//--------------------------------------------------------- -// removeMarkedTracks -//--------------------------------------------------------- - -void Song::removeMarkedTracks() - { - bool loop; - do { - loop = false; - for (iTrack t = _tracks.begin(); t != _tracks.end(); ++t) { - if ((*t)->selected()) { - removeTrack2(*t); - loop = true; - break; - } - } - } while (loop); - } //--------------------------------------------------------- // deselectTracks @@ -753,16 +663,6 @@ void Song::changeAllPortDrumCtrlEvents(bool add, bool drumonly) } } -void Song::addACEvent(AudioTrack* t, int acid, int frame, double val) -{ - MusEGlobal::audio->msgAddACEvent(t, acid, frame, val); -} - -void Song::changeACEvent(AudioTrack* t, int acid, int frame, int newFrame, double val) -{ - MusEGlobal::audio->msgChangeACEvent(t, acid, frame, newFrame, val); -} - //--------------------------------------------------------- // cmdAddRecordedEvents // add recorded Events into part @@ -1367,23 +1267,6 @@ void Song::updatePos() emit posChanged(2, pos[2].tick(), false); } -//--------------------------------------------------------- -// setChannelMute -// mute all midi tracks associated with channel -//--------------------------------------------------------- - -void Song::setChannelMute(int channel, bool val) - { - for (iTrack i = _tracks.begin(); i != _tracks.end(); ++i) { - MidiTrack* track = dynamic_cast(*i); - if (track == 0) - continue; - if (track->outChannel() == channel) - track->setMute(val); - } - emit songChanged(SC_MUTE); - } - //--------------------------------------------------------- // len //--------------------------------------------------------- @@ -1822,63 +1705,8 @@ void Song::processMsg(AudioMsg* msg) case SEQM_REVERT_OPERATION_GROUP: revertOperationGroup2(*msg->operations); break; - case SEQM_MOVE_TRACK: - if (msg->a > msg->b) { - for (int i = msg->a; i > msg->b; --i) { - swapTracks(i, i-1); - } - } - else { - for (int i = msg->a; i < msg->b; ++i) { - swapTracks(i, i+1); - } - } - updateFlags = SC_TRACK_MODIFIED; - break; - case SEQM_ADD_EVENT: - updateFlags = SC_EVENT_INSERTED; - if (addEvent(msg->ev1, (MidiPart*)msg->p2)) { - addUndo(UndoOp(UndoOp::AddEvent, msg->ev1, (Part*)msg->p2, msg->a, msg->b)); - } - else - updateFlags = 0; - if(msg->a) - addPortCtrlEvents(msg->ev1, (Part*)msg->p2, msg->b); - break; - case SEQM_REMOVE_EVENT: - { - Event event = msg->ev1; - MidiPart* part = (MidiPart*)msg->p2; - if(msg->a) - removePortCtrlEvents(event, part, msg->b); - addUndo(UndoOp(UndoOp::DeleteEvent, event, (Part*)part, msg->a, msg->b)); - deleteEvent(event, part); - updateFlags = SC_EVENT_REMOVED; - } - break; - case SEQM_CHANGE_EVENT: - if(msg->a) - removePortCtrlEvents(msg->ev1, (MidiPart*)msg->p3, msg->b); - changeEvent(msg->ev1, msg->ev2, (MidiPart*)msg->p3); - if(msg->a) - addPortCtrlEvents(msg->ev2, (Part*)msg->p3, msg->b); - addUndo(UndoOp(UndoOp::ModifyEvent, msg->ev2, msg->ev1, (Part*)msg->p3, msg->a, msg->b)); - updateFlags = SC_EVENT_MODIFIED; - break; - - case SEQM_ADD_TRACK: - insertTrack2(msg->track, msg->ival); - break; - case SEQM_REMOVE_TRACK: - cmdRemoveTrack(msg->track); - break; - case SEQM_ADD_PART: - cmdAddPart((Part*)msg->p1); - break; - case SEQM_REMOVE_PART: - cmdRemovePart((Part*)msg->p1); - break; + case SEQM_ADD_TEMPO: addUndo(UndoOp(UndoOp::AddTempo, msg->a, msg->b)); MusEGlobal::tempomap.addTempo(msg->a, msg->b); @@ -1931,29 +1759,6 @@ void Song::processMsg(AudioMsg* msg) } } -//--------------------------------------------------------- -// cmdAddPart -//--------------------------------------------------------- - -void Song::cmdAddPart(Part* part) - { - addPart(part); - addUndo(UndoOp(UndoOp::AddPart, part)); - updateFlags = SC_PART_INSERTED; - } - -//--------------------------------------------------------- -// cmdRemovePart -//--------------------------------------------------------- - -void Song::cmdRemovePart(Part* part) - { - removePart(part); - addUndo(UndoOp(UndoOp::DeletePart, part)); - part->unchainClone(); - updateFlags = SC_PART_REMOVED; - } - //--------------------------------------------------------- // panic //--------------------------------------------------------- @@ -3164,18 +2969,6 @@ void Song::insertTrack3(Track* /*track*/, int /*idx*/)//prevent compiler warning { } -//--------------------------------------------------------- -// removeTrack0 -//--------------------------------------------------------- - -void Song::removeTrack0(Track* track) - { - removeTrack1(track); - MusEGlobal::audio->msgRemoveTrack(track); - removeTrack3(track); - update(SC_TRACK_REMOVED); - } - //--------------------------------------------------------- // removeTrack1 // non realtime part of removeTrack diff --git a/muse2/muse/song.h b/muse2/muse/song.h index c62f1c08..a25f1d55 100644 --- a/muse2/muse/song.h +++ b/muse2/muse/song.h @@ -282,33 +282,28 @@ class Song : public QObject { void cmdAddRecordedWave(WaveTrack* track, Pos, Pos); void cmdAddRecordedEvents(MidiTrack*, const EventList&, unsigned); - bool addEvent(Event&, Part*); - void changeEvent(Event&, Event&, Part*); - void deleteEvent(Event&, Part*); - void cmdChangeWave(QString original, QString tmpfile, unsigned sx, unsigned ex); - void remapPortDrumCtrlEvents(int mapidx, int newnote, int newchan, int newport); - void changeAllPortDrumCtrlEvents(bool add, bool drumonly = false); + bool addEvent(Event&, Part*); // only called from audio thread. FIXME TODO: move functionality into undo.cpp + void changeEvent(Event&, Event&, Part*); // only called from audio thread. FIXME TODO: move functionality into undo.cpp + void deleteEvent(Event&, Part*); // only called from audio thread. FIXME TODO: move functionality into undo.cpp + void cmdChangeWave(QString original, QString tmpfile, unsigned sx, unsigned ex); // FIXME TODO broken, fix that. + void remapPortDrumCtrlEvents(int mapidx, int newnote, int newchan, int newport); // called from GUI thread + void changeAllPortDrumCtrlEvents(bool add, bool drumonly = false); // called from GUI thread - void addACEvent(AudioTrack* t, int acid, int frame, double val); - void changeACEvent(AudioTrack* t, int acid, int frame, int newFrame, double val); void addExternalTempo(const TempoRecEvent& e) { _tempoFifo.put(e); } //----------------------------------------- // part manipulations //----------------------------------------- - void cmdResizePart(Track* t, Part* p, unsigned int size, bool doClones=false); - void cmdSplitPart(Track* t, Part* p, int tick); - void cmdGluePart(Track* t, Part* p); + void cmdResizePart(Track* t, Part* p, unsigned int size, bool doClones=false); // called from GUI thread, calls applyOperationGroup. FIXME TODO: better move that into functions.cpp or whatever. void addPart(Part* part); void removePart(Part* part); - PartList* getSelectedMidiParts() const; + + + PartList* getSelectedMidiParts() const; // FIXME TODO move functionality into function.cpp PartList* getSelectedWaveParts() const; - bool msgRemoveParts(); - void cmdRemovePart(Part* part); - void cmdAddPart(Part* part); int arrangerRaster() { return _arrangerRaster; } // Used by Song::cmdAddRecordedWave to snap new wave parts void setArrangerRaster(int r) { _arrangerRaster = r; } // Used by Arranger snap combo box @@ -325,17 +320,12 @@ class Song : public QObject { AuxList* auxs() { return &_auxs; } SynthIList* syntis() { return &_synthIs; } - void cmdRemoveTrack(Track* track); - void removeTrack0(Track* track); void removeTrack1(Track* track); void removeTrack2(Track* track); void removeTrack3(Track* track); - void removeMarkedTracks(); - //void changeTrack(Track* oldTrack, Track* newTrack); DELETETHIS MidiTrack* findTrack(const Part* part) const; Track* findTrack(const QString& name) const; void swapTracks(int i1, int i2); - void setChannelMute(int channel, bool flag); void setRecordFlag(Track*, bool); void insertTrack0(Track*, int idx); void insertTrack1(Track*, int idx); @@ -344,7 +334,6 @@ class Song : public QObject { void deselectTracks(); void readRoute(Xml& xml); void recordEvent(MidiTrack*, Event&); - void msgInsertTrack(Track* track, int idx, bool u = true); // Enable all track and plugin controllers, and synth controllers if applicable, which are NOT in AUTO_WRITE mode. void reenableTouchedControllers(); void clearRecAutomation(bool clearList); @@ -362,7 +351,7 @@ class Song : public QObject { void startUndo(); void endUndo(MusECore::SongChangedFlags_t); - void undoOp(UndoOp::UndoType type, const char* changedFile, const char* changeData, int startframe, int endframe); + void undoOp(UndoOp::UndoType type, const char* changedFile, const char* changeData, int startframe, int endframe); // FIXME FINDMICHJETZT what's that?! remove it! void executeOperationGroup1(Undo& operations); void executeOperationGroup2(Undo& operations); diff --git a/muse2/muse/synth.cpp b/muse2/muse/synth.cpp index d8d09048..32568e31 100644 --- a/muse2/muse/synth.cpp +++ b/muse2/muse/synth.cpp @@ -696,11 +696,7 @@ SynthI* Song::createSynthI(const QString& sclass, const QString& label, Synth::T int idx = insertAt ? _tracks.index(insertAt) : -1; - insertTrack1(si, idx); - - msgInsertTrack(si, idx, true); // add to instance list - - insertTrack3(si, idx); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::AddTrack, idx, si)); OutputList* ol = MusEGlobal::song->outputs(); // add default route to master (first audio output) diff --git a/muse2/muse/wave.cpp b/muse2/muse/wave.cpp index 73e4d837..9bf26753 100644 --- a/muse2/muse/wave.cpp +++ b/muse2/muse/wave.cpp @@ -1114,7 +1114,10 @@ void Song::cmdAddRecordedWave(MusECore::WaveTrack* track, MusECore::Pos s, MusEC event.setLenFrame(e.frame() - s.frame()); part->addEvent(event); - MusEGlobal::song->cmdAddPart(part); + // TODO FIXME that's ugly (flo) + addPart(part); + addUndo(UndoOp(UndoOp::AddPart, part)); + updateFlags = SC_PART_INSERTED; if (MusEGlobal::song->len() < etick) MusEGlobal::song->setLen(etick); -- cgit v1.2.3