#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, const char* name, Group& group)
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
+ msg << ((transport_is_rolling && metering_active) ? 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", raw_id(), dB));
+ // DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Meter ID %1 dB %2\n", id(), dB));
if (dB < -70.0f) {
def = 0.0f;
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));
}
}
int segment = lrintf ((def/115.0) * 13.0);
- if (last_segment_value_sent != segment) {
- last_segment_value_sent = segment;
- msg << MidiByteArray (2, 0xD0, (raw_id()<<4) | segment);
- }
+ surface.write (MidiByteArray (2, 0xd0, (id()<<4) | segment));
+}
- return msg;
+MidiByteArray
+Meter::zero ()
+{
+ return MidiByteArray (2, 0xD0, (id()<<4 | 0));
}