*/
-#include <set>
-#include <iostream>
#include <algorithm>
+#include <iostream>
+#include <set>
#include <stdexcept>
#include <stdint.h>
-#include "pbd/error.h"
-#include "pbd/enumwriter.h"
+
#include "pbd/compose.h"
+#include "pbd/enumwriter.h"
+#include "pbd/error.h"
+
+#include "evoral/Control.hpp"
+
#include "midi++/events.h"
+#include "ardour/automation_control.h"
+#include "ardour/midi_automation_list_binder.h"
#include "ardour/midi_model.h"
#include "ardour/midi_source.h"
#include "ardour/midi_state_tracker.h"
-#include "ardour/smf_source.h"
-#include "ardour/types.h"
#include "ardour/session.h"
-#include "ardour/midi_automation_list_binder.h"
+#include "ardour/types.h"
#include "i18n.h"
unsigned int note;
XMLProperty* prop;
unsigned int channel;
- unsigned int time;
- unsigned int length;
+ MidiModel::TimeType time;
+ MidiModel::TimeType length;
unsigned int velocity;
gint id;
{
MidiModel::WriteLock lock (_model->edit_lock ());
+ for (list<SysExPtr>::iterator i = _removed.begin(); i != _removed.end(); ++i) {
+ _model->remove_sysex_unlocked (*i);
+ }
+
for (ChangeList::iterator i = _changes.begin(); i != _changes.end(); ++i) {
switch (i->property) {
case Time:
{
MidiModel::WriteLock lock (_model->edit_lock ());
+ for (list<SysExPtr>::iterator i = _removed.begin(); i != _removed.end(); ++i) {
+ _model->add_sysex_unlocked (*i);
+ }
+
for (ChangeList::iterator i = _changes.begin(); i != _changes.end(); ++i) {
switch (i->property) {
case Time:
_model->ContentsChanged(); /* EMIT SIGNAL */
}
+void
+MidiModel::SysExDiffCommand::remove (SysExPtr sysex)
+{
+ _removed.push_back(sysex);
+}
+
XMLNode&
MidiModel::SysExDiffCommand::marshal_change (const Change& change)
{
boost::shared_ptr<MidiSource> ms = _midi_source.lock ();
assert (ms);
- Glib::Mutex::Lock* source_lock = new Glib::Mutex::Lock (ms->mutex());
+ Glib::Threads::Mutex::Lock* source_lock = new Glib::Threads::Mutex::Lock (ms->mutex());
ms->invalidate(); // Release cached iterator's read lock on model
return WriteLock(new WriteLockImpl(source_lock, _lock, _control_lock));
}
void
MidiModel::source_interpolation_changed (Evoral::Parameter p, Evoral::ControlList::InterpolationStyle s)
{
- Glib::Mutex::Lock lm (_control_lock);
+ Glib::Threads::Mutex::Lock lm (_control_lock);
control(p)->list()->set_interpolation (s);
}
void
MidiModel::source_automation_state_changed (Evoral::Parameter p, AutoState s)
{
- Glib::Mutex::Lock lm (_control_lock);
+ Glib::Threads::Mutex::Lock lm (_control_lock);
boost::shared_ptr<AutomationList> al = boost::dynamic_pointer_cast<AutomationList> (control(p)->list ());
al->set_automation_state (s);
}
return _midi_source.lock ();
}
-/** Moves notes, controllers and sys-ex to insert silence at the start of the model.
+/** Moves notes, patch changes, controllers and sys-ex to insert silence at the start of the model.
* Adds commands to the session's current undo stack to reflect the movements.
*/
void
apply_command_as_subcommand (s->session(), c);
}
+ /* Patch changes */
+
+ if (!patch_changes().empty ()) {
+ PatchChangeDiffCommand* c = new_patch_change_diff_command ("insert silence");
+
+ for (PatchChanges::const_iterator i = patch_changes().begin(); i != patch_changes().end(); ++i) {
+ c->change_time (*i, (*i)->time() + t);
+ }
+
+ apply_command_as_subcommand (s->session(), c);
+ }
+
/* Controllers */
for (Controls::iterator i = controls().begin(); i != controls().end(); ++i) {