globally remove all trailing whitespace from ardour code base.
[ardour.git] / libs / surfaces / mackie / meter.cc
index a6aea1f6ed231441d50962d0e8403b02895bba15..91de8d6ef69899074ea785c9c71848577a18357d 100644 (file)
 
 #include <cmath>
 
+#include "pbd/compose.h"
+#include "ardour/debug.h"
+
 #include "meter.h"
 #include "surface.h"
 #include "surface_port.h"
 #include "control_group.h"
 
+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
+       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", id(), dB));
        
        if (dB < -70.0f) {
                def = 0.0f;
@@ -69,12 +99,13 @@ Meter::update_message (float dB)
        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));
                }
        }
        
@@ -82,11 +113,11 @@ Meter::update_message (float dB)
 
        int segment = lrintf ((def/115.0) * 13.0);
        
-       if (last_segment_value_sent != segment) {
-               last_segment_value_sent = segment;
-               std::cerr << "Meter ID " << raw_id() << " as byte " << (((int) raw_id() << 4) | segment) << std::endl;
-               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));
 }