diff options
author | David Robillard <d@drobilla.net> | 2007-07-03 02:37:24 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2007-07-03 02:37:24 +0000 |
commit | 0da29770276604a7f0a367cd8eb5ff2fff7a2233 (patch) | |
tree | 87f37c252457eab66c0806e097a2d147d8d66916 /libs/ardour/midi_track.cc | |
parent | ef0b9a740996c432a6a96180814d4f8d0ee16842 (diff) |
Pan automation/serialization fixes.
"Live" Midi CC sending from Midi CC automation track controllers.
git-svn-id: svn://localhost/ardour2/trunk@2097 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/midi_track.cc')
-rw-r--r-- | libs/ardour/midi_track.cc | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index a10161bc72..075497c195 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -36,6 +36,7 @@ #include <ardour/utils.h> #include <ardour/buffer_set.h> #include <ardour/meter.h> +#include <ardour/midi_events.h> #include "i18n.h" @@ -45,6 +46,7 @@ using namespace PBD; MidiTrack::MidiTrack (Session& sess, string name, Route::Flag flag, TrackMode mode) : Track (sess, name, flag, mode, DataType::MIDI) + , _immediate_events(1024) // FIXME: size? { MidiDiskstream::Flag dflags = MidiDiskstream::Flag (0); @@ -74,6 +76,7 @@ MidiTrack::MidiTrack (Session& sess, string name, Route::Flag flag, TrackMode mo MidiTrack::MidiTrack (Session& sess, const XMLNode& node) : Track (sess, node) + , _immediate_events(1024) // FIXME: size? { _set_state(node, false); @@ -556,6 +559,8 @@ MidiTrack::process_output_buffers (BufferSet& bufs, if (muted()) { IO::silence(nframes, offset); } else { + MidiBuffer& out_buf = bufs.get_midi(0); + _immediate_events.read(out_buf, 0, 0, offset + nframes-1); // all stamps = 0 deliver_output(bufs, start_frame, end_frame, nframes, offset); } } @@ -620,3 +625,28 @@ MidiTrack::set_mode (TrackMode m) return 0; } + +/** \return true on success, false on failure (no buffer space left) + */ +bool +MidiTrack::write_immediate_event(size_t size, const Byte* buf) +{ + return (_immediate_events.write(0, size, buf) == size); +} + +void +MidiTrack::MidiControl::set_value(float val) +{ + assert(val >= 0); + assert(val <= 127.0); + + boost::shared_ptr<MidiTrack> midi_track = _route.lock(); + + if (midi_track && !_list->automation_playback()) { + Byte ev[3] = { MIDI_CMD_CONTROL, _list->param_id().id(), (int)val }; + midi_track->write_immediate_event(3, ev); + } + + AutomationControl::set_value(val); +} + |