X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fsurfaces%2Fmackie%2Fsurface.cc;h=c9880f9bc94029ea84570a3e5381ff47fa736654;hb=e52c8e376a068c11a9a771a15977a65c067c71e6;hp=079d057d43ee7c7613730bafb99c06f0146ab076;hpb=d3738b087ef1698d45e140114feb8fca4d31e42f;p=ardour.git diff --git a/libs/surfaces/mackie/surface.cc b/libs/surfaces/mackie/surface.cc old mode 100644 new mode 100755 index 079d057d43..c9880f9bc9 --- a/libs/surfaces/mackie/surface.cc +++ b/libs/surfaces/mackie/surface.cc @@ -84,6 +84,15 @@ static MidiByteArray mackie_sysex_hdr (5, MIDI::sysex, 0x0, 0x0, 0x66, 0x14); // the device type static MidiByteArray mackie_sysex_hdr_xt (5, MIDI::sysex, 0x0, 0x0, 0x66, 0x15); +//QCON +// The MCU sysex header for QCon Control surface +static MidiByteArray mackie_sysex_hdr_qcon (5, MIDI::sysex, 0x0, 0x0, 0x66, 0x14); + +// The MCU sysex header for QCon Control - extender +// The extender differs from Mackie by 4th bit - it's same like for main control surface (for display) +static MidiByteArray mackie_sysex_hdr_xt_qcon (5, MIDI::sysex, 0x0, 0x0, 0x66, 0x14); + + static MidiByteArray empty_midi_byte_array; Surface::Surface (MackieControlProtocol& mcp, const std::string& device_name, uint32_t number, surface_type_t stype) @@ -97,6 +106,7 @@ Surface::Surface (MackieControlProtocol& mcp, const std::string& device_name, ui , _master_fader (0) , _last_master_gain_written (-0.0f) , connection_state (0) + , is_qcon (false) , input_source (0) { DEBUG_TRACE (DEBUG::MackieControl, "Surface::Surface init\n"); @@ -107,6 +117,13 @@ Surface::Surface (MackieControlProtocol& mcp, const std::string& device_name, ui throw failed_constructor (); } + //Store Qcon flag + if( mcp.device_info().is_qcon() ) { + is_qcon = true; + } else { + is_qcon = false; + } + /* only the first Surface object has global controls */ /* lets use master_position instead */ uint32_t mp = _mcp.device_info().master_position(); @@ -287,8 +304,18 @@ const MidiByteArray& Surface::sysex_hdr() const { switch (_stype) { - case mcu: return mackie_sysex_hdr; - case ext: return mackie_sysex_hdr_xt; + case mcu: + if (_mcp.device_info().is_qcon()) { + return mackie_sysex_hdr_qcon; + } else { + return mackie_sysex_hdr; + } + case ext: + if(_mcp.device_info().is_qcon()) { + return mackie_sysex_hdr_xt_qcon; + } else { + return mackie_sysex_hdr_xt; + } } cout << "SurfacePort::sysex_hdr _port_type not known" << endl; return mackie_sysex_hdr; @@ -682,9 +709,18 @@ Surface::handle_midi_sysex (MIDI::Parser &, MIDI::byte * raw_bytes, size_t count */ if (_stype == mcu) { - mackie_sysex_hdr[4] = bytes[4]; + if (_mcp.device_info().is_qcon()) { + mackie_sysex_hdr_qcon[4] = bytes[4]; + } else { + mackie_sysex_hdr[4] = bytes[4]; + } + } else { - mackie_sysex_hdr_xt[4] = bytes[4]; + if (_mcp.device_info().is_qcon()) { + mackie_sysex_hdr_xt_qcon[4] = bytes[4]; + } else { + mackie_sysex_hdr_xt[4] = bytes[4]; + } } switch (bytes[5]) { @@ -1016,6 +1052,8 @@ Surface::show_two_char_display (unsigned int value, const std::string & /*dots*/ void Surface::display_timecode (const std::string & timecode, const std::string & last_timecode) { + //TODO: Fix for Qcon to correct timecode value if is over 1000 bars + if (!_active || !_mcp.device_info().has_timecode_display()) { return; } @@ -1260,18 +1298,20 @@ Surface::set_touch_sensitivity (int sensitivity) /* sensitivity already clamped by caller */ - if (_port) { - MidiByteArray msg; + if( !is_qcon ) { // Qcon doesn't support fader sensitivity + if (_port) { + MidiByteArray msg; - msg << sysex_hdr (); - msg << 0x0e; - msg << 0xff; /* overwritten for each fader below */ - msg << (sensitivity & 0x7f); - msg << MIDI::eox; + msg << sysex_hdr (); + msg << 0x0e; + msg << 0xff; /* overwritten for each fader below */ + msg << (sensitivity & 0x7f); + msg << MIDI::eox; - for (int fader = 0; fader < 9; ++fader) { - msg[6] = fader; - _port->write (msg); + for (int fader = 0; fader < 9; ++fader) { + msg[6] = fader; + _port->write (msg); + } } } }