カテゴリー
C++ JUCE

JUCE Forwarding MouseEvent

Child ComponentがParent Componentのエリアを全て覆ってしまっている場合、Parent ComponentのMouseEventが実行されませんが、以下のようにoverrideすると実行されるようになります。

class ForwardingLabel  : public juce::Label
{
public:
  ForwardingLabel()
  {

  }
  
  void mouseDown(const juce::MouseEvent &event) override {
    if(auto parent = getParentComponent()) {
      parent->mouseDown(event);
    }
  }
  
  void mouseExit(const juce::MouseEvent &event) override {
    if(auto parent = getParentComponent()) {
      parent->mouseExit(event);
    }
  }

private:
  JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ForwardingLabel)
};
カテゴリー
C++ JUCE

JUCE APVTS Parameter

JUCEのAudioProcessorValueTreeStateのパラメターを使う場合、以下のようなシナリオがあると思います。

  1. パラメターをゲットして、値をget/setする場合
auto param = valueTreeState.getParameterAsValue(ParamId);
// getting value
int paramValue = param.getValue();
// setting value
param.setValue(juce::var(newValue));

2. パラメターのリアルタイム値をゲットしたい場合

int value = (int)*valueTreeState.getRawParameterValue(ParamId);

Host(DAW)に保存されているパラメターをPlug-In再起動時に読み込む場合などは、getRawParameterValueを使わないといけないようです。

カテゴリー
C++ JUCE

JUCE ThreadID

JUCEでThreadIDを確認するには以下の方法があります。

// get threadID
void* currentThreadId = juce::Thread::getCurrentThreadId();
DBG("setSelectorId thread ID: " + juce::String(reinterpret_cast<uintptr_t>(currentThreadId)));

// check if the thread is the Message Thread
bool isMessageThread = juce::MessageManager::getInstance()->isThisTheMessageThread();
DBG("Is this message thread? " + juce::String(isMessageThread ? "YES" : "NO"));
カテゴリー
C++ JUCE

JUCE ComboBoxの操作を区別する

ComboBoxの操作において、プログラム的に操作をする場合とユーザーが手動で操作をする場合において、異なるcallback処理をしたい場合は、以下のようにCustomComboBoxクラスのmouseDown()をoverrideするといいと思います。

class CustomComboBox  : public juce::ComboBox
{
public:
  CustomComboBox() : juce::ComboBox()
  {

  }

  ~CustomComboBox() override
  {
  }

  void mouseDown(const juce::MouseEvent &event) override {
    DBG("Mouse down");
    userInteracted = true;
    juce::ComboBox::mouseDown(event);
  }
  
  bool getUserInteracted() const {
    return userInteracted;
  }
  
  void setUserInteractedToFalse() {
    userInteracted = false;
  }
  
private:
  bool userInteracted = false;
  JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CustomComboBox)
};
void comboBoxChanged(juce::ComboBox *comboBoxThatHasChanged) override {
  if (comboBoxThatHasChanged == &selector) {
    if(selector.getUserInteracted()) {
      DBG("user selected ...");
      // do something
      selector.setUserInteractedToFalse();
    } else {
      DBG("program selected ...");
      // do something
    }
  }
}