X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_track.cc;h=f1344e7697640eac1d85cf604d8ada3f00a7f584;hb=d92686afb4105b84b014372b6feb0ccc454a5171;hp=b078fa3f1b5141f2606484cc945bd9fd70f4534b;hpb=7a5cea45e1a586b7db7a2d96a366f8e1272d07c1;p=ardour.git diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index b078fa3f1b..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; @@ -401,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); } @@ -442,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); @@ -533,7 +530,7 @@ MidiTrack::non_realtime_locate (framepos_t pos) (rcontrol = region->control(tcontrol->parameter()))) { const Evoral::Beats pos_beats = bfc.from(pos - origin); if (rcontrol->list()->size() > 0) { - tcontrol->set_value(rcontrol->list()->eval(pos_beats.to_double())); + tcontrol->set_value(rcontrol->list()->eval(pos_beats.to_double()), Controllable::NoGroup); } } } @@ -704,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 @@ -715,15 +713,7 @@ MidiTrack::set_parameter_automation_state (Evoral::Parameter param, AutoState st } void -MidiTrack::MidiControl::set_value(double val) -{ - 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); @@ -768,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); @@ -780,7 +776,7 @@ MidiTrack::MidiControl::set_value_unchecked(double val) _route->write_immediate_event(size, ev); } - AutomationControl::set_value(val); + AutomationControl::actually_set_value(val, group_override); } void @@ -916,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(); @@ -940,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 (); } } @@ -976,4 +969,3 @@ MidiTrack::monitoring_state () const } return ms; } -