diff options
| author | Werner Schweer <ws.seh.de> | 2006-11-26 10:09:03 +0000 | 
|---|---|---|
| committer | Werner Schweer <ws.seh.de> | 2006-11-26 10:09:03 +0000 | 
| commit | 90c7251f4aaf954065f4841e4ec19b3fb53250a9 (patch) | |
| tree | 65ab384c758b318c01cc803d3e85bee382a89191 | |
| parent | 53ec5d7c359e777fa1ed239ab73603d161070344 (diff) | |
updates
| -rw-r--r-- | muse/muse/arranger/canvas.cpp | 23 | ||||
| -rw-r--r-- | muse/muse/audio.h | 2 | ||||
| -rw-r--r-- | muse/muse/event.cpp | 2 | ||||
| -rw-r--r-- | muse/muse/event.h | 44 | ||||
| -rw-r--r-- | muse/muse/eventbase.h | 2 | ||||
| -rw-r--r-- | muse/muse/eventlist.cpp | 12 | ||||
| -rw-r--r-- | muse/muse/midiedit/miditracker.cpp | 4 | ||||
| -rw-r--r-- | muse/muse/midiedit/trackpattern.cpp | 4 | ||||
| -rw-r--r-- | muse/muse/midieventbase.h | 2 | ||||
| -rw-r--r-- | muse/muse/miditrack.cpp | 12 | ||||
| -rw-r--r-- | muse/muse/miditrack.h | 5 | ||||
| -rw-r--r-- | muse/muse/part.cpp | 157 | ||||
| -rw-r--r-- | muse/muse/part.h | 24 | ||||
| -rw-r--r-- | muse/muse/song.h | 1 | ||||
| -rw-r--r-- | muse/muse/songpart.cpp | 53 | ||||
| -rw-r--r-- | muse/muse/sync.cpp | 12 | ||||
| -rw-r--r-- | muse/muse/undo.cpp | 57 | ||||
| -rw-r--r-- | muse/muse/waveevent.h | 2 | ||||
| -rw-r--r-- | muse/muse/wavetrack.cpp | 4 | 
19 files changed, 203 insertions, 219 deletions
diff --git a/muse/muse/arranger/canvas.cpp b/muse/muse/arranger/canvas.cpp index f050c492..358520f8 100644 --- a/muse/muse/arranger/canvas.cpp +++ b/muse/muse/arranger/canvas.cpp @@ -193,7 +193,7 @@ void PartCanvas::paint(QPainter& p, QRect r)                          break;                    QRect pr(x1, y, len, h - partBorderWidth); -                  bool clone = part->isCloned(); +                  bool clone = part->isClone();                    QPen pen(Qt::black, partBorderWidth, clone ? Qt::DashLine : Qt::SolidLine);                    QBrush brush(Qt::SolidPattern); @@ -287,7 +287,7 @@ void PartCanvas::drawMidiPart(QPainter& p, Part* mp, int y, int th, int from, in        EventList* events = mp->events();        // iEvent ito(events->lower_bound(to)); -      iEvent ito(events->end()); +      iEvent ito = events->end();  //      int pos = pos2pix(*mp);        if (config.canvasShowPartType & 2) {      // show events @@ -440,7 +440,7 @@ void PartCanvas::contextMenu(const QPoint& pos)              a->setData(3);              a = pop->addAction(tr("de-clone"));              a->setData(15); -            a->setEnabled(part->events()->arefCount() > 1); +            a->setEnabled(part->isClone());              if (track->type() == Track::MIDI) {                    a = pop->addAction(tr("AutoFill..."));                    a->setData(16); @@ -875,20 +875,19 @@ void PartCanvas::setCursor()  //   declonePart  //--------------------------------------------------------- -void PartCanvas::declonePart(Part* spart) +void PartCanvas::declonePart(Part* oPart)        { -      Track* track = spart->track(); -      Part* dpart  = track->newPart(spart, false); +      Track* track = oPart->track(); +      Part* nPart  = track->newPart(oPart, false); -      EventList* se = spart->events(); -      EventList* de = dpart->events(); +      EventList* se = oPart->events();        for (iEvent i = se->begin(); i != se->end(); ++i) {              Event oldEvent = i->second; -            Event ev = oldEvent.clone(); -            de->add(ev); +//            Event ev = oldEvent.clone(); +            nPart->addEvent(oldEvent);              } -      song->cmdChangePart(spart, dpart); -      track->partListChanged(); +      oPart->deref(); +      song->cmdChangePart(oPart, nPart);        }  //--------------------------------------------------------- diff --git a/muse/muse/audio.h b/muse/muse/audio.h index b136ca34..56ce1976 100644 --- a/muse/muse/audio.h +++ b/muse/muse/audio.h @@ -44,8 +44,6 @@ class Part;  class Event;  class MidiEvent;  class Event; -class EventList; -class MidiInstrument;  class MidiTrack;  class MidiSeq;  class MidiTrackBase; diff --git a/muse/muse/event.cpp b/muse/muse/event.cpp index 77438764..2985bb9c 100644 --- a/muse/muse/event.cpp +++ b/muse/muse/event.cpp @@ -70,7 +70,7 @@ void EventBase::dump(int n) const  //   clone  //--------------------------------------------------------- -Event Event::clone() +Event Event::clone() const        {        return Event(ev->clone());        } diff --git a/muse/muse/event.h b/muse/muse/event.h index c44ca622..cce5e84f 100644 --- a/muse/muse/event.h +++ b/muse/muse/event.h @@ -25,6 +25,7 @@  #include "al/xml.h"  #include "al/pos.h"  #include "evdata.h" +#include "clonedata.h"  using AL::Xml;  using AL::Pos; @@ -61,7 +62,7 @@ class Event {        void read(QDomNode);        void write(AL::Xml& xml, const Pos& offset) const;        void dump(int n = 0) const; -      Event clone(); +      Event clone() const;        Event mid(unsigned a, unsigned b);        bool isNote() const; @@ -120,16 +121,10 @@ typedef std::pair <iEvent, iEvent> EventRange;  //    tick sorted list of events  //--------------------------------------------------------- -class EventListData : public EL, public QSharedData { -      int aref;         // number of active references (exclude undo list) -      void deselect(); - +class EventList : public EL {     public: -      EventListData()           { aref = 0;  } -      ~EventListData()          {} - -      void incARef(int n)   { aref += n;   } -      int arefCount() const { return aref; } +      int cloneCount; +      EventList()           { cloneCount = 0; }        iEvent find(const Event&);        iEvent add(Event& event);        iEvent add(Event& event, unsigned tick); @@ -138,34 +133,5 @@ class EventListData : public EL, public QSharedData {        void read(QDomNode, bool midi);        }; -class EventList { -      QSharedDataPointer<EventListData> d; - -   public: -      EventList()                             { d = new EventListData(); } -      void incARef(int n)                     { d->incARef(n);           } -      int arefCount() const                   { return d->arefCount();   } -      iEvent find(const Event& event)         { return d->find(event);   } -      iEvent add(Event& event)                { return d->add(event);    } -      iEvent add(Event& event, unsigned tick) { return d->add(event, tick); } -      void move(Event& event, unsigned tick)  { d->move(event, tick);    } -      void dump() const                       { d->dump();               } -      void read(QDomNode n, bool midi)        { d->read(n, midi);        } -      iEvent begin()                          { return d->begin(); } -      iEvent end()                            { return d->end(); } -      ciEvent begin() const                   { return d->begin(); } -      ciEvent end() const                     { return d->end(); } -      iEvent lower_bound(unsigned n)          { return d->lower_bound(n); } -      ciEvent lower_bound(unsigned n) const   { return d->lower_bound(n); } -      iEvent upper_bound(unsigned n)          { return d->upper_bound(n); } -      ciEvent upper_bound(unsigned n) const   { return d->upper_bound(n); } -      EventRange equal_range(unsigned n)      { return d->equal_range(n); } -      void clear()                            { d->clear(); } -      bool empty() const                      { return d->empty(); } -      void erase(iEvent i)                    { d->erase(i); } -      void erase(iEvent i, iEvent k)          { d->erase(i, k); } -      unsigned size() const                   { return d->size(); } -      }; -  #endif diff --git a/muse/muse/eventbase.h b/muse/muse/eventbase.h index 80019a74..8381952e 100644 --- a/muse/muse/eventbase.h +++ b/muse/muse/eventbase.h @@ -86,7 +86,7 @@ class EventBase : public AL::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 read(unsigned /*offset*/, float** /*bpp*/, int /*channels*/, int /*nn*/) {}        }; diff --git a/muse/muse/eventlist.cpp b/muse/muse/eventlist.cpp index 9ce2930a..e8289fc3 100644 --- a/muse/muse/eventlist.cpp +++ b/muse/muse/eventlist.cpp @@ -25,7 +25,7 @@  //   readEventList  //--------------------------------------------------------- -void EventListData::read(QDomNode node, bool midi) +void EventList::read(QDomNode node, bool midi)        {        for (; !node.isNull(); node = node.nextSibling()) {              QDomElement e = node.toElement(); @@ -46,12 +46,12 @@ void EventListData::read(QDomNode node, bool midi)  //   add  //--------------------------------------------------------- -iEvent EventListData::add(Event& event, unsigned tick) +iEvent EventList::add(Event& event, unsigned tick)        {        return std::multimap<unsigned, Event, std::less<unsigned> >::insert(std::pair<const unsigned, Event> (tick, event));        } -iEvent EventListData::add(Event& event) +iEvent EventList::add(Event& event)        {        return add(event, event.tick());        } @@ -60,7 +60,7 @@ iEvent EventListData::add(Event& event)  //   move  //--------------------------------------------------------- -void EventListData::move(Event& event, unsigned tick) +void EventList::move(Event& event, unsigned tick)        {        iEvent i = find(event);        erase(i); @@ -71,7 +71,7 @@ void EventListData::move(Event& event, unsigned tick)  //   find  //--------------------------------------------------------- -iEvent EventListData::find(const Event& event) +iEvent EventList::find(const Event& event)        {        EventRange range = equal_range(event.tick());        for (iEvent i = range.first; i != range.second; ++i) { @@ -85,7 +85,7 @@ iEvent EventListData::find(const Event& event)  //   dump  //--------------------------------------------------------- -void EventListData::dump() const +void EventList::dump() const        {        for (ciEvent i = begin(); i != end(); ++i)              i->second.dump(); diff --git a/muse/muse/midiedit/miditracker.cpp b/muse/muse/midiedit/miditracker.cpp index 0b3e2652..af87d513 100644 --- a/muse/muse/midiedit/miditracker.cpp +++ b/muse/muse/midiedit/miditracker.cpp @@ -107,8 +107,8 @@ MidiTrackerEditor::MidiTrackerEditor(PartList* pl, bool /*init*/)    //-------------    //timing matrix    //------------- -  TimingPattern* timingPattern = -    new TimingPattern(this, "Timing", firstTick, lastTick, _quant); +//  TimingPattern* timingPattern = +//    new TimingPattern(this, "Timing", firstTick, lastTick, _quant);    //---------------    //tracks matrices diff --git a/muse/muse/midiedit/trackpattern.cpp b/muse/muse/midiedit/trackpattern.cpp index ee560e16..3a1fae64 100644 --- a/muse/muse/midiedit/trackpattern.cpp +++ b/muse/muse/midiedit/trackpattern.cpp @@ -237,7 +237,7 @@ bool VoicePat::isFreeSpace(const Event* e, unsigned tick) {  //----------------------------------------------------------  // CtrlPat  //---------------------------------------------------------- -CtrlPat::CtrlPat(QString name) { +CtrlPat::CtrlPat(QString /*name*/) {  }  CtrlPat::~CtrlPat() {} @@ -339,7 +339,7 @@ void TrackPattern::add(const Event* e, unsigned tick) {    }  } -void TrackPattern::setQuant(int quant) { +void TrackPattern::setQuant(int /*quant*/) {    //TODO  } diff --git a/muse/muse/midieventbase.h b/muse/muse/midieventbase.h index 5eee7fbe..bace6bec 100644 --- a/muse/muse/midieventbase.h +++ b/muse/muse/midieventbase.h @@ -31,7 +31,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/muse/muse/miditrack.cpp b/muse/muse/miditrack.cpp index 16373e71..f35642bf 100644 --- a/muse/muse/miditrack.cpp +++ b/muse/muse/miditrack.cpp @@ -40,7 +40,6 @@ MidiTrack::MidiTrack()        _delay          = 0;        _len            = 100;          // percent        _compression    = 100;          // percent -      _events         = new EventList;        initMidiController();        recordPart      = 0; @@ -62,23 +61,28 @@ MidiTrack::MidiTrack()  MidiTrack::~MidiTrack()        { -      delete _events;        }  //---------------------------------------------------------  //   newPart  //--------------------------------------------------------- -Part* MidiTrack::newPart(Part*p, bool clone) +Part* MidiTrack::newPart(Part* p, bool clone)        { -      Part* part = clone ? new Part(this, p->events()) : new Part(this); +      Part* part = new Part(this);        if (p) { +            if (clone) +                  part->clone(p->events()); +            else +                  part->ref();              part->setName(p->name());              part->setColorIndex(p->colorIndex());              *(AL::PosLen*)part = *(AL::PosLen*)p;              part->setMute(p->mute());              } +      else +            part->ref();        return part;        } diff --git a/muse/muse/miditrack.h b/muse/muse/miditrack.h index 6424c1d8..6aad602f 100644 --- a/muse/muse/miditrack.h +++ b/muse/muse/miditrack.h @@ -23,6 +23,7 @@  #include "miditrackbase.h"  #include "midififo.h" +#include "event.h"  class Part;  class EventList; @@ -35,7 +36,7 @@ class MidiOut;  class MidiTrack : public MidiTrackBase {        Q_OBJECT -      EventList* _events;        // tmp Events during midi import +      EventList _events;         // tmp Events during midi import        // recording:        MidiFifo recordFifo;       // for event transfer from RT-thread to gui thread @@ -90,7 +91,7 @@ class MidiTrack : public MidiTrackBase {        void recordBeat();        void stopRecording(); -      EventList* events() const           { return _events;   } +      EventList* events()             { return &_events;   }        virtual void read(QDomNode);        virtual void write(Xml&) const; diff --git a/muse/muse/part.cpp b/muse/muse/part.cpp index fa199036..6889f061 100644 --- a/muse/muse/part.cpp +++ b/muse/muse/part.cpp @@ -49,83 +49,32 @@ const char* partColorNames[] = {  CloneList cloneList;  //--------------------------------------------------------- -//   init +//   Part  //--------------------------------------------------------- -void Part::init() +Part::Part(Track* t)        { -      _raster     = -1;		// invalid -      _quant      = -1; -      _xmag       = -1.0; -        _selected   = false;        _mute       = false;        _colorIndex = 0; +      _raster     = -1;		// invalid +      _quant      = -1; +      _xmag       = -1.0;        _fillLen    = 0; -      _events->incARef(1); +      _track      = t; +      _events     = 0;        if (_track->type() == Track::WAVE)              setType(AL::FRAMES);        }  //--------------------------------------------------------- -//   Part -//--------------------------------------------------------- - -Part::Part(Track* t) -      { -      _track      = t; -      _events     = new EventList; -      init(); -      } - -Part::Part(const Part& p) -   : PosLen(p) -      { -      _track      = p._track; -      _selected   = p._selected; -      _mute       = p._mute; -      _colorIndex = p._colorIndex; -      _name       = p._name; -      _events     = p._events; -      _quant      = p._quant; -      _raster     = p._raster; -      _xmag       = p._xmag; -      _fillLen    = p._fillLen; -      } - -Part::Part(const Part& p, EventList* el) -   : PosLen(p) -      { -      _track      = p._track; -      _selected   = p._selected; -      _mute       = p._mute; -      _colorIndex = p._colorIndex; -      _name       = p._name; -      _quant      = p._quant; -      _raster     = p._raster; -      _xmag       = p._xmag; -      _fillLen    = p._fillLen; -      _events     = el; -      _events->incARef(1); -      } - -//--------------------------------------------------------- -//   Part -//--------------------------------------------------------- - -Part::Part(Track* t, EventList* el) -      { -      _track      = t; -      _events     = el; -      init(); -      } - -//--------------------------------------------------------- -//   Part +//   clone  //--------------------------------------------------------- -Part::~Part() +void Part::clone(EventList* e)          { +      _events = e; +      ref();        }  //--------------------------------------------------------- @@ -137,6 +86,11 @@ iEvent Part::addEvent(Event& p)        return _events->add(p);        } +iEvent Part::addEvent(Event& p, unsigned t) +      { +      return _events->add(p, t); +      } +  //---------------------------------------------------------  //   index  //--------------------------------------------------------- @@ -234,28 +188,25 @@ void Part::dump(int n) const  //   Part::write  //--------------------------------------------------------- -void Part::write(Xml& xml) const +void Part::write(Xml& xml)        { -      const EventList* el = events();        int id              = -1;        bool dumpEvents     = true; -      if (isCloned()) { + +      if (isClone()) {              // we have to dump the event list only on first              // incarnation of clone              for (iClone i = cloneList.begin(); i != cloneList.end(); ++i) { -                  if (i->el == el) { +                  if (i->el == _events) {                          id = i->id;                          dumpEvents = false;                          break;                          }                    } -            if (id == -1) { -                  id = cloneList.size(); -                  ClonePart cp(el, id); -                  cloneList.push_back(cp); -                  } +            if (id == -1) +                  cloneList.push_back(ClonePart(_events, cloneList.size()));              }        if (id != -1) @@ -283,7 +234,7 @@ void Part::write(Xml& xml) const        if (_mute)              xml.intTag("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(xml, *this);              }        xml.etag("part"); @@ -297,7 +248,6 @@ void Part::read(QDomNode node)        {        QDomElement e = node.toElement();        int id = e.attribute("cloneId", "-1").toInt(); -      bool containsEvents = false;  	ctrlCanvasList.clear();        for (node = node.firstChild(); !node.isNull(); node = node.nextSibling()) { @@ -330,7 +280,6 @@ void Part::read(QDomNode node)              else if (tag == "fillLen")                    _fillLen = i;              else if (tag == "event") { -                  containsEvents = true;                    EventType type = Wave;                    if (_track->isMidiTrack())                          type = Note; @@ -354,7 +303,7 @@ void Part::read(QDomNode node)                                      mc->addControllerVal(e.dataA(), tick, v);                                      }                                else -                                    _events->add(e); +                                    _events.add(e);                                }                          else  #endif @@ -366,34 +315,54 @@ void Part::read(QDomNode node)              }        if (id != -1) { -            // clone part -            if (containsEvents) { +            bool found = false; +            for (iClone i = cloneList.begin(); i != cloneList.end(); ++i) { +                  if (i->id == id) { +                        if (_events->size()) +                              printf("MusE::internal error: clone part contains events\n"); +                        clone(i->el); +                        found = true; +                        break; +                        } +                  } +            if (!found) {                    // add to cloneList:                    ClonePart cp(_events, id);                    cloneList.push_back(cp);                    } -            else { -                  // replace event list with clone event -                  // list -                  for (iClone i = cloneList.begin(); -                     i != cloneList.end(); ++i) { -                        if (i->id == id) { -                              delete _events; -                              _events = (EventList*)(i->el); -                              _events->incARef(1); -                              break; -                              } -                        } -                  }              }        }  //--------------------------------------------------------- -//   isCloned -//    return true if this part is cloned +//   isClone +//--------------------------------------------------------- + +bool Part::isClone() const +      {  +      return _events->cloneCount > 1;  +      } + +//--------------------------------------------------------- +//   ref  //--------------------------------------------------------- -bool Part::isCloned() const +void Part::ref()        { -      return _events->arefCount() > 1; +      if (_events == 0) +            _events = new EventList; +      ++(_events->cloneCount);        } + +//--------------------------------------------------------- +//   deref +//--------------------------------------------------------- + +void Part::deref() +      { +      --(_events->cloneCount); +      if (_events->cloneCount <= 0) { +            delete _events; +            _events = 0; +            } +      } + diff --git a/muse/muse/part.h b/muse/muse/part.h index 5f898f1a..8a7c80f0 100644 --- a/muse/muse/part.h +++ b/muse/muse/part.h @@ -33,10 +33,14 @@ namespace AL {  using AL::Xml; +//--------------------------------------------------------- +//   ClonePart +//--------------------------------------------------------- +  struct ClonePart { -      const EventList* el; +      EventList* el;        int id; -      ClonePart(const EventList* e, int i) : el(e), id(i) {} +      ClonePart(EventList* e, int i) : el(e), id(i) {}        };  typedef std::list<ClonePart> CloneList; @@ -74,18 +78,12 @@ class Part : public AL::PosLen {        // auto fill:        int _fillLen;	// = 0 if no auto fill -      void init(); -     protected:        Track* _track;        EventList* _events;     public:        Part(Track*); -      Part(Track*, EventList*); -      Part(const Part&, EventList*); -      Part(const Part&); -      ~Part();        CtrlCanvasList* getCtrlCanvasList() { return &ctrlCanvasList; } @@ -114,17 +112,21 @@ class Part : public AL::PosLen {        void setXmag(double val)         { _xmag = val;    }        EventList* events() const        { return _events; } -      void setEventList(EventList* e)  { _events = e; } + +      void clone(EventList* e);        iEvent addEvent(Event& p); +      iEvent addEvent(Event& p, unsigned);        int fillLen() const              { return _fillLen; }        void setFillLen(int val)         { _fillLen = val;  }        void read(QDomNode); -      void write(Xml&) const; +      void write(Xml&);        void dump(int n = 0) const; -      bool isCloned() const; +      bool isClone() const; +      void deref(); +      void ref();        };  //--------------------------------------------------------- diff --git a/muse/muse/song.h b/muse/muse/song.h index 6c31c879..895ff3ee 100644 --- a/muse/muse/song.h +++ b/muse/muse/song.h @@ -131,6 +131,7 @@ class Song : public QObject {        int _globalPitchShift;        void readMarker(QDomNode);        void restartJack(); +      void undoPartModify(Part* oPart, Part* nPart, bool undo);     public slots:        void beat(); diff --git a/muse/muse/songpart.cpp b/muse/muse/songpart.cpp index d8177a69..e561476b 100644 --- a/muse/muse/songpart.cpp +++ b/muse/muse/songpart.cpp @@ -80,22 +80,6 @@ void Song::cmdRemovePart(Part* part)        startUndo();        removePart(part);        endUndo(0); -      part->track()->partListChanged(); -      } - -//--------------------------------------------------------- -//   removePart -//--------------------------------------------------------- - -void Song::removePart(Part* part) -      { -      AudioMsg msg; -      msg.id = SEQM_REMOVE_PART; -      msg.p1 = part; -      audio->sendMessage(&msg, false); -      undoOp(UndoOp::DeletePart, part); -      part->events()->incARef(-1); -      updateFlags |= SC_PART_REMOVED;        }  //--------------------------------------------------------- @@ -115,8 +99,26 @@ void Song::cmdRemoveParts()                    	pl.add(ip->second);                    }              } +      startUndo();        for (iPart ip = pl.begin(); ip != pl.end(); ++ip)  		removePart(ip->second); +      endUndo(0); +      } + +//--------------------------------------------------------- +//   removePart +//--------------------------------------------------------- + +void Song::removePart(Part* part) +      { +      AudioMsg msg; +      msg.id = SEQM_REMOVE_PART; +      msg.p1 = part; +      audio->sendMessage(&msg, false); +      undoOp(UndoOp::DeletePart, part); +      updateFlags |= SC_PART_REMOVED; +      part->deref(); +      part->track()->partListChanged();        }  //--------------------------------------------------------- @@ -129,6 +131,7 @@ void Song::cmdChangePart(Part* oldPart, Part* newPart)        startUndo();        changePart(oldPart, newPart);        endUndo(0); +      newPart->track()->partListChanged();        }  //--------------------------------------------------------- @@ -143,7 +146,6 @@ void Song::changePart(Part* oldPart, Part* newPart)        msg.p2 = newPart;        audio->sendMessage(&msg, false);        undoOp(UndoOp::ModifyPart, oldPart, newPart); -      oldPart->events()->incARef(-1);        updateFlags = SC_PART_MODIFIED;        if (len() < newPart->endTick())              setLen(newPart->endTick()); @@ -161,33 +163,32 @@ void Song::cmdChangePart(Part* oPart, unsigned pos, unsigned len)        // move events so they stay at same position in song        //        int delta    = oPart->tick() - pos; -      EventList* d = new EventList(); -      EventList* s = oPart->events(); -      for (iEvent ie = s->begin(); ie != s->end(); ++ie) { +      Part* nPart = new Part(*oPart); +      const EventList* s = oPart->events(); +      for (ciEvent ie = s->begin(); ie != s->end(); ++ie) {              int tick = ie->first + delta;              if (tick >= 0 && tick < int(len)) {                    Event ev = ie->second.clone();                    ev.move(delta); -                  d->add(ev, unsigned(tick)); +                  nPart->addEvent(ev, unsigned(tick));                    }              }        if (oPart->fillLen() > 0 && len < (unsigned)oPart->fillLen())              oPart->setFillLen(len);        if (oPart->lenTick() < len && oPart->fillLen() > 0) { -            unsigned loop = oPart->fillLen(); +            unsigned loop   = oPart->fillLen();              unsigned fillLen = len - oPart->lenTick();              for (unsigned i = 0; i < fillLen / loop; ++i) {                    int start = oPart->lenTick() + loop * i; -                  for (iEvent ie = s->begin(); ie != s->end(); ++ie) { +                  for (ciEvent ie = s->begin(); ie != s->end(); ++ie) {                          if (ie->first >= loop)                                break;                    	Event ev = ie->second.clone();                          ev.move(start); -                        d->add(ev, ie->first + start); +                        nPart->addEvent(ev, ie->first + start);                          }                    }              } -      Part* nPart = new Part(*oPart, d);        nPart->setLenTick(len);        nPart->setTick(pos);        changePart(oPart, nPart); @@ -236,7 +237,7 @@ void Song::cmdLinkPart(Part* sPart, unsigned pos, Track* track)  void Song::cmdCopyPart(Part* sPart, unsigned pos, Track* track)        { -      bool clone = sPart->events()->arefCount() > 1; +      bool clone = sPart->isClone();        Part* dPart = track->newPart(sPart, clone);        dPart->setTick(pos);        if (!clone) { diff --git a/muse/muse/sync.cpp b/muse/muse/sync.cpp index ecef91fe..d089ce80 100644 --- a/muse/muse/sync.cpp +++ b/muse/muse/sync.cpp @@ -43,13 +43,13 @@ bool acceptMC    = true;  bool acceptMMC   = true;  static MTC mtcCurTime; -static int mtcState;    // 0-7 next expected quarter message -static bool mtcValid; -static int mtcLost; -static bool mtcSync;    // receive complete mtc frame? +// static int mtcState;    // 0-7 next expected quarter message +// static bool mtcValid; +// static int mtcLost; +// static bool mtcSync;    // receive complete mtc frame? -static bool mcStart = false; -static int mcStartTick; +//static bool mcStart = false; +//static int mcStartTick;  enum {        MMC_STOP = 1, diff --git a/muse/muse/undo.cpp b/muse/muse/undo.cpp index 66315a78..403227ac 100644 --- a/muse/muse/undo.cpp +++ b/muse/muse/undo.cpp @@ -151,13 +151,13 @@ void Song::doUndo2()                          Part* part = i->oPart;                          part->track()->parts()->remove(part);                          updateFlags |= SC_PART_REMOVED; -                        i->oPart->events()->incARef(-1); +                        part->deref();                          }                          break;                    case UndoOp::DeletePart:                          i->oPart->track()->addPart(i->oPart);                          updateFlags |= SC_PART_INSERTED; -                        i->oPart->events()->incARef(1); +                        i->oPart->ref();                          break;                    case UndoOp::ModifyPart:                          { @@ -166,6 +166,8 @@ void Song::doUndo2()                          Part part = *newPart;                          *newPart  = *oldPart;                          *oldPart  = part; +//                        oldPart->deref(); +//                        newPart->ref();                          updateFlags |= SC_PART_MODIFIED;                          }                          break; @@ -245,14 +247,14 @@ void Song::doRedo2()                    case UndoOp::AddPart:                          i->oPart->track()->addPart(i->oPart);                          updateFlags |= SC_PART_INSERTED; -                        i->oPart->events()->incARef(1); +                        i->oPart->ref();                          break;                    case UndoOp::DeletePart:                          {                          Part* part = i->oPart;                          part->track()->parts()->remove(part);                          updateFlags |= SC_PART_REMOVED; -                        i->oPart->events()->incARef(-1); +                        part->deref();                          }                          break;                    case UndoOp::ModifyPart: @@ -263,6 +265,8 @@ void Song::doRedo2()                          *newPart  = *oldPart;                          *oldPart  = part;                          updateFlags |= SC_PART_MODIFIED; +//                        oldPart->ref(); +//                        newPart->deref();                          }                          break;                    case UndoOp::AddEvent: @@ -410,6 +414,7 @@ void Song::addUndo(UndoOp& i)        {        if (!undoMode) {              printf("internal error: undoOp without startUndo()\n"); +abort();              return;              }        undoList->back().push_back(i); @@ -470,8 +475,8 @@ void Song::doUndo3()                                }                          break;                    case UndoOp::ModifyPart: -                        if (i->oPart->track() != i->nPart->track()) -                              i->nPart->track()->partListChanged(); +                        undoPartModify(i->oPart, i->nPart, true); +                    case UndoOp::AddPart:                    case UndoOp::DeletePart:                          i->oPart->track()->partListChanged(); @@ -542,8 +547,8 @@ void Song::doRedo3()                          removeTrack3(i->track);                          break;                    case UndoOp::ModifyPart: -                        if (i->oPart->track() != i->nPart->track()) -                              i->nPart->track()->partListChanged(); +                        undoPartModify(i->oPart, i->nPart, false); +                    case UndoOp::AddPart:                    case UndoOp::DeletePart:                          i->oPart->track()->partListChanged(); @@ -562,3 +567,39 @@ void Song::doRedo3()        dirty = true;        } +//--------------------------------------------------------- +//   undoPartModify +//--------------------------------------------------------- + +void Song::undoPartModify(Part* oPart, Part* nPart, bool undo) +      { +      if (oPart->track() != nPart->track()) +            nPart->track()->partListChanged(); +      // +      // look for cloned part +      // +      for (iMidiTrack i = _midis.begin(); i != _midis.end(); ++i) { +            PartList* pl = (*i)->parts(); +            for (iPart ip = pl->begin(); ip != pl->end(); ++ip) { +                  Part* p = ip->second; +                  if (undo) { +                        if (p == nPart) +                              continue; +                        if (p->events() == nPart->events()) { +                              // this is a cloned Part +                              p->ref(); +                              return; +                              } +                        } +                  else { +                        if (p == oPart) +                              continue; +                        if (p->events() == oPart->events()) { +                              p->deref(); +                              return; +                              } +                        } +                  } +            } +      } + diff --git a/muse/muse/waveevent.h b/muse/muse/waveevent.h index e0c681fd..079c4425 100644 --- a/muse/muse/waveevent.h +++ b/muse/muse/waveevent.h @@ -33,7 +33,7 @@ class WaveEventBase : public EventBase {        int _spos;        // start sample position in WaveFile        bool deleted; -      virtual EventBase* clone() { return new WaveEventBase(*this); } +      virtual EventBase* clone() const { return new WaveEventBase(*this); }     public:        WaveEventBase(EventType t); diff --git a/muse/muse/wavetrack.cpp b/muse/muse/wavetrack.cpp index c022c3c1..14f2ef4a 100644 --- a/muse/muse/wavetrack.cpp +++ b/muse/muse/wavetrack.cpp @@ -170,8 +170,10 @@ void WaveTrack::read(QDomNode node)  Part* WaveTrack::newPart(Part*p, bool clone)        { -      Part* part = clone ? new Part(this, p->events()) : new Part(this); +      Part* part = new Part(this);        if (p) { +            if (clone) +                  part->clone(p->events());              part->setName(p->name());              part->setColorIndex(p->colorIndex());  | 
