X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fsurfaces%2Fmackie%2Fmeter.cc;h=16ba40de291f6a28d6cc8c2d9b38c1cd7390c781;hb=4b70a0aa0d5e0c289755b9e3c8f99ed487454ef3;hp=6617c1aa8ca3ffcdd5979fc2a1fa80280fa5e222;hpb=e3448f267e98bdfa849d0becd90b47d277526525;p=ardour.git diff --git a/libs/surfaces/mackie/meter.cc b/libs/surfaces/mackie/meter.cc index 6617c1aa8c..16ba40de29 100644 --- a/libs/surfaces/mackie/meter.cc +++ b/libs/surfaces/mackie/meter.cc @@ -27,24 +27,51 @@ #include "surface_port.h" #include "control_group.h" -using namespace Mackie; using namespace PBD; +using namespace ArdourSurface; +using namespace Mackie; Control* -Meter::factory (Surface& surface, int id, int ordinal, const char* name, Group& group) +Meter::factory (Surface& surface, int id, const char* name, Group& group) { - Meter* m = new Meter (id, ordinal, name, group); + Meter* m = new Meter (id, name, group); surface.meters[id] = m; surface.controls.push_back (m); group.add (*m); return m; } -MidiByteArray -Meter::update_message (float dB) +void +Meter::notify_metering_state_changed(Surface& surface, bool transport_is_rolling, bool metering_active) +{ + MidiByteArray msg; + + // sysex header + msg << surface.sysex_hdr(); + + // code for Channel Meter Enable Message + msg << 0x20; + + // Channel identification + msg << id(); + + // Enable (0x07) / Disable (0x00) level meter on LCD, peak hold display on horizontal meter and signal LED + _enabled = (transport_is_rolling && metering_active); + msg << (_enabled ? 0x07 : 0x00); + + // sysex trailer + msg << MIDI::eox; + + surface.write (msg); +} + +void +Meter::send_update (Surface& surface, float dB) { float def = 0.0f; /* Meter deflection %age */ - + + // DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Meter ID %1 dB %2\n", id(), dB)); + if (dB < -70.0f) { def = 0.0f; } else if (dB < -60.0f) { @@ -62,37 +89,36 @@ Meter::update_message (float dB) } else { def = 115.0f; } - + /* 115 is the deflection %age that would be when dB=6.0. this is an arbitrary endpoint for our scaling. */ MidiByteArray msg; - + if (def > 100.0f) { if (!overload_on) { overload_on = true; - msg << MidiByteArray (2, 0xd0, (raw_id() << 4) | 0xe); + surface.write (MidiByteArray (2, 0xd0, (id() << 4) | 0xe)); + } } else { if (overload_on) { overload_on = false; - msg << MidiByteArray (2, 0xd0, (raw_id() << 4) | 0xf); + surface.write (MidiByteArray (2, 0xd0, (id() << 4) | 0xf)); } } - + /* we can use up to 13 segments */ int segment = lrintf ((def/115.0) * 13.0); - - if (last_segment_value_sent != segment) { - last_segment_value_sent = segment; - DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Meter ID %1 to use segment %2\n", raw_id(), segment)); - msg << MidiByteArray (2, 0xD0, (raw_id()<<4) | segment); - } else { - DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Meter ID %1 not sent (same as last)\n", raw_id())); - } - return msg; + surface.write (MidiByteArray (2, 0xd0, (id()<<4) | segment)); +} + +MidiByteArray +Meter::zero () +{ + return MidiByteArray (2, 0xD0, (id()<<4 | 0)); }