case StartTime:
fatal << "MidiModel::DiffCommand::change() with integer argument called for start time" << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
break;
case Length:
fatal << "MidiModel::DiffCommand::change() with integer argument called for length" << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
break;
}
break;
case StartTime:
- if (Evoral::musical_time_equal (note->time(), new_time)) {
+ if (note->time() == new_time) {
return;
}
change.old_time = note->time();
break;
case Length:
- if (Evoral::musical_time_equal (note->length(), new_time)) {
+ if (note->length() == new_time) {
return;
}
change.old_time = note->length();
time_str >> time;
} else {
warning << "note information missing time" << endmsg;
- time = 0;
+ time = MidiModel::TimeType();
}
if ((prop = xml_note->property("length")) != 0) {
length_str >> length;
} else {
warning << "note information missing length" << endmsg;
- length = 1;
+ length = MidiModel::TimeType(1);
}
if ((prop = xml_note->property("velocity")) != 0) {
change.property = (Property) string_2_enum (prop->value(), change.property);
} else {
fatal << "!!!" << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
if ((prop = xml_change->property ("id")) == 0) {
}
} else {
fatal << "!!!" << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
if ((prop = xml_change->property ("new")) != 0) {
}
} else {
fatal << "!!!" << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
/* we must point at the instance of the note that is actually in the model.
change.property = (Property) string_2_enum (prop->value(), change.property);
} else {
fatal << "!!!" << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
if ((prop = xml_change->property ("id")) == 0) {
old_str >> change.old_time;
} else {
fatal << "!!!" << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
if ((prop = xml_change->property ("new")) != 0) {
new_str >> change.new_time;
} else {
fatal << "!!!" << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
/* we must point at the instance of the sysex that is actually in the model.
MidiModel::PatchChangeDiffCommand::unmarshal_patch_change (XMLNode* n)
{
XMLProperty* prop;
- Evoral::event_id_t id;
- Evoral::MusicalTime time = 0;
+ Evoral::event_id_t id = 0;
+ Evoral::MusicalTime time = Evoral::MusicalTime();
int channel = 0;
int program = 0;
int bank = 0;
}
PatchChangePtr p (new Evoral::PatchChange<TimeType> (time, channel, program, bank));
+ assert(id);
p->set_id (id);
return p;
}
* `Discrete' mode).
*/
bool
-MidiModel::write_to (boost::shared_ptr<MidiSource> source)
+MidiModel::write_to (boost::shared_ptr<MidiSource> source,
+ const Glib::Threads::Mutex::Lock& source_lock)
{
ReadLock lock(read_lock());
const bool old_percussive = percussive();
set_percussive(false);
- boost::shared_ptr<MidiSource> ms = _midi_source.lock ();
- assert (ms);
+ source->drop_model(source_lock);
+ source->mark_streaming_midi_write_started (source_lock, note_mode());
- source->drop_model();
- source->mark_streaming_midi_write_started (note_mode());
-
- for (Evoral::Sequence<TimeType>::const_iterator i = begin(0, true); i != end(); ++i) {
- source->append_event_unlocked_beats(*i);
+ for (Evoral::Sequence<TimeType>::const_iterator i = begin(TimeType(), true); i != end(); ++i) {
+ source->append_event_beats(source_lock, *i);
}
set_percussive(old_percussive);
- source->mark_streaming_write_completed();
+ source->mark_streaming_write_completed(source_lock);
set_edited(false);
of the model.
*/
bool
-MidiModel::sync_to_source ()
+MidiModel::sync_to_source (const Glib::Threads::Mutex::Lock& source_lock)
{
ReadLock lock(read_lock());
set_percussive(false);
boost::shared_ptr<MidiSource> ms = _midi_source.lock ();
- assert (ms);
+ if (!ms) {
+ error << "MIDI model has no source to sync to" << endmsg;
+ return false;
+ }
- ms->mark_streaming_midi_write_started (note_mode());
+ ms->mark_streaming_midi_write_started (source_lock, note_mode());
- for (Evoral::Sequence<TimeType>::const_iterator i = begin(0, true); i != end(); ++i) {
- ms->append_event_unlocked_beats(*i);
+ for (Evoral::Sequence<TimeType>::const_iterator i = begin(TimeType(), true); i != end(); ++i) {
+ ms->append_event_beats(source_lock, *i);
}
set_percussive (old_percussive);
- ms->mark_streaming_write_completed ();
+ ms->mark_streaming_write_completed (source_lock);
set_edited (false);
* destroying the original note durations.
*/
bool
-MidiModel::write_section_to (boost::shared_ptr<MidiSource> source, Evoral::MusicalTime begin_time, Evoral::MusicalTime end_time)
+MidiModel::write_section_to (boost::shared_ptr<MidiSource> source,
+ const Glib::Threads::Mutex::Lock& source_lock,
+ Evoral::MusicalTime begin_time,
+ Evoral::MusicalTime end_time)
{
ReadLock lock(read_lock());
MidiStateTracker mst;
const bool old_percussive = percussive();
set_percussive(false);
- boost::shared_ptr<MidiSource> ms = _midi_source.lock ();
- assert (ms);
-
- source->drop_model();
- source->mark_streaming_midi_write_started (note_mode());
+ source->drop_model(source_lock);
+ source->mark_streaming_midi_write_started (source_lock, note_mode());
- for (Evoral::Sequence<TimeType>::const_iterator i = begin(0, true); i != end(); ++i) {
+ for (Evoral::Sequence<TimeType>::const_iterator i = begin(TimeType(), true); i != end(); ++i) {
const Evoral::Event<Evoral::MusicalTime>& ev (*i);
if (ev.time() >= begin_time && ev.time() < end_time) {
continue;
}
- source->append_event_unlocked_beats (*i);
+ source->append_event_beats (source_lock, *i);
mst.remove (mev->note(), mev->channel());
} else if (mev->is_note_on()) {
mst.add (mev->note(), mev->channel());
- source->append_event_unlocked_beats(*i);
+ source->append_event_beats(source_lock, *i);
} else {
- source->append_event_unlocked_beats(*i);
+ source->append_event_beats(source_lock, *i);
}
}
}
- mst.resolve_notes (*source, end_time);
+ mst.resolve_notes (*source, source_lock, end_time);
set_percussive(old_percussive);
- source->mark_streaming_write_completed();
+ source->mark_streaming_write_completed(source_lock);
set_edited(false);
assert (ms);
Glib::Threads::Mutex::Lock* source_lock = new Glib::Threads::Mutex::Lock (ms->mutex());
- ms->invalidate(); // Release cached iterator's read lock on model
+ ms->invalidate(*source_lock); // Release cached iterator's read lock on model
return WriteLock(new WriteLockImpl(source_lock, _lock, _control_lock));
}
TimeType ea = note->end_time();
const Pitches& p (pitches (note->channel()));
- NotePtr search_note(new Note<TimeType>(0, 0, 0, note->note()));
+ NotePtr search_note(new Note<TimeType>(0, TimeType(), TimeType(), note->note()));
set<NotePtr> to_be_deleted;
bool set_note_length = false;
bool set_note_time = false;
return -1; /* do not add the new note */
break;
default:
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
/* stupid gcc */
break;
}
note_length = min (note_length, (*i)->end_time() - note->time());
break;
default:
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
/* stupid gcc */
break;
}
/* cannot add in this case */
return -1;
default:
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
/* stupid gcc */
break;
}
to_be_deleted.insert (*i);
break;
default:
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
/* stupid gcc */
break;
}
break;
default:
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
/* stupid gcc */
break;
}
boost::shared_ptr<MidiSource> old = _midi_source.lock ();
if (old) {
- old->invalidate ();
+ Source::Lock lm(old->mutex());
+ old->invalidate (lm);
}
_midi_source_connections.drop_connections ();
for (Controls::iterator i = controls().begin(); i != controls().end(); ++i) {
boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (i->second);
XMLNode& before = ac->alist()->get_state ();
- i->second->list()->shift (0, t);
+ i->second->list()->shift (0, t.to_double());
XMLNode& after = ac->alist()->get_state ();
s->session().add_command (new MementoCommand<AutomationList> (new MidiAutomationListBinder (s, i->first), &before, &after));
}