From bfd50cdeb0416b106a7813177148dffb1af6db8e Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 2 Aug 2013 03:39:00 +0200 Subject: rework MIDI [processor|plugin] chain * forward midi-data around plugins that have no MIDI-out * allow to insert plugins with no MIDI-input at a point with one MIDI-channel This works because excess ports (both plugin and route) remain unconnected and use scratch-buffers. Tested with LV2, LXVST and LADSPA. (AU plugins with variable in/out retain the old behavior, no bypass) fixes http://tracker.ardour.org/view.php?id=5630 --- libs/ardour/amp.cc | 2 +- libs/ardour/ardour/amp.h | 2 +- libs/ardour/ardour/audio_unit.h | 2 +- libs/ardour/ardour/capturing_processor.h | 2 +- libs/ardour/ardour/delivery.h | 2 +- libs/ardour/ardour/internal_return.h | 2 +- libs/ardour/ardour/internal_send.h | 2 +- libs/ardour/ardour/meter.h | 2 +- libs/ardour/ardour/monitor_processor.h | 2 +- libs/ardour/ardour/panner_shell.h | 2 +- libs/ardour/ardour/plugin.h | 2 +- libs/ardour/ardour/plugin_insert.h | 6 ++++-- libs/ardour/ardour/port_insert.h | 2 +- libs/ardour/ardour/processor.h | 2 +- libs/ardour/ardour/return.h | 2 +- libs/ardour/ardour/send.h | 2 +- libs/ardour/ardour/unknown_processor.h | 2 +- libs/ardour/audio_unit.cc | 2 +- libs/ardour/capturing_processor.cc | 2 +- libs/ardour/delivery.cc | 2 +- libs/ardour/internal_return.cc | 2 +- libs/ardour/internal_send.cc | 2 +- libs/ardour/meter.cc | 2 +- libs/ardour/monitor_processor.cc | 2 +- libs/ardour/plugin_insert.cc | 28 ++++++++++++++++++++-------- libs/ardour/port_insert.cc | 2 +- libs/ardour/return.cc | 2 +- libs/ardour/route.cc | 6 +++--- libs/ardour/send.cc | 2 +- 29 files changed, 53 insertions(+), 39 deletions(-) (limited to 'libs/ardour') diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index f60240fd57..c97d624440 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -61,7 +61,7 @@ Amp::display_name() const } bool -Amp::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +Amp::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h index 23cc0ad0a8..e21cf62d62 100644 --- a/libs/ardour/ardour/amp.h +++ b/libs/ardour/ardour/amp.h @@ -40,7 +40,7 @@ public: bool visible () const; - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index 36e82da802..007390b34a 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -104,7 +104,7 @@ class AUPlugin : public ARDOUR::Plugin bool has_editor () const; - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); ChanCount output_streams() const; ChanCount input_streams() const; bool configure_io (ChanCount in, ChanCount out); diff --git a/libs/ardour/ardour/capturing_processor.h b/libs/ardour/ardour/capturing_processor.h index b672d1ac07..5b9ea51557 100644 --- a/libs/ardour/ardour/capturing_processor.h +++ b/libs/ardour/ardour/capturing_processor.h @@ -38,7 +38,7 @@ class CapturingProcessor : public Processor int set_block_size (pframes_t nframes); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required); bool configure_io (ChanCount in, ChanCount out); - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); virtual XMLNode& state (bool); private: diff --git a/libs/ardour/ardour/delivery.h b/libs/ardour/ardour/delivery.h index 314b223538..4a6d4368a6 100644 --- a/libs/ardour/ardour/delivery.h +++ b/libs/ardour/ardour/delivery.h @@ -67,7 +67,7 @@ public: std::string display_name() const; Role role() const { return _role; } - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); diff --git a/libs/ardour/ardour/internal_return.h b/libs/ardour/ardour/internal_return.h index c7fe04cc42..4d2b32f031 100644 --- a/libs/ardour/ardour/internal_return.h +++ b/libs/ardour/ardour/internal_return.h @@ -39,7 +39,7 @@ class InternalReturn : public Return void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); bool configure_io (ChanCount, ChanCount); - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); void add_send (InternalSend *); void remove_send (InternalSend *); diff --git a/libs/ardour/ardour/internal_send.h b/libs/ardour/ardour/internal_send.h index 8bfb0de887..a7f0f73e6e 100644 --- a/libs/ardour/ardour/internal_send.h +++ b/libs/ardour/ardour/internal_send.h @@ -42,7 +42,7 @@ class InternalSend : public Send void cycle_start (pframes_t); void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); bool feeds (boost::shared_ptr other) const; - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); int set_block_size (pframes_t); diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h index a4ad8ecff4..df1e381bb4 100644 --- a/libs/ardour/ardour/meter.h +++ b/libs/ardour/ardour/meter.h @@ -56,7 +56,7 @@ public: void reset (); void reset_max (); - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); /* special method for meter, to ensure that it can always handle the maximum diff --git a/libs/ardour/ardour/monitor_processor.h b/libs/ardour/ardour/monitor_processor.h index 5b724b5e8d..64d3b86bfb 100644 --- a/libs/ardour/ardour/monitor_processor.h +++ b/libs/ardour/ardour/monitor_processor.h @@ -118,7 +118,7 @@ public: int set_state (const XMLNode&, int /* version */); bool configure_io (ChanCount in, ChanCount out); - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); void set_cut_all (bool); void set_dim_all (bool); diff --git a/libs/ardour/ardour/panner_shell.h b/libs/ardour/ardour/panner_shell.h index 7d24adb46f..dba5826370 100644 --- a/libs/ardour/ardour/panner_shell.h +++ b/libs/ardour/ardour/panner_shell.h @@ -53,7 +53,7 @@ public: std::string describe_parameter (Evoral::Parameter param); - bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) const { return true; }; + bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) { return true; }; void configure_io (ChanCount in, ChanCount out); /// The fundamental Panner function diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index 9e4f5c40fd..55b76fbb08 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -242,7 +242,7 @@ class Plugin : public PBD::StatefulDestructible, public Latent /* specific types of plugins can overload this. As of September 2008, only AUPlugin does this. */ - virtual bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) const { return false; } + virtual bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) { return false; } virtual ChanCount output_streams() const; virtual ChanCount input_streams() const; diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h index d80c759cff..a1b9c5a685 100644 --- a/libs/ardour/ardour/plugin_insert.h +++ b/libs/ardour/ardour/plugin_insert.h @@ -69,7 +69,7 @@ class PluginInsert : public Processor bool set_count (uint32_t num); uint32_t get_count () const { return _plugins.size(); } - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); bool has_no_inputs() const; @@ -160,6 +160,8 @@ class PluginInsert : public Processor BufferSet _signal_analysis_inputs; BufferSet _signal_analysis_outputs; + ChanCount midi_bypass; + /** Description of how we can match our plugin's IO to our own insert IO */ struct Match { Match () : method (Impossible), plugins (0) {} @@ -170,7 +172,7 @@ class PluginInsert : public Processor ChanCount hide; ///< number of channels to hide }; - Match private_can_support_io_configuration (ChanCount const &, ChanCount &) const; + Match private_can_support_io_configuration (ChanCount const &, ChanCount &); /** details of the match currently being used */ Match _match; diff --git a/libs/ardour/ardour/port_insert.h b/libs/ardour/ardour/port_insert.h index 657c2c0de6..abd9fb73cc 100644 --- a/libs/ardour/ardour/port_insert.h +++ b/libs/ardour/ardour/port_insert.h @@ -57,7 +57,7 @@ class PortInsert : public IOProcessor bool set_name (const std::string& name); - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); void activate (); diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h index d497f56dd3..772ae3520d 100644 --- a/libs/ardour/ardour/processor.h +++ b/libs/ardour/ardour/processor.h @@ -82,7 +82,7 @@ class Processor : public SessionObject, public Automatable, public Latent /* Derived classes should override these, or processor appears as an in-place pass-through */ - virtual bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const = 0; + virtual bool can_support_io_configuration (const ChanCount& in, ChanCount& out) = 0; virtual ChanCount input_streams () const { return _configured_input; } virtual ChanCount output_streams() const { return _configured_output; } diff --git a/libs/ardour/ardour/return.h b/libs/ardour/ardour/return.h index 55ca2d84f6..6dcd6ac2fc 100644 --- a/libs/ardour/ardour/return.h +++ b/libs/ardour/ardour/return.h @@ -56,7 +56,7 @@ public: uint32_t pans_required() const { return _configured_input.n_audio(); } - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); static uint32_t how_many_returns(); diff --git a/libs/ardour/ardour/send.h b/libs/ardour/ardour/send.h index fa023a3b68..1a21d1d050 100644 --- a/libs/ardour/ardour/send.h +++ b/libs/ardour/ardour/send.h @@ -56,7 +56,7 @@ class Send : public Delivery void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); - bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool can_support_io_configuration (const ChanCount& in, ChanCount& out); bool configure_io (ChanCount in, ChanCount out); void activate (); diff --git a/libs/ardour/ardour/unknown_processor.h b/libs/ardour/ardour/unknown_processor.h index 36981030ce..61a5734df2 100644 --- a/libs/ardour/ardour/unknown_processor.h +++ b/libs/ardour/ardour/unknown_processor.h @@ -49,7 +49,7 @@ public: return false; } - bool can_support_io_configuration (const ChanCount &, ChanCount &) const { + bool can_support_io_configuration (const ChanCount &, ChanCount &) { return false; } diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index e43033eb67..538a905ca2 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -998,7 +998,7 @@ AUPlugin::output_streams() const } bool -AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out) { // Note: We never attempt to multiply-instantiate plugins to meet io configurations. diff --git a/libs/ardour/capturing_processor.cc b/libs/ardour/capturing_processor.cc index c4b463aba7..4a31d92cc8 100644 --- a/libs/ardour/capturing_processor.cc +++ b/libs/ardour/capturing_processor.cc @@ -62,7 +62,7 @@ CapturingProcessor::configure_io (ChanCount in, ChanCount out) } bool -CapturingProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +CapturingProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index 9eaf843f7c..dfbe4c960a 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -124,7 +124,7 @@ Delivery::display_name () const } bool -Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) { if (_role == Main) { diff --git a/libs/ardour/internal_return.cc b/libs/ardour/internal_return.cc index af6b6110b6..fc5963603b 100644 --- a/libs/ardour/internal_return.cc +++ b/libs/ardour/internal_return.cc @@ -80,7 +80,7 @@ InternalReturn::get_state() } bool -InternalReturn::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +InternalReturn::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc index 26631d0fad..029a46ce53 100644 --- a/libs/ardour/internal_send.cc +++ b/libs/ardour/internal_send.cc @@ -284,7 +284,7 @@ InternalSend::connect_when_legal () } bool -InternalSend::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +InternalSend::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 490b75dcb2..a7857f5859 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -165,7 +165,7 @@ PeakMeter::reset_max () } bool -PeakMeter::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +PeakMeter::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; diff --git a/libs/ardour/monitor_processor.cc b/libs/ardour/monitor_processor.cc index e55428b666..ed06647860 100644 --- a/libs/ardour/monitor_processor.cc +++ b/libs/ardour/monitor_processor.cc @@ -355,7 +355,7 @@ MonitorProcessor::configure_io (ChanCount in, ChanCount out) } bool -MonitorProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +MonitorProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index d519dbd7a7..b191cf4890 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -145,7 +145,7 @@ PluginInsert::output_streams() const ChanCount out = info->n_outputs; // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size())); out.set_audio (out.n_audio() * _plugins.size()); - out.set_midi (out.n_midi() * _plugins.size()); + out.set_midi (out.n_midi() * _plugins.size() + midi_bypass.n_midi()); return out; } } @@ -465,7 +465,6 @@ PluginInsert::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end } } else { - if (has_no_audio_inputs()) { /* silence all (audio) outputs. Should really declick @@ -704,7 +703,7 @@ PluginInsert::configure_io (ChanCount in, ChanCount out) * @return true if the given IO configuration can be supported. */ bool -PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) { return private_can_support_io_configuration (in, out).method != Impossible; } @@ -714,9 +713,11 @@ PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) * it can be. */ PluginInsert::Match -PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCount& out) const +PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out) { PluginInfoPtr info = _plugins.front()->get_info(); + ChanCount in; in += inx; + midi_bypass.reset(); if (info->reconfigurable_io()) { /* Plugin has flexible I/O, so delegate to it */ @@ -731,6 +732,15 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo ChanCount inputs = info->n_inputs; ChanCount outputs = info->n_outputs; + if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) { + DEBUG_TRACE ( DEBUG::Processors, string_compose ("bypassing midi-data around %1\n", name())); + midi_bypass.set(DataType::MIDI, 1); + } + if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) { + DEBUG_TRACE ( DEBUG::Processors, string_compose ("hiding midi-port from plugin %1\n", name())); + in.set(DataType::MIDI, 0); + } + bool no_inputs = true; for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { if (inputs.get (*t) != 0) { @@ -741,13 +751,13 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo if (no_inputs) { /* no inputs so we can take any input configuration since we throw it away */ - out = outputs; + out = outputs + midi_bypass; return Match (NoInputs, 1); } /* Plugin inputs match requested inputs exactly */ if (inputs == in) { - out = outputs; + out = outputs + midi_bypass; return Match (ExactMatch, 1); } @@ -789,6 +799,7 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { out.set (*t, outputs.get(*t) * f); } + out += midi_bypass; return Match (Replicate, f); } @@ -812,7 +823,7 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo } if (can_split) { - out = outputs; + out = outputs + midi_bypass; return Match (Split, 1); } @@ -836,10 +847,11 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo } if (could_hide && !cannot_hide) { - out = outputs; + out = outputs + midi_bypass; return Match (Hide, 1, hide_channels); } + midi_bypass.reset(); return Match (Impossible, 0); } diff --git a/libs/ardour/port_insert.cc b/libs/ardour/port_insert.cc index c13927449a..411d8d1e19 100644 --- a/libs/ardour/port_insert.cc +++ b/libs/ardour/port_insert.cc @@ -266,7 +266,7 @@ PortInsert::configure_io (ChanCount in, ChanCount out) } bool -PortInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +PortInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in; return true; diff --git a/libs/ardour/return.cc b/libs/ardour/return.cc index 921be6a53a..4f9e8b958a 100644 --- a/libs/ardour/return.cc +++ b/libs/ardour/return.cc @@ -136,7 +136,7 @@ Return::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pfra } bool -Return::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +Return::can_support_io_configuration (const ChanCount& in, ChanCount& out) { out = in + _input->n_ports(); return true; diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index a394c73d20..b78217ff49 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -543,11 +543,10 @@ Route::process_output_buffers (BufferSet& bufs, if (bufs.count() != (*i)->input_streams()) { DEBUG_TRACE ( DEBUG::Processors, string_compose ( - "%1 bufs = %2 input for %3 = %4\n", + "input port mismatch %1 bufs = %2 input for %3 = %4\n", _name, bufs.count(), (*i)->name(), (*i)->input_streams() ) ); - continue; } } #endif @@ -1654,7 +1653,8 @@ Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err) if (boost::dynamic_pointer_cast (*p)) { DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n"); - break; + DEBUG_TRACE (DEBUG::Processors, "}\n"); + return list > (); } if ((*p)->can_support_io_configuration(in, out)) { diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index 107cf9862b..e74fd7f8ce 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -270,7 +270,7 @@ Send::set_state_2X (const XMLNode& node, int /* version */) } bool -Send::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +Send::can_support_io_configuration (const ChanCount& in, ChanCount& out) { /* sends have no impact at all on the channel configuration of the streams passing through the route. so, out == in. -- cgit v1.2.3 From b8964f7b1bc8d7d421c9eda2a4cf47c85bdfee27 Mon Sep 17 00:00:00 2001 From: Michael Fisher Date: Wed, 31 Jul 2013 07:02:28 -0500 Subject: MIDI Clock - Shuffling locate code (not actually used yet) - Subscribe to Session::Locate to detect seeks - Shuffle Mclk locating computations into a separate private class --- libs/ardour/ardour/ticker.h | 8 +++- libs/ardour/ticker.cc | 108 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 112 insertions(+), 4 deletions(-) (limited to 'libs/ardour') diff --git a/libs/ardour/ardour/ticker.h b/libs/ardour/ardour/ticker.h index da728a5d54..c534a206d6 100644 --- a/libs/ardour/ardour/ticker.h +++ b/libs/ardour/ardour/ticker.h @@ -42,7 +42,7 @@ class MidiClockTicker : public SessionHandlePtr, boost::noncopyable { public: MidiClockTicker (); - virtual ~MidiClockTicker() {} + virtual ~MidiClockTicker(); void tick (const framepos_t& transport_frames); @@ -63,6 +63,9 @@ public: /// slot for the signal session::TransportLooped void transport_looped(); + /// slot for the signal session::Located + void session_located(); + /// pulses per quarter note (default 24) void set_ppqn(int ppqn) { _ppqn = ppqn; } @@ -71,6 +74,9 @@ private: int _ppqn; double _last_tick; + class Position; + Position* _pos; + double one_ppqn_in_frames (framepos_t transport_position); void send_midi_clock_event (pframes_t offset); diff --git a/libs/ardour/ticker.cc b/libs/ardour/ticker.cc index 4f66128943..bb74767307 100644 --- a/libs/ardour/ticker.cc +++ b/libs/ardour/ticker.cc @@ -33,11 +33,84 @@ using namespace ARDOUR; + +/** MIDI Clock Position tracking */ +class MidiClockTicker::Position : public Timecode::BBT_Time +{ +public: + + Position() : speed(0.0f), frame(0), clocks_till_locate(-1) { } + ~Position() { } + + /** Sync timing information taken from the given Session + @return True if timings differed */ + bool sync (Session* s) { + + bool didit = false; + + double sp = s->transport_speed(); + framecnt_t fr = s->transport_frame(); + + if (speed != sp) { + speed = sp; + didit = true; + } + + if (frame != fr) { + + s->bbt_time (fr, *this); + + const TempoMap& tempo = s->tempo_map(); + + const double divisions = tempo.meter_at(frame).divisions_per_bar(); + const double divisor = tempo.meter_at(frame).note_divisor(); + const double qnote_scale = divisor * 0.25f; + + frame = fr; + + /* Midi Beats in terms of Song Position Pointer is equivalent to total + sixteenth notes at 'time' */ + + midi_beats = (((bars - 1) * divisions) + beats - 1); + midi_beats += (double)ticks / (double)Position::ticks_per_beat * qnote_scale; + midi_beats *= 16.0f / divisor; + + midi_clocks = midi_beats * 6.0f; + + didit = true; + } + + print (std::clog); + + return didit; + } + + double speed; + framecnt_t frame; + double midi_beats; + double midi_clocks; + + void print (std::ostream& s) { + s << "MCLK Position: frames: " << frame << " midi beats: " << midi_beats << " speed: " << speed << std::endl; + } +}; + + MidiClockTicker::MidiClockTicker () : _midi_port (0) , _ppqn (24) , _last_tick (0.0) { + _pos = new Position(); +} + +MidiClockTicker::~MidiClockTicker() +{ + _midi_port = 0; + if (_pos) { + delete _pos; + _pos = 0; + } } void @@ -49,10 +122,32 @@ MidiClockTicker::set_session (Session* s) _session->TransportStateChange.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::transport_state_changed, this)); _session->PositionChanged.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::position_changed, this, _1)); _session->TransportLooped.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::transport_looped, this)); + _session->Located.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::session_located, this)); + update_midi_clock_port(); + _pos->sync (_session); } } +void +MidiClockTicker::session_located() +{ + if (0 == _session || ! _pos->sync (_session)) { + return; + } + + _last_tick = _pos->frame; + + // WIP - Testing code + if (0 == _pos->frame) { + std::clog << "zero frame\n"; + if (1.0f == _pos->speed) { + std::clog << "normal speed:\n"; + _pos->clocks_till_locate = 0; + } + } +} + void MidiClockTicker::session_going_away () { @@ -157,6 +252,12 @@ MidiClockTicker::transport_looped() void MidiClockTicker::tick (const framepos_t& transport_frame) { + if (_pos->clocks_till_locate == 0) { + std::clog << "Locate: " << transport_frame << std::endl; + } + + --_pos->clocks_till_locate; + if (!Config->get_send_midi_clock() || _session == 0 || _session->transport_speed() != 1.0f || _midi_port == 0) { return; } @@ -165,13 +266,14 @@ MidiClockTicker::tick (const framepos_t& transport_frame) double next_tick = _last_tick + one_ppqn_in_frames (transport_frame); frameoffset_t next_tick_offset = llrint (next_tick) - transport_frame; + MIDI::JackMIDIPort* mp = dynamic_cast (_midi_port); - /* + DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Transport: %1, last tick time: %2, next tick time: %3, offset: %4, cycle length: %5\n", transport_frame, _last_tick, next_tick, next_tick_offset, mp ? mp->nframes_this_cycle() : 0)); - */ + if (!mp || (next_tick_offset >= mp->nframes_this_cycle())) { break; @@ -181,7 +283,7 @@ MidiClockTicker::tick (const framepos_t& transport_frame) send_midi_clock_event (next_tick_offset); } - _last_tick = next_tick; + _pos->frame = _last_tick = next_tick; } } -- cgit v1.2.3 From 6088446d8fb6dffa336e0bbbd7cbe68b13681942 Mon Sep 17 00:00:00 2001 From: Michael Fisher Date: Wed, 31 Jul 2013 07:15:52 -0500 Subject: Test code removal... --- libs/ardour/ticker.cc | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'libs/ardour') diff --git a/libs/ardour/ticker.cc b/libs/ardour/ticker.cc index bb74767307..d140b9fceb 100644 --- a/libs/ardour/ticker.cc +++ b/libs/ardour/ticker.cc @@ -39,7 +39,7 @@ class MidiClockTicker::Position : public Timecode::BBT_Time { public: - Position() : speed(0.0f), frame(0), clocks_till_locate(-1) { } + Position() : speed(0.0f), frame(0) { } ~Position() { } /** Sync timing information taken from the given Session @@ -143,7 +143,7 @@ MidiClockTicker::session_located() std::clog << "zero frame\n"; if (1.0f == _pos->speed) { std::clog << "normal speed:\n"; - _pos->clocks_till_locate = 0; + } } } @@ -252,11 +252,6 @@ MidiClockTicker::transport_looped() void MidiClockTicker::tick (const framepos_t& transport_frame) { - if (_pos->clocks_till_locate == 0) { - std::clog << "Locate: " << transport_frame << std::endl; - } - - --_pos->clocks_till_locate; if (!Config->get_send_midi_clock() || _session == 0 || _session->transport_speed() != 1.0f || _midi_port == 0) { return; -- cgit v1.2.3 From 6ffdeaa9f87fdf7a2f2cfbc28879cbc3307a92ad Mon Sep 17 00:00:00 2001 From: Michael Fisher Date: Thu, 1 Aug 2013 00:09:42 -0500 Subject: - Send position data from internal position class - Proper midi beat conversions for all time signatures - Disable responding to Session::PositionChanged in place of Session::Located. --- libs/ardour/ardour/ticker.h | 2 +- libs/ardour/ticker.cc | 83 ++++++++++++++++++++------------------------- 2 files changed, 38 insertions(+), 47 deletions(-) (limited to 'libs/ardour') diff --git a/libs/ardour/ardour/ticker.h b/libs/ardour/ardour/ticker.h index c534a206d6..ab8721d094 100644 --- a/libs/ardour/ardour/ticker.h +++ b/libs/ardour/ardour/ticker.h @@ -83,7 +83,7 @@ private: void send_start_event (pframes_t offset); void send_continue_event (pframes_t offset); void send_stop_event (pframes_t offset); - void send_position_event (framepos_t transport_position, pframes_t offset); + void send_position_event (uint32_t midi_clocks, pframes_t offset); }; } diff --git a/libs/ardour/ticker.cc b/libs/ardour/ticker.cc index d140b9fceb..c252bc6cf7 100644 --- a/libs/ardour/ticker.cc +++ b/libs/ardour/ticker.cc @@ -32,7 +32,7 @@ #include "ardour/debug.h" using namespace ARDOUR; - +using namespace PBD; /** MIDI Clock Position tracking */ class MidiClockTicker::Position : public Timecode::BBT_Time @@ -57,8 +57,9 @@ public: } if (frame != fr) { + frame = fr; - s->bbt_time (fr, *this); + s->bbt_time (this->frame, *this); const TempoMap& tempo = s->tempo_map(); @@ -66,8 +67,6 @@ public: const double divisor = tempo.meter_at(frame).note_divisor(); const double qnote_scale = divisor * 0.25f; - frame = fr; - /* Midi Beats in terms of Song Position Pointer is equivalent to total sixteenth notes at 'time' */ @@ -80,8 +79,6 @@ public: didit = true; } - print (std::clog); - return didit; } @@ -91,7 +88,7 @@ public: double midi_clocks; void print (std::ostream& s) { - s << "MCLK Position: frames: " << frame << " midi beats: " << midi_beats << " speed: " << speed << std::endl; + s << "frames: " << frame << " midi beats: " << midi_beats << " speed: " << speed; } }; @@ -132,19 +129,18 @@ MidiClockTicker::set_session (Session* s) void MidiClockTicker::session_located() { + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Session Located: %1, speed: %2\n", _session->transport_frame(), _session->transport_speed())); + if (0 == _session || ! _pos->sync (_session)) { return; } _last_tick = _pos->frame; - // WIP - Testing code - if (0 == _pos->frame) { - std::clog << "zero frame\n"; - if (1.0f == _pos->speed) { - std::clog << "normal speed:\n"; - - } + if (_pos->speed == 0.0f && Config->get_send_midi_clock()) { + uint32_t where = std::floor (_pos->midi_beats); + send_position_event (where, 0); + return; } } @@ -174,48 +170,52 @@ MidiClockTicker::transport_state_changed() return; } - float speed = _session->transport_speed(); - framepos_t position = _session->transport_frame(); + if (! _pos->sync (_session)) { + return; + } DEBUG_TRACE (PBD::DEBUG::MidiClock, - string_compose ("Transport state change @ %4, speed: %1 position: %2 play loop: %3\n", speed, position, _session->get_play_loop(), position) + string_compose ("Transport state change @ %4, speed: %1 position: %2 play loop: %3\n", + _pos->speed, _pos->frame, _session->get_play_loop(), _pos->frame) ); - if (speed == 1.0f) { - _last_tick = position; + _last_tick = _pos->frame; - if (!Config->get_send_midi_clock()) - return; + if (! Config->get_send_midi_clock()) { + return; + } + + if (_pos->speed == 1.0f) { if (_session->get_play_loop()) { assert(_session->locations()->auto_loop_location()); - if (position == _session->locations()->auto_loop_location()->start()) { + + if (_pos->frame == _session->locations()->auto_loop_location()->start()) { send_start_event(0); } else { send_continue_event(0); } - } else if (position == 0) { + + } else if (_pos->frame == 0) { send_start_event(0); } else { send_continue_event(0); } - send_midi_clock_event(0); - - } else if (speed == 0.0f) { - if (!Config->get_send_midi_clock()) - return; + // send_midi_clock_event (0); - send_stop_event(0); - send_position_event (position, 0); + } else if (_pos->speed == 0.0f) { + send_stop_event (0); + send_position_event (std::floor (_pos->midi_beats), 0); } - tick (position); + // tick (_pos->frame); } void -MidiClockTicker::position_changed (framepos_t position) +MidiClockTicker::position_changed (framepos_t) { +#if 0 const double speed = _session->transport_speed(); DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Transport Position Change: %1, speed: %2\n", position, speed)); @@ -224,6 +224,7 @@ MidiClockTicker::position_changed (framepos_t position) } _last_tick = position; +#endif } void @@ -347,22 +348,12 @@ MidiClockTicker::send_stop_event (pframes_t offset) } void -MidiClockTicker::send_position_event (framepos_t transport_position, pframes_t offset) +MidiClockTicker::send_position_event (uint32_t midi_beats, pframes_t offset) { - if (_midi_port == 0 || _session == 0 || _session->engine().freewheeling()) { + if (!_midi_port) { return; } - const TempoMap& tempo = _session->tempo_map(); - - Timecode::BBT_Time time; - _session->bbt_time (transport_position, time); - const double beats_per_bar = tempo.meter_at(transport_position).divisions_per_bar(); - - /* Midi Beats in terms of Song Position Pointer is equivalent to total - sixteenth notes at 'time' */ - const uint32_t midi_beats = 4 * (((time.bars - 1) * beats_per_bar) + time.beats - 1); - /* can only use 14bits worth */ if (midi_beats > 0x3fff) { return; @@ -375,7 +366,7 @@ MidiClockTicker::send_position_event (framepos_t transport_position, pframes_t o midi_beats & 0x3f80 }; - DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Song Position: %1\n", midi_beats)); - _midi_port->midimsg (msg, sizeof (msg), offset); + + DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Song Position Sent: %1\n", midi_beats)); } -- cgit v1.2.3 From 18490878b402d3f86b48c3f4e3c45c7fdeb1c9a3 Mon Sep 17 00:00:00 2001 From: Michael Fisher Date: Thu, 1 Aug 2013 10:07:18 -0500 Subject: WIP - Experimenting with an alternative clock generating algo - Transport debug output (tracing where transport_frame is updated --- libs/ardour/session_transport.cc | 2 ++ libs/ardour/ticker.cc | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) (limited to 'libs/ardour') diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index b98a044d89..51d8d2c369 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -384,6 +384,7 @@ Session::butler_transport_work () g_atomic_int_dec_and_test (&_butler->should_do_transport_work); DEBUG_TRACE (DEBUG::Transport, X_("Butler transport work all done\n")); + DEBUG_TRACE (DEBUG::Transport, X_(string_compose ("Frame %1\n", _transport_frame))); } void @@ -1007,6 +1008,7 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool send_mmc_locate (_transport_frame); } + _last_roll_location = _last_roll_or_reversal_location = _transport_frame; Located (); /* EMIT SIGNAL */ } diff --git a/libs/ardour/ticker.cc b/libs/ardour/ticker.cc index c252bc6cf7..c74f40c78e 100644 --- a/libs/ardour/ticker.cc +++ b/libs/ardour/ticker.cc @@ -126,6 +126,8 @@ MidiClockTicker::set_session (Session* s) } } +static bool need_reset = false; + void MidiClockTicker::session_located() { @@ -136,6 +138,7 @@ MidiClockTicker::session_located() } _last_tick = _pos->frame; + need_reset = true; if (_pos->speed == 0.0f && Config->get_send_midi_clock()) { uint32_t where = std::floor (_pos->midi_beats); @@ -253,34 +256,37 @@ MidiClockTicker::transport_looped() void MidiClockTicker::tick (const framepos_t& transport_frame) { - if (!Config->get_send_midi_clock() || _session == 0 || _session->transport_speed() != 1.0f || _midi_port == 0) { return; } + double iter = _last_tick; + double clock_delta = one_ppqn_in_frames (transport_frame); + while (true) { - double next_tick = _last_tick + one_ppqn_in_frames (transport_frame); + double next_tick = iter + clock_delta; frameoffset_t next_tick_offset = llrint (next_tick) - transport_frame; - MIDI::JackMIDIPort* mp = dynamic_cast (_midi_port); - DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Transport: %1, last tick time: %2, next tick time: %3, offset: %4, cycle length: %5\n", transport_frame, _last_tick, next_tick, next_tick_offset, mp ? mp->nframes_this_cycle() : 0)); if (!mp || (next_tick_offset >= mp->nframes_this_cycle())) { - break; + return; } if (next_tick_offset >= 0) { send_midi_clock_event (next_tick_offset); + _last_tick += clock_delta; } - _pos->frame = _last_tick = next_tick; + iter = next_tick; } + + _pos->frame = _last_tick; } double -- cgit v1.2.3 From 5555f5ccf731c0d57a98bc5fd3ecd486f2bafa51 Mon Sep 17 00:00:00 2001 From: Michael Fisher Date: Thu, 1 Aug 2013 13:47:22 -0500 Subject: Revamp clock processing so it uses an internal frame reference. MidiClockTicker::Position managed by boost::scoped_ptr --- libs/ardour/ardour/ticker.h | 3 +- libs/ardour/ticker.cc | 96 +++++++++++++++++++++++++++------------------ 2 files changed, 60 insertions(+), 39 deletions(-) (limited to 'libs/ardour') diff --git a/libs/ardour/ardour/ticker.h b/libs/ardour/ardour/ticker.h index ab8721d094..b6e5376c12 100644 --- a/libs/ardour/ardour/ticker.h +++ b/libs/ardour/ardour/ticker.h @@ -19,6 +19,7 @@ */ #include +#include #include "pbd/signals.h" @@ -75,7 +76,7 @@ private: double _last_tick; class Position; - Position* _pos; + boost::scoped_ptr _pos; double one_ppqn_in_frames (framepos_t transport_position); diff --git a/libs/ardour/ticker.cc b/libs/ardour/ticker.cc index c74f40c78e..9f58a9cd88 100644 --- a/libs/ardour/ticker.cc +++ b/libs/ardour/ticker.cc @@ -58,26 +58,27 @@ public: if (frame != fr) { frame = fr; + didit = true; + } - s->bbt_time (this->frame, *this); + /* Midi beats and clocks always gets updated for now */ - const TempoMap& tempo = s->tempo_map(); + s->bbt_time (this->frame, *this); - const double divisions = tempo.meter_at(frame).divisions_per_bar(); - const double divisor = tempo.meter_at(frame).note_divisor(); - const double qnote_scale = divisor * 0.25f; + const TempoMap& tempo = s->tempo_map(); - /* Midi Beats in terms of Song Position Pointer is equivalent to total - sixteenth notes at 'time' */ + const double divisions = tempo.meter_at(frame).divisions_per_bar(); + const double divisor = tempo.meter_at(frame).note_divisor(); + const double qnote_scale = divisor * 0.25f; - midi_beats = (((bars - 1) * divisions) + beats - 1); - midi_beats += (double)ticks / (double)Position::ticks_per_beat * qnote_scale; - midi_beats *= 16.0f / divisor; + /** Midi Beats in terms of Song Position Pointer is equivalent to total + sixteenth notes at 'time' */ - midi_clocks = midi_beats * 6.0f; + midi_beats = (((bars - 1) * divisions) + beats - 1); + midi_beats += (double)ticks / (double)Position::ticks_per_beat * qnote_scale; + midi_beats *= 16.0f / divisor; - didit = true; - } + midi_clocks = midi_beats * 6.0f; return didit; } @@ -98,16 +99,13 @@ MidiClockTicker::MidiClockTicker () , _ppqn (24) , _last_tick (0.0) { - _pos = new Position(); + _pos.reset (new Position()); } MidiClockTicker::~MidiClockTicker() { _midi_port = 0; - if (_pos) { - delete _pos; - _pos = 0; - } + _pos.reset (0); } void @@ -126,8 +124,6 @@ MidiClockTicker::set_session (Session* s) } } -static bool need_reset = false; - void MidiClockTicker::session_located() { @@ -138,13 +134,33 @@ MidiClockTicker::session_located() } _last_tick = _pos->frame; - need_reset = true; - if (_pos->speed == 0.0f && Config->get_send_midi_clock()) { - uint32_t where = std::floor (_pos->midi_beats); - send_position_event (where, 0); + if (!Config->get_send_midi_clock()) { return; } + + if (_pos->speed == 0.0f) { + uint32_t where = llrint (_pos->midi_beats); + send_position_event (where, 0); + } else if (_pos->speed == 1.0f) { +#if 1 + /* Experimental. To really do this and have accuracy, the + stop/locate/continue sequence would need queued to send immediately + before the next midi clock. */ + + send_stop_event (0); + + if (_pos->frame == 0) { + send_start_event (0); + } else { + uint32_t where = llrint (_pos->midi_beats); + send_position_event (where, 0); + send_continue_event (0); + } +#endif + } else { + /* Varispeed not supported */ + } } void @@ -209,7 +225,7 @@ MidiClockTicker::transport_state_changed() } else if (_pos->speed == 0.0f) { send_stop_event (0); - send_position_event (std::floor (_pos->midi_beats), 0); + send_position_event (llrint (_pos->midi_beats), 0); } // tick (_pos->frame); @@ -254,41 +270,45 @@ MidiClockTicker::transport_looped() } void -MidiClockTicker::tick (const framepos_t& transport_frame) +MidiClockTicker::tick (const framepos_t& /* transport_frame */) { if (!Config->get_send_midi_clock() || _session == 0 || _session->transport_speed() != 1.0f || _midi_port == 0) { return; } + MIDI::JackMIDIPort* mp = dynamic_cast (_midi_port); + if (! mp) { + return; + } + + const framepos_t end = _pos->frame + mp->nframes_this_cycle(); double iter = _last_tick; - double clock_delta = one_ppqn_in_frames (transport_frame); while (true) { - double next_tick = iter + clock_delta; - frameoffset_t next_tick_offset = llrint (next_tick) - transport_frame; - - MIDI::JackMIDIPort* mp = dynamic_cast (_midi_port); - - DEBUG_TRACE (PBD::DEBUG::MidiClock, - string_compose ("Transport: %1, last tick time: %2, next tick time: %3, offset: %4, cycle length: %5\n", - transport_frame, _last_tick, next_tick, next_tick_offset, mp ? mp->nframes_this_cycle() : 0)); + double clock_delta = one_ppqn_in_frames (llrint (iter)); + double next_tick = iter + clock_delta; + frameoffset_t next_tick_offset = llrint (next_tick) - end; + DEBUG_TRACE (DEBUG::MidiClock, + string_compose ("Tick: iter: %1, last tick time: %2, next tick time: %3, offset: %4, cycle length: %5\n", + iter, _last_tick, next_tick, next_tick_offset, mp ? mp->nframes_this_cycle() : 0)); if (!mp || (next_tick_offset >= mp->nframes_this_cycle())) { - return; + break; } if (next_tick_offset >= 0) { send_midi_clock_event (next_tick_offset); - _last_tick += clock_delta; } iter = next_tick; } - _pos->frame = _last_tick; + _last_tick = iter; + _pos->frame = end; } + double MidiClockTicker::one_ppqn_in_frames (framepos_t transport_position) { -- cgit v1.2.3 From 7ad81b7b4f85df26a0313659a6a7a6c1b02204e4 Mon Sep 17 00:00:00 2001 From: Michael Fisher Date: Thu, 1 Aug 2013 13:54:58 -0500 Subject: Make Session::send_song_position_pointer a no-op --- libs/ardour/session_midi.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libs/ardour') diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index bc7e12a729..d137e5167c 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -591,7 +591,7 @@ void Session::send_song_position_pointer (framepos_t t) { if (midi_clock) { - midi_clock->position_changed (t); + /* Do nothing for the moment */ } } -- cgit v1.2.3 From 5143a42b3162ed631e225e1c7c6eb0af8156d87b Mon Sep 17 00:00:00 2001 From: Michael Fisher Date: Thu, 1 Aug 2013 14:14:01 -0500 Subject: Midi clock housekeeping --- libs/ardour/ticker.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'libs/ardour') diff --git a/libs/ardour/ticker.cc b/libs/ardour/ticker.cc index 9f58a9cd88..0a4081bec7 100644 --- a/libs/ardour/ticker.cc +++ b/libs/ardour/ticker.cc @@ -193,7 +193,7 @@ MidiClockTicker::transport_state_changed() return; } - DEBUG_TRACE (PBD::DEBUG::MidiClock, + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Transport state change @ %4, speed: %1 position: %2 play loop: %3\n", _pos->speed, _pos->frame, _session->get_play_loop(), _pos->frame) ); @@ -236,7 +236,7 @@ MidiClockTicker::position_changed (framepos_t) { #if 0 const double speed = _session->transport_speed(); - DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Transport Position Change: %1, speed: %2\n", position, speed)); + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Transport Position Change: %1, speed: %2\n", position, speed)); if (speed == 0.0f && Config->get_send_midi_clock()) { send_position_event (position, 0); @@ -252,7 +252,7 @@ MidiClockTicker::transport_looped() Location* loop_location = _session->locations()->auto_loop_location(); assert(loop_location); - DEBUG_TRACE (PBD::DEBUG::MidiClock, + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Transport looped, position: %1, loop start: %2, loop end: %3, play loop: %4\n", _session->transport_frame(), loop_location->start(), loop_location->end(), _session->get_play_loop()) ); @@ -328,7 +328,7 @@ MidiClockTicker::send_midi_clock_event (pframes_t offset) return; } - // DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Tick with offset %1\n", offset)); + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Tick with offset %1\n", offset)); static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_CLOCK }; _midi_port->write (_midi_clock_tick, 1, offset); @@ -341,7 +341,7 @@ MidiClockTicker::send_start_event (pframes_t offset) return; } - DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Start %1\n", _last_tick)); + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Start %1\n", _last_tick)); static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_START }; _midi_port->write (_midi_clock_tick, 1, offset); @@ -354,7 +354,7 @@ MidiClockTicker::send_continue_event (pframes_t offset) return; } - DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Continue %1\n", _last_tick)); + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Continue %1\n", _last_tick)); static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_CONTINUE }; _midi_port->write (_midi_clock_tick, 1, offset); @@ -367,7 +367,7 @@ MidiClockTicker::send_stop_event (pframes_t offset) return; } - DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Stop %1\n", _last_tick)); + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Stop %1\n", _last_tick)); static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_STOP }; _midi_port->write (_midi_clock_tick, 1, offset); @@ -394,5 +394,5 @@ MidiClockTicker::send_position_event (uint32_t midi_beats, pframes_t offset) _midi_port->midimsg (msg, sizeof (msg), offset); - DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Song Position Sent: %1\n", midi_beats)); + DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Song Position Sent: %1\n", midi_beats)); } -- cgit v1.2.3 From 94f366190e044462bd907de2d96f0d34b275b080 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 2 Aug 2013 12:50:52 -0400 Subject: fix typos in display of error message about an LV2 plugin preset --- libs/ardour/lv2_plugin.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libs/ardour') diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index c56b3ffc2f..bfa593aea3 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -970,7 +970,7 @@ LV2Plugin::find_presets() lilv_node_as_string(name)))); } else { warning << string_compose( - _("Plugin \"%1\% preset \"%2%\" is missing a label\n"), + _("Plugin \"%1\" preset \"%2\" is missing a label\n"), lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)), lilv_node_as_string(preset)) << endmsg; } -- cgit v1.2.3