/* Copyright (C) 2006 Paul Davis Written by Dave Robillard, 2006 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include "evoral/EventList.hpp" #include "ardour/debug.h" #include "ardour/types.h" #include "ardour/configuration.h" #include "ardour/midi_playlist.h" #include "ardour/midi_region.h" #include "ardour/session.h" #include "ardour/midi_ring_buffer.h" #include "pbd/error.h" #include "i18n.h" using namespace ARDOUR; using namespace sigc; using namespace std; MidiPlaylist::MidiPlaylist (Session& session, const XMLNode& node, bool hidden) : Playlist (session, node, DataType::MIDI, hidden) , _note_mode(Sustained) { const XMLProperty* prop = node.property("type"); assert(prop && DataType(prop->value()) == DataType::MIDI); in_set_state++; set_state (node, Stateful::loading_state_version); in_set_state--; } MidiPlaylist::MidiPlaylist (Session& session, string name, bool hidden) : Playlist (session, name, DataType::MIDI, hidden) { } MidiPlaylist::MidiPlaylist (boost::shared_ptr other, string name, bool hidden) : Playlist (other, name, hidden) { throw; // nope /* list::const_iterator in_o = other.regions.begin(); list::iterator in_n = regions.begin(); while (in_o != other.regions.end()) { MidiRegion *ar = dynamic_cast( (*in_o) ); for (list::const_iterator xfades = other._crossfades.begin(); xfades != other._crossfades.end(); ++xfades) { if ( &(*xfades)->in() == ar) { // We found one! Now copy it! list::const_iterator out_o = other.regions.begin(); list::const_iterator out_n = regions.begin(); while (out_o != other.regions.end()) { MidiRegion *ar2 = dynamic_cast( (*out_o) ); if ( &(*xfades)->out() == ar2) { MidiRegion *in = dynamic_cast( (*in_n) ); MidiRegion *out = dynamic_cast( (*out_n) ); Crossfade *new_fade = new Crossfade( *(*xfades), in, out); add_crossfade(*new_fade); break; } out_o++; out_n++; } // cerr << "HUH!? second region in the crossfade not found!" << endl; } } in_o++; in_n++; } */ } MidiPlaylist::MidiPlaylist (boost::shared_ptr other, nframes_t start, nframes_t dur, string name, bool hidden) : Playlist (other, start, dur, name, hidden) { /* this constructor does NOT notify others (session) */ } MidiPlaylist::~MidiPlaylist () { GoingAway (); /* EMIT SIGNAL */ /* drop connections to signals */ notify_callbacks (); } struct RegionSortByLayer { bool operator() (boost::shared_ptr a, boost::shared_ptr b) { return a->layer() < b->layer(); } }; template struct EventsSortByTime { bool operator() (Evoral::Event