X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_region.cc;h=7bb995337f64bbf7225773e28bd1350b9c8a144f;hb=7d96960b162d25da87c388a3083775e8770bba56;hp=9b7a4b87480471c17a01a30d01c4d72d356559f1;hpb=33da74c8e353ac56194956cae8e2b7d74ec1a1b0;p=ardour.git diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc index 9b7a4b8748..7bb995337f 100644 --- a/libs/ardour/midi_region.cc +++ b/libs/ardour/midi_region.cc @@ -24,8 +24,6 @@ #include -#include -#include #include @@ -47,13 +45,14 @@ using namespace std; using namespace ARDOUR; +using namespace PBD; /** Basic MidiRegion constructor (one channel) */ MidiRegion::MidiRegion (boost::shared_ptr src, nframes_t start, nframes_t length) : Region (src, start, length, PBD::basename_nosuffix(src->name()), DataType::MIDI, 0, Region::Flag(Region::DefaultFlags|Region::External)) { assert(_name.find("/") == string::npos); - midi_source(0)->Switched.connect(sigc::mem_fun(this, &MidiRegion::switch_source)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); } /* Basic MidiRegion constructor (one channel) */ @@ -61,7 +60,7 @@ MidiRegion::MidiRegion (boost::shared_ptr src, nframes_t start, nfra : Region (src, start, length, name, DataType::MIDI, layer, flags) { assert(_name.find("/") == string::npos); - midi_source(0)->Switched.connect(sigc::mem_fun(this, &MidiRegion::switch_source)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); } /* Basic MidiRegion constructor (many channels) */ @@ -69,7 +68,7 @@ MidiRegion::MidiRegion (const SourceList& srcs, nframes_t start, nframes_t lengt : Region (srcs, start, length, name, DataType::MIDI, layer, flags) { assert(_name.find("/") == string::npos); - midi_source(0)->Switched.connect(sigc::mem_fun(this, &MidiRegion::switch_source)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); } @@ -78,14 +77,14 @@ MidiRegion::MidiRegion (boost::shared_ptr other, nframes_t off : Region (other, offset, length, name, layer, flags) { assert(_name.find("/") == string::npos); - midi_source(0)->Switched.connect(sigc::mem_fun(this, &MidiRegion::switch_source)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); } MidiRegion::MidiRegion (boost::shared_ptr other) : Region (other) { assert(_name.find("/") == string::npos); - midi_source(0)->Switched.connect(sigc::mem_fun(this, &MidiRegion::switch_source)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); } MidiRegion::MidiRegion (boost::shared_ptr src, const XMLNode& node) @@ -95,7 +94,7 @@ MidiRegion::MidiRegion (boost::shared_ptr src, const XMLNode& node) throw failed_constructor(); } - midi_source(0)->Switched.connect(sigc::mem_fun(this, &MidiRegion::switch_source)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); assert(_name.find("/") == string::npos); assert(_type == DataType::MIDI); } @@ -107,7 +106,7 @@ MidiRegion::MidiRegion (const SourceList& srcs, const XMLNode& node) throw failed_constructor(); } - midi_source(0)->Switched.connect(sigc::mem_fun(this, &MidiRegion::switch_source)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); assert(_name.find("/") == string::npos); assert(_type == DataType::MIDI); } @@ -119,18 +118,18 @@ MidiRegion::~MidiRegion () void MidiRegion::set_position_internal (nframes_t pos, bool allow_bbt_recompute) { - BeatsFramesConverter old_converter(_session, _position - _start); + BeatsFramesConverter old_converter(_session.tempo_map(), _position - _start); double length_beats = old_converter.from(_length); Region::set_position_internal(pos, allow_bbt_recompute); - BeatsFramesConverter new_converter(_session, pos - _start); + BeatsFramesConverter new_converter(_session.tempo_map(), pos - _start); set_length(new_converter.to(length_beats), 0); } nframes_t -MidiRegion::read_at (MidiRingBuffer& out, sframes_t position, nframes_t dur, uint32_t chan_n, NoteMode mode, MidiStateTracker* tracker) const +MidiRegion::read_at (Evoral::EventSink& out, sframes_t position, nframes_t dur, uint32_t chan_n, NoteMode mode, MidiStateTracker* tracker) const { return _read_at (_sources, out, position, dur, chan_n, mode, tracker); } @@ -142,9 +141,8 @@ MidiRegion::master_read_at (MidiRingBuffer& out, sframes_t position, } nframes_t -MidiRegion::_read_at (const SourceList& /*srcs*/, - MidiRingBuffer& dst, sframes_t position, nframes_t dur, uint32_t chan_n, - NoteMode mode, MidiStateTracker* tracker) const +MidiRegion::_read_at (const SourceList& /*srcs*/, Evoral::EventSink& dst, sframes_t position, nframes_t dur, uint32_t chan_n, + NoteMode mode, MidiStateTracker* tracker) const { nframes_t internal_offset = 0; nframes_t src_offset = 0; @@ -154,6 +152,10 @@ MidiRegion::_read_at (const SourceList& /*srcs*/, assert(chan_n == 0); + if (muted()) { + return 0; /* read nothing */ + } + if (position < _position) { internal_offset = 0; src_offset = _position - position; @@ -171,13 +173,6 @@ MidiRegion::_read_at (const SourceList& /*srcs*/, return 0; /* read nothing */ } - // FIXME: non-opaque MIDI regions not yet supported - assert(opaque()); - - if (muted()) { - return 0; /* read nothing */ - } - _read_data_count = 0; boost::shared_ptr src = midi_source(chan_n); @@ -194,14 +189,13 @@ MidiRegion::_read_at (const SourceList& /*srcs*/, negative_output_buffer_position = _start; } -#if 0 - cerr << "\t\tsource read from " << _position << " - " << _start << " (" << _position - _start << ") " - << " start in source " << _start << " + " << internal_offset << " (" << _start + internal_offset << ") " - << " dur = " << to_read - << " offset = " << output_buffer_position - << " negoffset = " << negative_output_buffer_position - << endl; -#endif + /*cerr << "MR read @ " << position << " * " << to_read + << " _position = " << _position + << " _start = " << _start + << " offset = " << output_buffer_position + << " negoffset = " << negative_output_buffer_position + << " intoffset = " << internal_offset + << endl;*/ if (src->midi_read ( dst, // destination buffer