X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_track.cc;h=f1344e7697640eac1d85cf604d8ada3f00a7f584;hb=cf8cc1944928132c99e382918b3c7c03b2298b80;hp=69d10c44e0cfe056d76188d1f02da8a8e961e50a;hpb=9e3299f97da874a48f67dc5ff0e0f87a6a54768a;p=ardour.git diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index 69d10c44e0..f1344e7697 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -44,15 +44,17 @@ #include "ardour/midi_port.h" #include "ardour/midi_region.h" #include "ardour/midi_track.h" +#include "ardour/monitor_control.h" #include "ardour/parameter_types.h" #include "ardour/port.h" #include "ardour/processor.h" #include "ardour/profile.h" +#include "ardour/route_group_specialized.h" #include "ardour/session.h" #include "ardour/session_playlists.h" #include "ardour/utils.h" -#include "i18n.h" +#include "pbd/i18n.h" namespace ARDOUR { class InterThreadInfo; @@ -65,8 +67,8 @@ using namespace std; using namespace ARDOUR; using namespace PBD; -MidiTrack::MidiTrack (Session& sess, string name, Route::Flag flag, TrackMode mode) - : Track (sess, name, flag, mode, DataType::MIDI) +MidiTrack::MidiTrack (Session& sess, string name, TrackMode mode) + : Track (sess, name, PresentationInfo::MidiTrack, mode, DataType::MIDI) , _immediate_events(1024) // FIXME: size? , _step_edit_ring_buffer(64) // FIXME: size? , _note_mode(Sustained) @@ -102,24 +104,24 @@ MidiTrack::create_diskstream () } -void -MidiTrack::set_record_enabled (bool yn, void *src) +bool +MidiTrack::can_be_record_safe () { if (_step_editing) { - return; + return false; } - Track::set_record_enabled (yn, src); + return Track::can_be_record_safe (); } -void -MidiTrack::set_record_safe (bool yn, void *src) +bool +MidiTrack::can_be_record_enabled () { - if (_step_editing) { /* REQUIRES REVIEW */ - return; + if (_step_editing) { + return false; } - Track::set_record_safe (yn, src); + return Track::can_be_record_enabled (); } void @@ -160,7 +162,7 @@ MidiTrack::midi_diskstream() const int MidiTrack::set_state (const XMLNode& node, int version) { - const XMLProperty *prop; + XMLProperty const * prop; /* This must happen before Track::set_state(), as there will be a buffer fill during that call, and we must fill buffers using the correct @@ -271,8 +273,8 @@ void MidiTrack::set_state_part_two () { XMLNode* fnode; - XMLProperty* prop; - LocaleGuard lg (X_("C")); + XMLProperty const * prop; + LocaleGuard lg; /* This is called after all session state has been restored but before have been made ports and connections are established. @@ -371,7 +373,7 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame if (!_active) { silence (nframes); - if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) { + if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) { _meter->reset(); } return 0; @@ -394,16 +396,6 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame return dret; } - if (_mute_control->list() && _mute_control->automation_playback()) { - bool valid = false; - const float mute = _mute_control->list()->rt_safe_eval(transport_frame, valid); - if (mute >= 0.5 && !muted()) { - _mute_control->set_value_unchecked(1.0); // mute - } else if (mute < 0.5 && muted()) { - _mute_control->set_value_unchecked(0.0); // unmute - } - } - BufferSet& bufs = _session.get_route_buffers (n_process_buffers()); fill_buffers_with_input (bufs, _input, nframes); @@ -411,8 +403,8 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame /* filter captured data before meter sees it */ _capture_filter.filter (bufs); - if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) { - _meter->run (bufs, start_frame, end_frame, nframes, true); + if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) { + _meter->run (bufs, start_frame, end_frame, 1.0 /*speed()*/, nframes, true); } @@ -452,12 +444,7 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame process_output_buffers (bufs, start_frame, end_frame, nframes, declick, (!diskstream->record_enabled() && !_session.transport_stopped())); - for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { - boost::shared_ptr d = boost::dynamic_pointer_cast (*i); - if (d) { - d->flush_buffers (nframes); - } - } + flush_processor_buffers_locked (nframes); need_butler = diskstream->commit (playback_distance); @@ -714,6 +701,7 @@ MidiTrack::set_parameter_automation_state (Evoral::Parameter param, AutoState st case MidiPgmChangeAutomation: case MidiPitchBenderAutomation: case MidiChannelPressureAutomation: + case MidiNotePressureAutomation: case MidiSystemExclusiveAutomation: /* The track control for MIDI parameters is for immediate events to act as a control surface, write/touch for them is not currently @@ -725,15 +713,7 @@ MidiTrack::set_parameter_automation_state (Evoral::Parameter param, AutoState st } void -MidiTrack::MidiControl::set_value (double val, PBD::Controllable::GroupControlDisposition /* group_override */) -{ - if (writable()) { - set_value_unchecked (val); - } -} - -void -MidiTrack::MidiControl::set_value_unchecked(double val) +MidiTrack::MidiControl::actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override) { const Evoral::Parameter ¶meter = _list ? _list->parameter() : Control::parameter(); const Evoral::ParameterDescriptor &desc = EventTypeMap::instance().descriptor(parameter); @@ -778,6 +758,12 @@ MidiTrack::MidiControl::set_value_unchecked(double val) ev[1] = int(val); break; + case MidiNotePressureAutomation: + ev[0] += MIDI_CMD_NOTE_PRESSURE; + ev[1] = parameter.id(); + ev[2] = int(val); + break; + case MidiPitchBenderAutomation: ev[0] += MIDI_CMD_BENDER; ev[1] = 0x7F & int(val); @@ -790,7 +776,7 @@ MidiTrack::MidiControl::set_value_unchecked(double val) _route->write_immediate_event(size, ev); } - AutomationControl::set_value(val, Controllable::NoGroup); + AutomationControl::actually_set_value(val, group_override); } void @@ -926,7 +912,7 @@ MidiTrack::act_on_mute () return; } - if (muted() || _mute_master->muted_by_others_at(MuteMaster::AllPoints)) { + if (muted() || _mute_master->muted_by_others_soloing_at (MuteMaster::AllPoints)) { /* only send messages for channels we are using */ uint16_t mask = _playback_filter.get_channel_mask(); @@ -950,30 +936,27 @@ MidiTrack::act_on_mute () } void -MidiTrack::set_monitoring (MonitorChoice mc) +MidiTrack::monitoring_changed (bool self, Controllable::GroupControlDisposition gcd) { - if (mc != _monitoring) { + Track::monitoring_changed (self, gcd); - Track::set_monitoring (mc); + /* monitoring state changed, so flush out any on notes at the + * port level. + */ - /* monitoring state changed, so flush out any on notes at the - * port level. - */ - - PortSet& ports (_output->ports()); + PortSet& ports (_output->ports()); - for (PortSet::iterator p = ports.begin(); p != ports.end(); ++p) { - boost::shared_ptr mp = boost::dynamic_pointer_cast (*p); - if (mp) { - mp->require_resolve (); - } + for (PortSet::iterator p = ports.begin(); p != ports.end(); ++p) { + boost::shared_ptr mp = boost::dynamic_pointer_cast (*p); + if (mp) { + mp->require_resolve (); } + } - boost::shared_ptr md (midi_diskstream()); + boost::shared_ptr md (midi_diskstream()); - if (md) { - md->reset_tracker (); - } + if (md) { + md->reset_tracker (); } } @@ -986,4 +969,3 @@ MidiTrack::monitoring_state () const } return ms; } -