summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Baier <hansfbaier@googlemail.com>2008-05-12 10:03:53 +0000
committerHans Baier <hansfbaier@googlemail.com>2008-05-12 10:03:53 +0000
commitd46724515238fdb57f5d21c450883f7cc8897a56 (patch)
treebb1487333ddcc99900e9614c2bebbfa4d6ce28d6
parent8ca72c4eca3a712f5368680ba0fbce5beb831324 (diff)
* fixed various event size bugs
git-svn-id: svn://localhost/ardour2/branches/3.0@3336 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/midi_region_view.cc12
-rw-r--r--libs/ardour/ardour/midi_ring_buffer.h6
-rw-r--r--libs/ardour/midi_model.cc5
-rw-r--r--libs/ardour/midi_track.cc9
4 files changed, 21 insertions, 11 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc
index b83630e9fa..18ab4ef74f 100644
--- a/gtk2_ardour/midi_region_view.cc
+++ b/gtk2_ardour/midi_region_view.cc
@@ -534,8 +534,9 @@ MidiRegionView::~MidiRegionView ()
RegionViewGoingAway (this); /* EMIT_SIGNAL */
- if (_active_notes)
+ if (_active_notes) {
end_write();
+ }
_selection.clear();
clear_events();
@@ -707,12 +708,15 @@ MidiRegionView::resolve_note(uint8_t note, double end_time)
void
MidiRegionView::extend_active_notes()
{
- if (!_active_notes)
+ if (!_active_notes) {
return;
+ }
- for (unsigned i=0; i < 128; ++i)
- if (_active_notes[i])
+ for (unsigned i=0; i < 128; ++i) {
+ if (_active_notes[i]) {
_active_notes[i]->property_x2() = trackview.editor.frame_to_pixel(_region->length());
+ }
+ }
}
diff --git a/libs/ardour/ardour/midi_ring_buffer.h b/libs/ardour/ardour/midi_ring_buffer.h
index ea0013fe46..baa8e9d948 100644
--- a/libs/ardour/ardour/midi_ring_buffer.h
+++ b/libs/ardour/ardour/midi_ring_buffer.h
@@ -348,12 +348,14 @@ MidiRingBuffer::write(double time, size_t size, const Byte* buf)
MidiRingBufferBase<Byte>::write(sizeof(double), (Byte*)&time);
MidiRingBufferBase<Byte>::write(sizeof(size_t), (Byte*)&size);
if (is_channel_event(buf[0]) && get_channel_mode() == ForceChannel) {
- assert(size == 3);
+ assert(size == 2 || size == 3);
Byte tmp_buf[3];
// Force event to channel
tmp_buf[0] = (buf[0] & 0xF0) | (get_channel_mask() & 0x0F);
tmp_buf[1] = buf[1];
- tmp_buf[2] = buf[2];
+ if (size == 3) {
+ tmp_buf[2] = buf[2];
+ }
MidiRingBufferBase<Byte>::write(size, tmp_buf);
} else {
MidiRingBufferBase<Byte>::write(size, buf);
diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc
index 2b8755b0f9..168516fcc4 100644
--- a/libs/ardour/midi_model.cc
+++ b/libs/ardour/midi_model.cc
@@ -363,7 +363,7 @@ bool MidiModel::control_to_midi_event(MIDI::Event& ev,
ev.buffer()[0] = MIDI_CMD_PGM_CHANGE + iter.automation_list->parameter().channel();
ev.buffer()[1] = (Byte)iter.y;
ev.time() = iter.x;
- ev.size() = 3;
+ ev.size() = 2;
return true;
case MidiPitchBenderAutomation:
@@ -395,7 +395,7 @@ bool MidiModel::control_to_midi_event(MIDI::Event& ev,
= MIDI_CMD_CHANNEL_PRESSURE + iter.automation_list->parameter().channel();
ev.buffer()[1] = (Byte)iter.y;
ev.time() = iter.x;
- ev.size() = 3;
+ ev.size() = 2;
return true;
default:
@@ -615,7 +615,6 @@ void MidiModel::append_automation_event_unlocked(AutomationType type,
Parameter param(type, id, chan);
boost::shared_ptr<AutomationControl> control = Automatable::control(param, true);
control->list()->rt_add(time, value);
- /*cerr << "control list size after fast simple add: " << control->list()->size() << endl;*/
}
void MidiModel::add_note_unlocked(const boost::shared_ptr<Note> note)
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index d22c2171e7..7b95290705 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -729,9 +729,10 @@ MidiTrack::MidiControl::set_value(float val)
{
assert(val >= _list->parameter().min());
assert(val <= _list->parameter().max());
+ size_t size = 3;
if ( ! _list->automation_playback()) {
- Byte ev[3] = { _list->parameter().channel(), (int)val, 0.0 };
+ Byte ev[3] = { _list->parameter().channel(), int(val), 0.0 };
switch(_list->parameter().type()) {
case MidiCCAutomation:
ev[0] += MIDI_CMD_CONTROL;
@@ -740,11 +741,15 @@ MidiTrack::MidiControl::set_value(float val)
break;
case MidiPgmChangeAutomation:
+ size = 2;
ev[0] += MIDI_CMD_PGM_CHANGE;
+ ev[1] = int(val);
break;
case MidiChannelAftertouchAutomation:
+ size = 2;
ev[0] += MIDI_CMD_CHANNEL_PRESSURE;
+ ev[1] = int(val);
break;
case MidiPitchBenderAutomation:
@@ -756,7 +761,7 @@ MidiTrack::MidiControl::set_value(float val)
default:
assert(false);
}
- _route->write_immediate_event(3, ev);
+ _route->write_immediate_event(size, ev);
}
AutomationControl::set_value(val);