30 #include <glibmm/fileutils.h>
31 #include <glibmm/miscutils.h>
40 #include "ardour/debug.h"
58 PBD::Signal1<void,MidiSource*> MidiSource::MidiSourceCreated;
63 , _model_iter_valid(false)
67 , _capture_loop_length(0)
74 , _model_iter_valid(false)
78 , _capture_loop_length(0)
117 if ((prop = node.
property (
"captured-for")) != 0) {
123 if ((*i)->name() ==
X_(
"InterpolationStyle")) {
124 if ((prop = (*i)->property (
X_(
"parameter"))) == 0) {
125 error <<
_(
"Missing parameter property on InterpolationStyle") <<
endmsg;
130 if ((prop = (*i)->property (
X_(
"style"))) == 0) {
131 error <<
_(
"Missing style property on InterpolationStyle") <<
endmsg;
138 }
else if ((*i)->name() ==
X_(
"AutomationState")) {
139 if ((prop = (*i)->property (
X_(
"parameter"))) == 0) {
140 error <<
_(
"Missing parameter property on AutomationState") <<
endmsg;
145 if ((prop = (*i)->property (
X_(
"state"))) == 0) {
146 error <<
_(
"Missing state property on AutomationState") <<
endmsg;
195 const std::set<Evoral::Parameter>& filtered)
const
200 string_compose (
"MidiSource::midi_read() %5 sstart %1 start %2 cnt %3 tracker %4\n",
201 source_start, start, cnt, tracker,
name()));
209 i =
_model->begin(converter.from(start),
false, filtered,
210 linear_read ? &
_model->active_notes() : NULL);
213 _model->active_notes().clear();
220 for (; i !=
_model->end(); ++i) {
221 const framecnt_t time_frames = converter.to(i->time());
222 if (time_frames < start + cnt) {
223 if (filter && filter->
filter(i->buffer(), i->size())) {
226 _name, time_frames + source_start, i->event_type(), i->size()));
231 dst.
write (time_frames + source_start, i->event_type(), i->size(), i->buffer());
235 _name, time_frames + source_start, i->event_type(), i->size()));
243 _name, time_frames, start+cnt));
249 return read_unlocked (lm, dst, source_start, start, cnt, tracker, filter);
275 _model->set_note_mode (mode);
319 _model->end_write (option, end);
322 for (MidiModel::Controls::iterator i =
_model->controls().begin(); i !=
_model->controls().end(); ++i) {
323 if (i->second->list()) {
351 _model->write_to (newsrc, newsrc_lock);
353 _model->write_section_to (newsrc, newsrc_lock, begin, end);
410 _model->set_note_mode(mode);
ARDOUR::Session & _session
virtual uint32_t write(Time time, EventType type, uint32_t size, const uint8_t *buf)=0
virtual void mark_streaming_midi_write_started(const Lock &lock, NoteMode mode)
virtual framecnt_t midi_read(const Lock &lock, Evoral::EventSink< framepos_t > &dst, framepos_t source_start, framepos_t start, framecnt_t cnt, MidiStateTracker *tracker, MidiChannelFilter *filter, const std::set< Evoral::Parameter > &filtered) const
const std::string & value() const
void mark_write_starting_now(framecnt_t position, framecnt_t capture_length, framecnt_t loop_length)
virtual framecnt_t midi_write(const Lock &lock, MidiRingBuffer< framepos_t > &src, framepos_t source_start, framecnt_t cnt)
LIBEVORAL_API const Beats MaxBeats
Glib::Threads::Mutex::Lock Lock
PBD::Signal2< void, Evoral::Parameter, AutoState > AutomationStateChanged
PBD::Signal0< void > ModelChanged
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r)
void set_model(const Glib::Threads::Mutex::Lock &lock, boost::shared_ptr< MidiModel >)
virtual void update_length(framecnt_t)
std::string _captured_for
framepos_t _capture_length
virtual void mark_streaming_write_completed(const Lock &lock)
AutoState automation_state_of(Evoral::Parameter) const
void set_interpolation_of(Evoral::Parameter, Evoral::ControlList::InterpolationStyle)
void set_automation_state_of(Evoral::Parameter, AutoState)
void track(const MidiBuffer::const_iterator &from, const MidiBuffer::const_iterator &to)
LIBPBD_API Transmitter error
PBD::Signal2< void, Evoral::Parameter, Evoral::ControlList::InterpolationStyle > InterpolationChanged
const XMLNodeList & children(const std::string &str=std::string()) const
framepos_t _timeline_position
LIBEVORAL_API const Beats MinBeats
void drop_model(const Glib::Threads::Mutex::Lock &lock)
std::ostream & endmsg(std::ostream &ostr)
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
XMLNode * add_child(const char *)
Evoral::ControlList::InterpolationStyle interpolation_of(const Evoral::Parameter ¶m)
virtual framecnt_t write_unlocked(const Lock &lock, MidiRingBuffer< framepos_t > &source, framepos_t position, framecnt_t cnt)=0
int write_to(const Lock &lock, boost::shared_ptr< MidiSource > newsrc, Evoral::Beats begin=Evoral::MinBeats, Evoral::Beats end=Evoral::MaxBeats)
std::list< XMLNode * > XMLNodeList
virtual void set_timeline_position(framepos_t pos)
XMLProperty * property(const char *)
virtual bool empty() const
#define string_2_enum(str, e)
void copy_interpolation_from(boost::shared_ptr< MidiSource >)
AutomationStateMap _automation_state
Evoral::Beats _length_beats
#define DEBUG_TRACE(bits, str)
virtual void flush_midi(const Lock &lock)=0
bool sync_to_source(const Glib::Threads::Mutex::Lock &source_lock)
static EventTypeMap & instance()
Evoral::ControlList::InterpolationStyle interpolation_of(Evoral::Parameter) const
void filter(BufferSet &bufs)
Evoral::Parameter from_symbol(const std::string &str) const
static int loading_state_version
PBD::Property< std::string > _name
framepos_t _last_read_end
framepos_t _capture_loop_length
XMLProperty * add_property(const char *name, const std::string &value)
Glib::Threads::Mutex & mutex()
virtual void mark_streaming_write_started(const Lock &lock)
LIBARDOUR_API uint64_t MidiSourceIO
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > position
void copy_automation_state_from(boost::shared_ptr< MidiSource >)
Evoral::Sequence< Evoral::Beats >::const_iterator _model_iter
int set_state(const XMLNode &, int version)
virtual framecnt_t length(framepos_t pos) const
virtual void load_model(const Glib::Threads::Mutex::Lock &lock, bool force_reload=false)=0
virtual framecnt_t read_unlocked(const Lock &lock, Evoral::EventSink< framepos_t > &dst, framepos_t position, framepos_t start, framecnt_t cnt, MidiStateTracker *tracker, MidiChannelFilter *filter) const =0
static const framecnt_t max_framecnt
Glib::Threads::Mutex _lock
framepos_t to(Evoral::Beats beats) const
virtual void mark_midi_streaming_write_completed(const Lock &lock, Evoral::Sequence< Evoral::Beats >::StuckNoteOption stuck_option, Evoral::Beats when=Evoral::Beats())
MidiSource(Session &session, std::string name, Source::Flag flags=Source::Flag(0))
void set_note_mode(const Glib::Threads::Mutex::Lock &lock, NoteMode mode)
boost::shared_ptr< MidiModel > _model
XMLNodeList::const_iterator XMLNodeConstIterator
InterpolationStyleMap _interpolation_style
std::string string_compose(const std::string &fmt, const T1 &o1)
virtual void session_saved()
void invalidate(const Glib::Threads::Mutex::Lock &lock, std::set< Evoral::Sequence< Evoral::Beats >::WeakNotePtr > *notes=NULL)