29 #include "ardour/debug.h"
72 , _note_mode(other->_note_mode)
82 :
Playlist (other, start, dur, name, hidden)
83 , _note_mode(other->_note_mode)
92 template<
typename Time>
115 typedef pair<MidiStateTracker*,framepos_t> TrackerInfo;
120 string_compose (
"---- MidiPlaylist::read %1 .. %2 (%3 trackers) ----\n",
125 t->second->fixer.emit(dst,
_read_end, t->second->tracker);
130 std::vector< boost::shared_ptr<Region> > regs;
131 std::vector< boost::shared_ptr<Region> > ended;
133 switch ((*i)->coverage (start, end)) {
142 ended.push_back (*i);
148 ended.push_back (*i);
159 const bool direct_read = regs.size() == 1 &&
160 (ended.empty() || (ended.size() == 1 && ended.front() == regs.front()));
166 string_compose (
"\t%1 regions to read, direct: %2\n", regs.size(), direct_read));
176 bool new_tracker =
false;
196 if (find (ended.begin(), ended.end(), *i) != ended.end()) {
201 string_compose (
"\t%1 ended, resolve notes and delete (%2) tracker\n",
202 mr->
name(), ((new_tracker) ?
"new" :
"old")));
218 if (!direct_read && !evlist.empty()) {
256 t->second->fixer.prepare(
276 n->second->tracker.resolve_notes(dst, time);
310 cerr <<
"Playlist \"" <<
_name <<
"\" " << endl
316 cerr <<
" " << r->
name() <<
" @ " << r <<
" ["
339 RegionList::iterator i;
340 RegionList::iterator tmp;
347 if ((*i) == region) {
365 set<Evoral::Parameter>
373 set<Evoral::Parameter> ret;
378 for (Automatable::Controls::iterator c = mr->
model()->controls().begin();
379 c != mr->
model()->controls().end(); ++c) {
380 ret.insert(c->first);
bool transport_rolling() const
EventType event_type() const
ARDOUR::Session & _session
virtual uint32_t write(Time time, EventType type, uint32_t size, const uint8_t *buf)=0
static bool second_simultaneous_midi_byte_is_first(uint8_t, uint8_t)
void remove_dependents(boost::shared_ptr< Region > region)
const std::string & value() const
framecnt_t read_at(Evoral::EventSink< framepos_t > &dst, framepos_t position, framecnt_t dur, uint32_t chan_n=0, NoteMode mode=Sustained, MidiStateTracker *tracker=0, MidiChannelFilter *filter=0) const
framecnt_t read(Evoral::EventSink< framepos_t > &buf, framepos_t start, framecnt_t cnt, uint32_t chan_n=0, MidiChannelFilter *filter=NULL)
LIBARDOUR_API PBD::PropertyDescriptor< bool > hidden
Container::iterator begin()
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r)
bool destroy_region(boost::shared_ptr< Region >)
void region_edited(boost::shared_ptr< Region > region, const MidiModel::NoteDiffCommand *cmd)
MidiPlaylist(Session &, const XMLNode &, bool hidden=false)
LIBARDOUR_API uint64_t MidiPlaylistIO
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
void thaw(bool from_undo=false)
int set_state(const XMLNode &, int version)
void resolve_notes(MidiBuffer &buffer, framepos_t time)
XMLProperty * property(const char *)
Container::iterator end()
Container::iterator erase(typename Container::iterator i)
MidiStateTracker tracker
Active note tracker.
void notify_region_removed(boost::shared_ptr< Region >)
#define DEBUG_TRACE(bits, str)
RegionListProperty regions
static int loading_state_version
PBD::Property< std::string > _name
void reset_note_trackers()
framepos_t position() const
virtual int set_state(const XMLNode &, int version)
Container::size_type size() const
bool parameter_is_midi(AutomationType type)
void resolve_note_trackers(Evoral::EventSink< framepos_t > &dst, framepos_t time)
LIBARDOUR_API uint64_t MidiTrackers
framecnt_t length() const
boost::shared_ptr< MidiSource > midi_source(uint32_t n=0) const
const uint8_t * buffer() const
NoteTrackers _note_trackers
std::set< Evoral::Parameter > contained_automation()
boost::shared_ptr< MidiModel > model()
std::string string_compose(const std::string &fmt, const T1 &o1)
framepos_t last_frame() const