From 42ec2a9e27c7669db7e5350fdc1c78ac4849aaea Mon Sep 17 00:00:00 2001 From: Adrien Tisseraud Date: Sat, 10 Feb 2018 12:49:09 +0100 Subject: [PATCH 1/2] Refactor KKS base class, remove templated numKeys --- inc/cabl/devices/Device.h | 2 + src/devices/ni/KompleteKontrol.cpp | 26 +++++++++- src/devices/ni/KompleteKontrol.h | 79 +++++++++++++++++++----------- 3 files changed, 76 insertions(+), 31 deletions(-) diff --git a/inc/cabl/devices/Device.h b/inc/cabl/devices/Device.h index 549a251..9b5877e 100644 --- a/inc/cabl/devices/Device.h +++ b/inc/cabl/devices/Device.h @@ -237,6 +237,8 @@ class Device virtual size_t numOfLedArrays() const = 0; + virtual size_t currentOctave() const { return 0; } + virtual void setButtonLed(Button, const Color&); virtual void setKeyLed(unsigned, const Color&); diff --git a/src/devices/ni/KompleteKontrol.cpp b/src/devices/ni/KompleteKontrol.cpp index 69caa6e..5ed8030 100644 --- a/src/devices/ni/KompleteKontrol.cpp +++ b/src/devices/ni/KompleteKontrol.cpp @@ -22,6 +22,23 @@ const uint8_t kKK_ledsDataSize = 25; const uint8_t kKK_epOut = 0x02; const uint8_t kKK_epInput = 0x84; + +size_t getInitialOctave(const sl::cabl::KompleteKontrolBase::NUM_KEYS numKeys) +{ + using namespace sl::cabl; + + switch (numKeys) + { + case KompleteKontrolBase::KEYS_25: + return 48; + case KompleteKontrolBase::KEYS_49: + case KompleteKontrolBase::KEYS_61: + return 36; + default: + return 21; + } +} + } // namespace //-------------------------------------------------------------------------------------------------- @@ -243,9 +260,13 @@ enum class KompleteKontrolBase::Button : uint8_t //-------------------------------------------------------------------------------------------------- -KompleteKontrolBase::KompleteKontrolBase() - : m_isDirtyLeds(true) +KompleteKontrolBase::KompleteKontrolBase(const NUM_KEYS numKeys) + : m_numKeys(static_cast(numKeys)) + , m_ledsKeysSize(m_numKeys * 3U) + , m_ledsKeys(new uint8_t[m_ledsKeysSize]) + , m_isDirtyLeds(true) , m_isDirtyKeyLeds(true) + , m_firstOctave(getInitialOctave(numKeys)) #if defined(_WIN32) || defined(__APPLE__) || defined(__linux) , m_pMidiOut(new RtMidiOut) , m_pMidiIn(new RtMidiIn) @@ -311,6 +332,7 @@ KompleteKontrolBase::KompleteKontrolBase() KompleteKontrolBase::~KompleteKontrolBase() { + delete[] m_ledsKeys; #if defined(_WIN32) || defined(__APPLE__) || defined(__linux) m_pMidiOut->closePort(); m_pMidiIn->closePort(); diff --git a/src/devices/ni/KompleteKontrol.h b/src/devices/ni/KompleteKontrol.h index 87c1904..9359b3f 100644 --- a/src/devices/ni/KompleteKontrol.h +++ b/src/devices/ni/KompleteKontrol.h @@ -26,7 +26,16 @@ class KompleteKontrolBase : public Device { public: - KompleteKontrolBase(); + + enum NUM_KEYS + { + KEYS_25 = 25, + KEYS_49 = 49, + KEYS_61 = 61, + KEYS_88 = 88 + }; + + KompleteKontrolBase(NUM_KEYS numKeys); ~KompleteKontrolBase() override; void setButtonLed(Device::Button, const Color&) override; @@ -36,6 +45,11 @@ class KompleteKontrolBase : public Device TextDisplay* textDisplay(size_t displayIndex_) override; + unsigned numKeys() const + { + return m_numKeys; + } + size_t numOfGraphicDisplays() const override { return 0; @@ -56,6 +70,21 @@ class KompleteKontrolBase : public Device return 0; } + size_t currentOctave() const override + { + return m_firstOctave; + } + + unsigned ledDataSize() const + { + return m_ledsKeysSize; + } + + uint8_t* ledsKeysData() + { + return &m_ledsKeys[0]; + } + bool tick() override; private: @@ -83,17 +112,16 @@ class KompleteKontrolBase : public Device bool isButtonPressed(Button button) const noexcept; bool isButtonPressed(const Transfer&, Button button_) const noexcept; - virtual unsigned numKeys() const = 0; - virtual unsigned ledDataSize() const = 0; - virtual uint8_t* ledsKeysData() = 0; - static void midiInCallback(double timeStamp, std::vector* message, void* userData); NullCanvas m_displayDummy; tRawData m_leds; tRawData m_buttons; std::bitset m_buttonStates; + unsigned m_numKeys; unsigned m_encoderValues[kKK_nEncoders]; + unsigned m_ledsKeysSize; + uint8_t* m_ledsKeys; bool m_isDirtyLeds; bool m_isDirtyKeyLeds; @@ -110,36 +138,29 @@ class KompleteKontrolBase : public Device //-------------------------------------------------------------------------------------------------- -template -class KompleteKontrol final : public KompleteKontrolBase +class KompleteKontrolS25 final : public KompleteKontrolBase { public: - static constexpr unsigned kKK_keysLedDataSize = NKEYS * 3U; - - unsigned numKeys() const override - { - return NKEYS; - } - unsigned ledDataSize() const override - { - return kKK_keysLedDataSize; - } - -private: - uint8_t* ledsKeysData() override - { - return &m_ledsKeys[0]; - } + KompleteKontrolS25() : KompleteKontrolBase(KEYS_25) {} +}; - uint8_t m_ledsKeys[kKK_keysLedDataSize]; +class KompleteKontrolS49 final : public KompleteKontrolBase +{ +public: + KompleteKontrolS49() : KompleteKontrolBase(KEYS_49) {} }; -//-------------------------------------------------------------------------------------------------- +class KompleteKontrolS61 final : public KompleteKontrolBase +{ +public: + KompleteKontrolS61() : KompleteKontrolBase(KEYS_61) {} +}; -using KompleteKontrolS25 = KompleteKontrol<25>; -using KompleteKontrolS49 = KompleteKontrol<49>; -using KompleteKontrolS61 = KompleteKontrol<61>; -using KompleteKontrolS88 = KompleteKontrol<88>; +class KompleteKontrolS88 final : public KompleteKontrolBase +{ +public: + KompleteKontrolS88() : KompleteKontrolBase(KEYS_88) {} +}; //-------------------------------------------------------------------------------------------------- From 69f6c278e8e8d7d3a7d7a32b16bfcc18dd8fa73e Mon Sep 17 00:00:00 2001 From: Adrien Tisseraud Date: Tue, 19 Jun 2018 15:12:23 +0200 Subject: [PATCH 2/2] Restore previous architecture and use template specialization to get the default octave --- src/devices/ni/KompleteKontrol.cpp | 60 ++++++++++++++--------- src/devices/ni/KompleteKontrol.h | 78 ++++++++++++++---------------- 2 files changed, 71 insertions(+), 67 deletions(-) diff --git a/src/devices/ni/KompleteKontrol.cpp b/src/devices/ni/KompleteKontrol.cpp index 5ed8030..7932c2c 100644 --- a/src/devices/ni/KompleteKontrol.cpp +++ b/src/devices/ni/KompleteKontrol.cpp @@ -22,23 +22,6 @@ const uint8_t kKK_ledsDataSize = 25; const uint8_t kKK_epOut = 0x02; const uint8_t kKK_epInput = 0x84; - -size_t getInitialOctave(const sl::cabl::KompleteKontrolBase::NUM_KEYS numKeys) -{ - using namespace sl::cabl; - - switch (numKeys) - { - case KompleteKontrolBase::KEYS_25: - return 48; - case KompleteKontrolBase::KEYS_49: - case KompleteKontrolBase::KEYS_61: - return 36; - default: - return 21; - } -} - } // namespace //-------------------------------------------------------------------------------------------------- @@ -260,13 +243,10 @@ enum class KompleteKontrolBase::Button : uint8_t //-------------------------------------------------------------------------------------------------- -KompleteKontrolBase::KompleteKontrolBase(const NUM_KEYS numKeys) - : m_numKeys(static_cast(numKeys)) - , m_ledsKeysSize(m_numKeys * 3U) - , m_ledsKeys(new uint8_t[m_ledsKeysSize]) - , m_isDirtyLeds(true) +KompleteKontrolBase::KompleteKontrolBase() + : m_isDirtyLeds(true) , m_isDirtyKeyLeds(true) - , m_firstOctave(getInitialOctave(numKeys)) + , m_hasValidOctave(false) #if defined(_WIN32) || defined(__APPLE__) || defined(__linux) , m_pMidiOut(new RtMidiOut) , m_pMidiIn(new RtMidiIn) @@ -332,7 +312,6 @@ KompleteKontrolBase::KompleteKontrolBase(const NUM_KEYS numKeys) KompleteKontrolBase::~KompleteKontrolBase() { - delete[] m_ledsKeys; #if defined(_WIN32) || defined(__APPLE__) || defined(__linux) m_pMidiOut->closePort(); m_pMidiIn->closePort(); @@ -537,6 +516,7 @@ void KompleteKontrolBase::processButtons(const Transfer& input_) } m_firstOctave = input_.data()[37]; + m_hasValidOctave = true; } //-------------------------------------------------------------------------------------------------- @@ -714,5 +694,37 @@ void KompleteKontrolBase::midiInCallback( //-------------------------------------------------------------------------------------------------- +template <> +size_t KompleteKontrolS25::defaultOctave() const +{ + return 48; +} + +//-------------------------------------------------------------------------------------------------- + +template <> +size_t KompleteKontrolS49::defaultOctave() const +{ + return 36; +} + +//-------------------------------------------------------------------------------------------------- + +template <> +size_t KompleteKontrolS61::defaultOctave() const +{ + return 36; +} + +//-------------------------------------------------------------------------------------------------- + +template <> +size_t KompleteKontrolS88::defaultOctave() const +{ + return 21; +} + +//-------------------------------------------------------------------------------------------------- + } // namespace cabl } // namespace sl diff --git a/src/devices/ni/KompleteKontrol.h b/src/devices/ni/KompleteKontrol.h index 9359b3f..3a2b967 100644 --- a/src/devices/ni/KompleteKontrol.h +++ b/src/devices/ni/KompleteKontrol.h @@ -26,16 +26,7 @@ class KompleteKontrolBase : public Device { public: - - enum NUM_KEYS - { - KEYS_25 = 25, - KEYS_49 = 49, - KEYS_61 = 61, - KEYS_88 = 88 - }; - - KompleteKontrolBase(NUM_KEYS numKeys); + KompleteKontrolBase(); ~KompleteKontrolBase() override; void setButtonLed(Device::Button, const Color&) override; @@ -45,11 +36,6 @@ class KompleteKontrolBase : public Device TextDisplay* textDisplay(size_t displayIndex_) override; - unsigned numKeys() const - { - return m_numKeys; - } - size_t numOfGraphicDisplays() const override { return 0; @@ -72,17 +58,12 @@ class KompleteKontrolBase : public Device size_t currentOctave() const override { - return m_firstOctave; - } - - unsigned ledDataSize() const - { - return m_ledsKeysSize; + return m_hasValidOctave ? m_firstOctave : defaultOctave(); } - uint8_t* ledsKeysData() + virtual size_t defaultOctave() const { - return &m_ledsKeys[0]; + assert(false); } bool tick() override; @@ -112,21 +93,23 @@ class KompleteKontrolBase : public Device bool isButtonPressed(Button button) const noexcept; bool isButtonPressed(const Transfer&, Button button_) const noexcept; + virtual unsigned numKeys() const = 0; + virtual unsigned ledDataSize() const = 0; + virtual uint8_t* ledsKeysData() = 0; + static void midiInCallback(double timeStamp, std::vector* message, void* userData); NullCanvas m_displayDummy; tRawData m_leds; tRawData m_buttons; std::bitset m_buttonStates; - unsigned m_numKeys; unsigned m_encoderValues[kKK_nEncoders]; - unsigned m_ledsKeysSize; - uint8_t* m_ledsKeys; bool m_isDirtyLeds; bool m_isDirtyKeyLeds; uint8_t m_firstOctave; + bool m_hasValidOctave; TextDisplayKompleteKontrol m_displays[kKK_nDisplays]; @@ -138,32 +121,41 @@ class KompleteKontrolBase : public Device //-------------------------------------------------------------------------------------------------- -class KompleteKontrolS25 final : public KompleteKontrolBase +template +class KompleteKontrol final : public KompleteKontrolBase { public: - KompleteKontrolS25() : KompleteKontrolBase(KEYS_25) {} -}; + static constexpr unsigned kKK_keysLedDataSize = NKEYS * 3U; -class KompleteKontrolS49 final : public KompleteKontrolBase -{ -public: - KompleteKontrolS49() : KompleteKontrolBase(KEYS_49) {} -}; + unsigned numKeys() const override + { + return NKEYS; + } + unsigned ledDataSize() const override + { + return kKK_keysLedDataSize; + } -class KompleteKontrolS61 final : public KompleteKontrolBase -{ -public: - KompleteKontrolS61() : KompleteKontrolBase(KEYS_61) {} -}; + size_t defaultOctave() const override; -class KompleteKontrolS88 final : public KompleteKontrolBase -{ -public: - KompleteKontrolS88() : KompleteKontrolBase(KEYS_88) {} +private: + uint8_t* ledsKeysData() override + { + return &m_ledsKeys[0]; + } + + uint8_t m_ledsKeys[kKK_keysLedDataSize]; }; //-------------------------------------------------------------------------------------------------- +using KompleteKontrolS25 = KompleteKontrol<25>; +using KompleteKontrolS49 = KompleteKontrol<49>; +using KompleteKontrolS61 = KompleteKontrol<61>; +using KompleteKontrolS88 = KompleteKontrol<88>; + +//-------------------------------------------------------------------------------------------------- + M_REGISTER_DEVICE_CLASS( KompleteKontrolS25, "KOMPLETE KONTROL S25", DeviceDescriptor::Type::HID, 0x17CC, 0x1340); M_REGISTER_DEVICE_CLASS(