AudioProcessorValueTreeStateを使ったパラメータ管理 独自リスナー実装編

AudioProcessorValueTreeStateを使ってパラメータ管理が楽になった!最高!てな感じなんですが、パラメータの変更に連動して別の処理を呼びたい/値を変更したい場合があると思います。AudioProcessor::setParameterだとProcessor側のパラメータに値を設定するついでに好きな処理を書いておけば済む話ですが、AudioProcessorValueTreeStateでは?

AudioProcessorValueTreeStateは独自にリスナーを追加できるので実装します。

まずリスナーを定義。
AudioProcessorValueTreeState::Listenerを継承してparameterChangeをオーバーライドします。

// Processorの処理や値にアクセスするという想定でインナークラスを定義
class TestAudioProcessor  : public AudioProcessor
{
/* 中略 */
private:
    struct TestParameterListener : AudioProcessorValueTreeState::Listener
    {
    public:
        TestParameterListener(TestAudioProcessor& p);
        void parameterChanged(const String& parameterID, float newValue) override;
    private:
        TestAudioProcessor& _p;
    }
/* 中略 */
}

実装

// コンストラクタでアウタークラスのインスタンスをもらう
TestAudioProcessor::TestParameterListener::TestParameterListener(TestAudioProcessor & p)
    :_p(p)
{
}

// testMethodの呼び出し
void TestAudioProcessor::TestParameterListener::parameterChanged(const String & parameterID, float newValue)
{
    _p.testMethod(newValue);
}

Processorのコンストラクタとかで)AudioProcessorValueTreeStateのインスタンスにリスナーを追加します。

parameters.addParameterListener("test", new TestParameterListener(*this));

これでtestパラメータに連動して独自に定義したTestParameterListenerが呼び出されます。
やったね。