* fixed various event size bugs
authorHans Baier <hansfbaier@googlemail.com>
Mon, 12 May 2008 10:03:53 +0000 (10:03 +0000)
committerHans Baier <hansfbaier@googlemail.com>
Mon, 12 May 2008 10:03:53 +0000 (10:03 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@3336 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/midi_region_view.cc
libs/ardour/ardour/midi_ring_buffer.h
libs/ardour/midi_model.cc
libs/ardour/midi_track.cc

index b83630e9fa89f7cbc5f4dd28c0369fc50e633685..18ab4ef74f68e35ff073cb30040736b9e12820e5 100644 (file)
@@ -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());
+               }
+       }
 }
 
 
index ea0013fe46dc514f47ccf0c51a73349158c5a6ca..baa8e9d94868a203e3f8f173d0e965759c41261a 100644 (file)
@@ -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);
index 2b8755b0f9f2a4d930514b375db0aec65c3c88e3..168516fcc45de2a197f848e8bf88b7bf97f44b48 100644 (file)
@@ -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)
index d22c2171e790124f0ab31e78a7600406f002b635..7b95290705bf72a30803017f55f8569421cf151b 100644 (file)
@@ -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);